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本身的值呢?看了很多书上写对象引用变量存储的是对象地址,不能直接访问对象。真是感到迷茫了?谢谢能帮我解答一下

解决方案 »

  1.   

    对象类型比较值要用equals,n1、n2放置的是对象的地址,
     不过并不是所有的对象都有equals方法.有些对象要你自己去实现这个方法..
      

  2.   

    其实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
      

  3.   

    n1和n2都是对象引用,它们指向不同的内存空间,当然n1==n2 比较的结果为false
    好好看一下java基础。
      

  4.   

    呵呵~n1,n2是两个引用变量~用n1==n2这个方式比较的是n1,n2里存放的地址!所以falsh.
    你问为什么输出的是47。很简单,因为你用了System.out.println(n1)语句~这个语句是引用的java.lang.System类中的OUT属性的println方法~你可以查一下这个方法~它其实用的是toString(int)语句,这个语句就是输出内容而不是地址~
      

  5.   

    ==只是比较两个对象(因为你用Integer创建的是对象)的地址是不是一样,而不是实际的值(47)。所以返回false。
    因为前后你是使用了new来创建两个Integer对象(值都是47),但是他们实际是不同的两个对象,就是说他们的地址根本不同。==对对象比较时是比较地址的。如果你想比较Integer对象的值是否相等你应该使用equals代替==。
      

  6.   

    equals 用来比较两个变量的植,==是用来比较两个变量是否指向了内存中的同一区域
      

  7.   

    既然n1存储的是对象的地址,为什么结果显示n1的值是对象内容本身47,而不是其地址值,感到不解?System.out.println(n2);
    打印的字符是Integer包装类的toString()方法返回的字符串。
    你可以去看看它得实现方式。凡是在System.out.println里传对象打印得都是这个对象所属类的toString方法返回的字符串
      

  8.   

    Integer 是封装类,由之声明的变量也就是引用变量,而非八中基本变量之一.所以引用变量的内容就是对象在堆内存的地址,基本变量的内容就是其值.当==运算符两边的基本变量时,比较的自然就是变量的存储值.同理,是引用变量时,比较的就是生成对象的地址.而且n1和n1是不同的引用变量,且指向不同的对象.比较结果当然就是false.
      

  9.   

    首先,你要明白栈内存和堆内存的概念,栈内存里存放的是地址,也就是对象的地址,堆内存里存放的是对象的首地址和类定义的成员变量和方法,栈内存存n1引用变量,指向堆内存的首地址,因为n1,n2指向的地址不同,所以n1==n2,等于false
    第二   System.out.print(n1)=System.out.print(n1.tostring());
      

  10.   

    你可以看下THINKING IN JAVA(中文第3版)的第52-53页那里写的很清楚~
      

  11.   

    呦~坏了你题中举的数“47”跟thinking in java里的一样啊~