关于Java引用变量的一个问题
public class Equivalence{
public static void main(String[] args){
Integer n1=new Integer(47);
Integer n2=new Integer(47);
System.out.println(n1);
System.out.println(n2);
System.out.println(n1==n2);
}
}
运行结果:
47
47
false
既然运行结果n1=47,n2=47,为什么System.out.println(n1==n2)结果是false?
变量n1、n2放置的到底是47的地址还是47本身的值呢?看了很多书上写对象引用变量存储的是对象地址,不能直接访问对象。真是感到迷茫了?谢谢能帮我解答一下
问题点数:10、回复次数:17Top
1 楼fishkey(逆游的鱼)回复于 2006-05-03 23:00:32 得分 0
对象类型比较值要用equals,n1、n2放置的是对象的地址,
不过并不是所有的对象都有equals方法.有些对象要你自己去实现这个方法..Top
2 楼tomison()回复于 2006-05-03 23:26:04 得分 0
其实n1,n2是整型对象来的,用不同地址存储。
System.out.println(n1);//相当于System.out.println(n1.toString());
System.out.println(n2);//System.out.println(n2.toString());
System.out.println(n1==n2);//这里是比较两个对象
所以为false
Top
3 楼syhan(藏书人)回复于 2006-05-03 23:26:48 得分 0
楼上的讲的很清楚,n1 == n2比较的是地址,当然不一样了,呵呵Top
4 楼davidong369(冬野)回复于 2006-05-04 10:49:39 得分 0
n1和n2都是对象引用,它们指向不同的内存空间,当然n1==n2 比较的结果为false
好好看一下java基础。Top
5 楼hank212(IT民工)回复于 2006-05-04 11:20:04 得分 0
同上Top
6 楼zhouting()回复于 2006-05-05 22:24:06 得分 0
既然n1存储的是对象的地址,为什么结果显示n1的值是对象内容本身47,而不是其地址值,感到不解?谢谢能解答一下Top
7 楼a_faint_hope(有点明白)回复于 2006-05-05 22:52:23 得分 0
若是显示地址值的话,那你写47,有什么作用?
因为n1,n2是不同的对象,所以地址值不一样,
而47是内容而已!Top
8 楼netsummer123(俊采星驰)回复于 2006-05-05 22:58:02 得分 0
对阿,n1 和 n2根本就是两个不同的变量,他们的地址当然不同了Top
9 楼cctvbhg()回复于 2006-05-05 23:09:55 得分 0
呵呵~n1,n2是两个引用变量~用n1==n2这个方式比较的是n1,n2里存放的地址!所以falsh.
你问为什么输出的是47。很简单,因为你用了System.out.println(n1)语句~这个语句是引用的java.lang.System类中的OUT属性的println方法~你可以查一下这个方法~它其实用的是toString(int)语句,这个语句就是输出内容而不是地址~Top
10 楼fankobe()回复于 2006-05-06 00:04:44 得分 0
==只是比较两个对象(因为你用Integer创建的是对象)的地址是不是一样,而不是实际的值(47)。所以返回false。
因为前后你是使用了new来创建两个Integer对象(值都是47),但是他们实际是不同的两个对象,就是说他们的地址根本不同。==对对象比较时是比较地址的。
如果你想比较Integer对象的值是否相等你应该使用equals代替==。Top
11 楼linanbox21(java学习中)回复于 2006-05-06 01:23:45 得分 0
equals 用来比较两个变量的植,==是用来比较两个变量是否指向了内存中的同一区域Top
12 楼water2004(@-@)回复于 2006-05-06 01:37:28 得分 0
既然n1存储的是对象的地址,为什么结果显示n1的值是对象内容本身47,而不是其地址值,感到不解?
System.out.println(n2);
打印的字符是Integer包装类的toString()方法返回的字符串。
你可以去看看它得实现方式。
凡是在System.out.println里传对象打印得都是这个对象所属类的toString方法返回的字符串
Top
13 楼schol(敲击思想的键盘,滑动灵感的鼠标~~~好男儿志在四方)回复于 2006-05-06 13:58:27 得分 0
基础概念,搞清楚才行。
==比较的是对象,而不是值。
Top
14 楼kyle_lin()回复于 2006-05-06 22:58:06 得分 0
Integer 是封装类,由之声明的变量也就是引用变量,而非八中基本变量之一.所以引用变量的内容就是对象在堆内存的地址,基本变量的内容就是其值.当==运算符两边的基本变量时,比较的自然就是变量的存储值.同理,是引用变量时,比较的就是生成对象的地址.而且n1和n1是不同的引用变量,且指向不同的对象.比较结果当然就是false.Top
15 楼bathabc()回复于 2006-05-07 00:09:11 得分 0
首先,你要明白栈内存和堆内存的概念,栈内存里存放的是地址,也就是对象的地址,堆内存里存放的是对象的首地址和类定义的成员变量和方法,栈内存存n1引用变量,指向堆内存的首地址,因为n1,n2指向的地址不同,所以n1==n2,等于false
第二 System.out.print(n1)=System.out.print(n1.tostring());Top
16 楼larrygao927(Larry)回复于 2006-05-07 02:14:12 得分 0
你可以看下THINKING IN JAVA(中文第3版)的第52-53页。。。那里写的很清楚~Top
17 楼larrygao927(Larry)回复于 2006-05-07 02:15:40 得分 0
呦~坏了。。。你题中举的数“47”跟thinking in java里的一样啊~。。。Top




