构造函数没有返回值是怎么赋值的?

2021-10-06

点击上方 好好学java ,选择 星标 公众号

重磅资讯、干货,第一时间送达

今日推荐:

个人原创100W+访问量博客:

转自:艾小仙

众所周知,在java里是不能给构造函数写返回值的,如果在低版本的编译器定义一个构造器写上返回值可能会报错,高版本里面他就是一个普通的方法。可是如果构造函数没有返回值,那么比如Test t = new Test()我们new一个对象的时候是怎么赋值的呢?


构造函数有返回值吗


写一段代码测试一下:

public class Test {
    public Test() {
       
    }

    public static void main(String[] args) {
        Test t = new Test();
    }
}

反编译一下看看:

 Code:
       0new           #5 // class com/irving/utils/baidu/Test
       3: dup
       4: invokespecial #6 // Method "<init>":()V
       7: astore_1
       8return

从反编译的结果看 4: invokespecial #7  // Method "init":()V,调用构造函数,V代表void无返回值,那么init代表什么含义?

我在书里找到这样一段话:

在 Java 虚拟机层面上,Java 语言中的构造函数是以一个名为init的特殊实例初始化方法的形式出现的,init这个方法名称是由编译器命名的,因为它并非一个合法的 Java 方法名字,不可能通过程序编码的方式实现。实例初始化方法只能在实例的初始化期间,通过 Java 虚拟机的 invokespecial 指令来调用, 只有在实例正在构造的时候,实例初始化方法才可以被调用访问。

一个类或者接口最多可以包含不超过一个类或接口的初始化方法,类或者接口就是通过这个方法完成初始化的。这个方法是一个不包含参数的静态方法,名为clinit。这个名字也是由编译器命名的,因为它并非一个合法的 Java 方法名字,不可能通过程序编码的方式实现。类或接口的初始化方法由 Java 虚拟机自身隐式调用,没有任何虚拟机字节码指令可以调用这个方法,只有在类的初始化阶段中会被虚拟机自身调用。

init代表着虚拟机调用构造函数,现在情况很明显,构造函数返回类型是void,那么它究竟是怎么赋值的呢?


赋值探究


我们明白一点,方法的调用过程就是栈帧入栈和出栈的过程,栈帧随着方法的调用创建,方法结束销毁。栈帧的内部包含局部变量表、操作数栈、动态链接等。

局部变量表表示方法调用时候的参数传递,当一个实例方法被调用的时候,第0个局部变量存储了当前实例方法所在对象的引用(this),后续的其他参数传递至1到N的连续位置。

操作数栈用来准备方法调用的参数和返回结果。

以上面测试代码的方法来看Test t = new Test() 的调用过程:

  1. new 创建Test对象,并将其引用值压入操作数栈顶
  2. dup 复制栈顶数值并将复制值压入栈顶
  3. invokespecial 使用dup复制的引用并用来初始化,此时栈顶应该只有new创建的原始引用
  4. astore_1 将new创建的引用存入局部变量表索引为1的位置
  5. return 方法正常返回

从这个过程我们已经看出来了,整个过程最后我们最终拿到了new之后创建的对象引用,并且保存到局部变量表中,可以供我们继续使用。

推荐文章





原创电子书

历时整整一年总结的 Java 面试 + Java 后端技术学习指南,这是本人这几年及校招的总结,各种高频面试题已经全部进行总结,按照章节复习即可,已经拿到了大厂offer。

原创思维导图

扫码或者微信搜 程序员的技术圈子 回复 面试 领取原创电子书和思维导图。

相关文章

JavaScript 工厂函数 vs 构造函数

2021-10-06
当谈到JavaScript语言与其他编程语言相比时,你可能会听到一些令人困惑东西,其中之一是工厂函数和构造函数.工厂函数所谓工厂...

高考数学MOOK | 构造函数解决高考导数问题

2021-10-06
本文把利用构造函数解决导数问题这类题型进行了总结,如下.一直接作差构造函数 方法总结:在导数问题中,这类题型是最一般的情...

专题003:构造函数(含答案)

2021-10-06
下面资料PDF版在QQ群339444963群文件免费下载!word版联系下面微信(二维码)获取,备注高中word.| 「初高中数学解题研究会...

冲刺高考:构造函数专题

2021-10-06

构造函数 破解大小比较

2021-10-06
构造函数 破解大小比较*广东省广州市第十六中学(510080) 温伙其导数在研究函数中的应用是近年高考命题的一个热点考向.利用导...

四种构造函数法证明不等式

2021-10-06
了解我们点击蓝字,查看详情品数学之“道”——知识总结和题型归纳品数学之“术”——解题策略和思想方法品数学之“用”——教...

每日一题244:构造函数验证二阶导数零点的存在性

2021-10-06
点“考研竞赛数学”↑可每天“涨姿势”哦!题目先自己思考,尝试探索一下解题思路与解题过程,然后再对照下面的答案!更多相关...

构造函数的妙招:小变形 巧处理 小题目 大思想

2021-10-06
构造函数之具有相同极值点的函数初中数学核心组“每日一题”:构造基于特点,探索源于策略构造函数利用导数的性质解决不等式问...

技巧 | 构造函数法证明不等式的六种方法!

2021-10-06
专业的高中数学学习平台每天17:00不见不散打印版获取方式扫描“高中数学”微信公众号二维码聊天框发送“0616”即可获取来源:...

导数问题中构造函数的思路歌

2021-10-06
(函数导数+三角向量+数列不等式+解析几何+立体几何+概率统计)复习大全

随机推荐

JR史密斯点赞美国高尔夫女神Paige

2021-05-12
JR史密斯-1985年9月9日出生于美国新泽西州费里霍尔德,美国职业篮球运动员,司职得分后卫,现为自由球员.佩奇·施皮雷纳克...

声明

2021-04-28
关于南宁地铁6号线建设规划不实消息的声明近日,网络上发布的南宁地铁6号线整条线路规划将于2020年12月1日开工建设,非我公司...

从Objective-C向Swift转换学习到的经验

2020-11-13
SendBird是国外一款针对移动App和网站的Chat API,其开发团队成员Jed Gyeong分享了他们在将产品从Objective-C向Swift转换过程...

终于来了!Moto 360智能手表2代你期待吗?

2020-09-14
由于系统的原因,moto 360 智能手表并没有在国内上市,不过现在moto已经归入联想的门下,第二代moto 360 也顺理成章地应该在国...

漫威英雄们都用过什么手机?一半是国产,看完更期待《复联3》

2019-12-05
《钢铁侠》2008 第一部《钢铁侠》电影中,托尼·史塔克遭受攻击时使用了LG VX9400求助.那时他还没有机械甲. 而在当时...《钢铁侠2》2010 装备是要随着身份的改变升级的,在变身之前经历了第一部的功能机以后,为防止已经成为钢铁侠的史塔克主角身份太low...《复仇者联盟》2012 第一部《复联》电影,黑寡妇在佯装受审时接了个电话,然后轻松地干掉了所有敌人...

Android 入门视频教程 | 原创

2019-07-03
学习地址请移步简书:https://www.jianshu.com/p/cd569bb2e3ef以下是视频目录:第1章 Android初体验1-1&1-2 Android开发概述及开...

LVS负载均衡的三种模式和八种算法总结

2018-07-14
作者:gyl4802959转自:http://bbs.linuxtone.org/thread-7153-1-1.html三种LVS负载均衡模式调度器的实现技术中,IP负载均衡技术是效...

Python入门/爬虫/机器学习等资料汇总—经管世界独家整理

2017-09-29
经管世界经管世界公众号团队独家收集整理Python相关资料.我们将持续整理并完善,最新Python资料请在经管世界公众号回复关键字...

学琴应该怎样尽快记住音乐旋律的?

2017-07-01
拥有绝对音感(看过柯南剧场版12《战栗的乐谱》的同学应该会知道这个概念)的音乐家,其左侧颞平面与掌控左右脑协调的胼胝体都...

学Java,你了解“类”吗

2017-06-16
Java编程语言是面向对象的,处理的最小的完整单元为对象.而现实生活中具有共同特性的对象的抽象就称之为类.类由类声明和类体...