众所周知,不可能将返回值写入Java中的构造函数。

如果在较低版本的编译器中定义构造函数并写入返回值,则可能会报告错误。

在更高版本中,这是一种常用方法。

但是,如果构造函数未返回值,例如Test t = new Test(),那么在新建对象时如何分配值?构造函数是否有返回值?编写一段代码对其进行测试:公共类Test {public Test(){public static void main(String [] args){Test t = new Test();反编译并查看:代码:0:新#5 // com / irving / utils / baidu / Test类3:dup 4:invokespecial#6 //方法“” :()V 7:astore_1 8:返回根据反编译4的结果:invokespecial#7 //方法“ init” :()V,调用构造函数,V表示没有返回值的void,那么init是什么意思?我在书中找到了这段话:在Java虚拟机的级别上,Java语言的构造函数以特殊的实例初始化方法init的形式出现。

初始化方法的名称由编译器命名,因为它不是合法的Java方法名称,并且不能通过程序编码实现。

实例初始化方法只能在实例初始化期间通过Java虚拟机的invokespecial指令来调用。

只有在构造实例时,才能调用和访问实例初始化方法。

一个类或接口最多可以包含一个或多个该类或接口的初始化方法,并且该类或接口是通过此方法初始化的。

此方法是没有参数的静态方法,名为clinit。

该名称也由编译器命名,因为它不是合法的Java方法名称,并且不能通过程序编码实现。

类或接口的初始化方法由Java虚拟机本身隐式调用。

虚拟机字节码指令无法调用此方法,并且只有在类的初始化阶段,虚拟机本身才会调用该方法。

初始化代表调用构造函数的虚拟机。

现在很明显构造函数的返回类型为void,那么如何分配它呢?我们知道方法调用过程是堆栈和弹出堆栈框架的过程。

堆栈框架是通过方法的调用创建的,方法结束并被销毁。

堆栈框架包含局部变量表,操作数堆栈,动态链接等。

局部变量表表示调用方法时的参数传递。

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

操作数堆栈用于准备参数并返回方法调用的结果。

用上面的测试代码方法查看Test t = new Test()的调用过程:new创建一个Test对象,并将其引用值压入操作数堆栈的顶部dup复制堆栈顶部的值并压入将复制的值复制到堆栈的顶部invokespecial use dup复制的引用用于初始化。

目前,堆栈顶部应该只存在由new创建的原始引用astore_1。

将由new创建的引用存储在索引为1的局部变量表中。

return方法正常返回。

从这个过程中,我们看到了整个过程。

最后,我们终于获得了在new之后创建的对象引用,并将其保存在局部变量表中以供我们继续使用。

免责声明:本文内容经21ic授权后发布,版权归原作者所有。

该平台仅提供信息存储服务。

本文仅代表作者的个人观点,并不代表该平台的立场。

如有任何疑问,请与我们联系,谢谢!