【字节码】如何理解构造函数中return指令?

经反编译后的构造函数,其字节码最后一条指令return如何理解?
构造函数没有数值返回类型,也非void返回类型,为何会有一条return指令存在?
这条指令在虚拟机中做了些什么工作?

 

public Test();
  Code:
   0: aload_0
   1: invokespecial #1; //Method java/lang/Object."<init>":()V
   4: return

  LineNumberTable: 
   line 10: 0

 


问题补充
devworks 写道
构造方法返回void

返回void为啥不显式地写在方法定义处.
问题补充
kerrysk 写道
return就是返回函数调用,没什么特殊含义。
这个是构造函数,在你在java内写new时,后面除了一条new指令外,还有个
invokespecial调用这个类的构造函数。
return指的是,pop构造函数frame,回到new指令所在的frame。


哦.
"pop构造函数frame,回到new指令所在的frame。"
确实是return指令的作用,没有特殊含义.

但为什么不显式写在定义处,虚拟机规范要特别采用隐式方式?
问题补充
mercyblitz 写道
yeshaoting 写道
devworks 写道
构造方法返回void

返回void为啥不显式地写在方法定义处.



构造器又不是方法,并且不需要return语句。


不需要return语句,为什么要加return指令...

问题补充
public Test()
{
System.out.println("public Test();");
}

public void Test()
{
System.out.println("public void Test();");
}

void能区分开构造函数与一般方法
问题补充
kerrysk 写道
return就是返回函数调用,没什么特殊含义。
这个是构造函数,在你在java内写new时,后面除了一条new指令外,还有个
invokespecial调用这个类的构造函数。
return指的是,pop构造函数frame,回到new指令所在的frame。


刚又理解了一下,解释得好.
加void与没加void,可能就是为着区分构造函数与一般方法吧.
问题补充
mercyblitz 写道
yeshaoting 写道
mercyblitz 写道
yeshaoting 写道
devworks 写道
构造方法返回void

返回void为啥不显式地写在方法定义处.



构造器又不是方法,并且不需要return语句。


不需要return语句,为什么要加return指令...


必要性和存在性不同,在实现构造器的时候,可以重用方法的部分语法检查!


嗯.对.
问题补充
kerrysk 写道
yeshaoting 写道

加void与没加void,可能就是为着区分构造函数与一般方法吧.

构造函数与一般方法在虚拟机内不是靠这个区分的。
构造函数与一般方法在虚拟机内的方法签名是不一样的,构造函数一般为<init>
一般方法为方法名。
虚拟机根据方法签名,在数据区加载相应的类,构造method结构体,里面有虚拟机指令,
解释器负责解释执行。每个方法调用,都在栈上push一个frame,在方法返回时pop,return是
用来告诉解释器,方法解释完毕,在栈上pop frame。

如果有返回值:
  sun虚拟机会返回到值栈的栈顶,供调用frame用。
  在dalvik下,是有类似return v0这样的指令,把v0放到全局ret变量,再在调用方法中用move_result指令放到调用栈的
寄存器中。
  也可以在设计invoke指令时,就将返回寄存器直接赋值到调用栈的寄存器中。

谢谢你的耐心讲解,最近在看虚拟机规范很多东西还没理解透彻.

5个回答

[quote="yeshaoting"]
加void与没加void,可能就是为着区分构造函数与一般方法吧.[/quote]
构造函数与一般方法在虚拟机内不是靠这个区分的。
构造函数与一般方法在虚拟机内的方法签名是不一样的,构造函数一般为
一般方法为方法名。
虚拟机根据方法签名,在数据区加载相应的类,构造method结构体,里面有虚拟机指令,
解释器负责解释执行。每个方法调用,都在栈上push一个frame,在方法返回时pop,return是
用来告诉解释器,方法解释完毕,在栈上pop frame。

如果有返回值:
sun虚拟机会返回到值栈的栈顶,供调用frame用。
在dalvik下,是有类似return v0这样的指令,把v0放到全局ret变量,再在调用方法中用move_result指令放到调用栈的
寄存器中。
也可以在设计invoke指令时,就将返回寄存器直接赋值到调用栈的寄存器中。

return就是返回函数调用,没什么特殊含义。
这个是构造函数,在你在java内写new时,后面除了一条new指令外,还有个
invokespecial调用这个类的构造函数。
return指的是,pop构造函数frame,回到new指令所在的frame。

构造方法返回void

[quote="yeshaoting"][quote="devworks"]构造方法返回void[/quote]
返回void为啥不显式地写在方法定义处. 8) [/quote]

构造器又不是方法,并且不需要return语句。

[quote="yeshaoting"][quote="mercyblitz"][quote="yeshaoting"][quote="devworks"]构造方法返回void[/quote]
返回void为啥不显式地写在方法定义处. 8) [/quote]

构造器又不是方法,并且不需要return语句。[/quote]

不需要return语句,为什么要加return指令... :cry:
[/quote]

必要性和存在性不同,在实现构造器的时候,可以重用方法的部分语法检查!

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问