Author:zfive5(zhaozidong) Email :[email protected]
元旦时朋友问我XXX操作生成几个String对象--它也在java的面试题里经常出, 我当时用java反编译工具反了一段class代码让他看,的确一切都那么一目了然! (注:以下是我事后重写的代码)
Java:
package zf5;
public class ZF5 {
public ZF5() { }
public static void main(String args[]) { ZF5 ZF51 = new ZF5(); String a = "zfive5"; String a1 = new String("Hello zfive5"); String a2 = a; long a3 = 5L; Long a4 = new Long(1L); } }
bytecode:
package zf5;
public class ZF5 {
public ZF5() { // 0 0:aload_0 // 1 1:invokespecial #1 <Method void Object()> // 2 4:nop // 3 5:return }
public static void main(String args[]) { // 略过 // 0 0:new #2 <Class ZF5> // 1 3:dup // 2 4:invokespecial #3 <Method void ZF5()> // 3 7:astore_1 // 把const pool中的常量4的引用压栈,然后弹出赋值给本地变量2(String a),系统自动生成"zfive5"常量 // 4 8:ldc1 #4 <String "zfive5"> // 5 10:astore_2 // 生成一个string对象,把它引用压栈,然后通过dup指令复制此引用并压入栈顶 // 6 11:new #5 <Class String> // 7 14:dup // 同上ldc1 // 8 15:ldc1 #6 <String "Hello zfive5"> // 此时堆栈中的参数为 refojbect refString, "Hello Zfive5",当调用完invokespecial指令后,string对象初始化成功 // 9 17:invokespecial #7 <Method void String(String)> // 把堆栈中的String对象的引用赋值给本地变量3(String a),可以看出有两string对象参加此时操作 // 10 20:astore_3 // 把本地变量2的引用压入栈,然后通过astore赋值给本地变量4 // 11 21:aload_2 // 12 22:astore 4 // 把const pool中常量8压栈,然后赋值给本地变量5 // 13 24:ldc2w #8 <Long 5L> // 14 27:lstore 5 // 基本同上 注意new了一个对象Long // 15 29:new #10 <Class Long> // 16 32:dup // 17 33:lconst_1 // 18 34:invokespecial #11 <Method void Long(long)> // 19 37:astore 7 // 返回 // 20 39:nop // 21 40:return } } 
|