2 zj8692286 zj8692286 于 2014.11.21 09:19 提问

int i = 1;Integer b = new Integer(1); i==b 为true

基本数据类型存放在栈中,引用也存放在栈中,所以1,i,b应该都在栈中,而b的实例对象在堆中。是否堆中存放实例对象的地址,而实例对象的值任然是栈中的那个1呢?

5个回答

chenssy
chenssy   Rxr 2014.11.21 09:54
已采纳

有个东西叫做自动拆箱!!
你运行这段程序后看看它的字节码就了解是怎么回事了!!

E:>javap -c Test
Warning: Binary file Test contains com.JUtils.base.Test
Compiled from "Test.java"
public class com.JUtils.base.Test {
public com.JUtils.base.Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."":
()V
4: return

public static void main(java.lang.String[]);
Code:
0: iconst_1
1: istore_1
2: new #2 // class java/lang/Integer
5: dup
6: iconst_1
7: invokespecial #3 // Method java/lang/Integer.""
:(I)V
10: astore_2
11: getstatic #4 // Field java/lang/System.out:Ljava/
io/PrintStream;
14: iload_1
15: aload_2
16: invokevirtual #5 // Method java/lang/Integer.intValue ///////重点是这句代码!!!
:()I
19: if_icmpne 26
22: iconst_1
23: goto 27
26: iconst_0
27: invokevirtual #6 // Method java/io/PrintStream.printl
n:(Z)V
30: return
}

zj8692286
zj8692286 晓得有装箱拆箱这个东西了。谢谢
大约 3 年之前 回复
zj8692286
zj8692286   2014.11.21 09:27

这里好冷清~有人吗~~~

jinfengyiye
jinfengyiye   2014.11.21 13:29

这种情况下不是得,这种b的对象的1也是在堆里面,堆里面分了空间就是用来放这些的啊.
你想我们所有的引用类型(比如自己定义的类)都是由基本类型组成,这样一步一步的组成的,如果堆里面不放值,全在栈中,那栈得要多大啊.

jinfengyiye
jinfengyiye   2014.11.21 13:30

所以说引用对象放在对中是对的. 值类型放在栈中确实的说是不对的,有些也是在堆当中的.

zj8692286
zj8692286 基本数据类型不是对象,是放在栈中的,但是被对应的包装类包装之后就是对象了,对象值放在堆中,所以那个Integer(1)的1是在堆中的,对吧
大约 3 年之前 回复
juwuhen
juwuhen   2014.11.21 14:49

堆中放着一个Integer对象,其值为1,但Integer对象中还有其他属性和方法,不是一个简单的值

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!