THINKING IN JAVA 里解释的很清楚啦。第一是新建了两个INT对象。使用的是封装器,==比较的是对象句柄。两个对象即使值一样,但却是两个独立对象。自然输出false。第二仍然是两个不同对象,equals比较的是对象的实际内容。所以尽管进行了赋值操作 ,但实际上V1,V2的对象内容还是不同的。只是V1.i与v2.i的内容相同而已。你打印出来就知道了。
System.out.println(V1)
System.out.println(V2)
System.out.println(V1.i)
System.out.println(V2.i)

解决方案 »

  1.   

    如果是基本数据类型(primary data type),如int,boolean,long等,使用==作为比较操作符是可以的,这和c/c++类似对于类的对象,用==比较的是两个对象名是否是代表着同一个object。有点c/c++中比较对象指针/句柄的感觉。1中,n1、n2代表的是两个不同的Integer对象,自然是false
    2中,我觉得应该是true啊。
      

  2.   

    倒,没看清,那个Value类没有重载equals函数啊,不是true不是true,脸红。
      

  3.   

    System.out.println(n1 == n2);
    比的是n1,n2对象的地址
    应该用n1.equals(n2)第二个问题,Java是但根继承结构,所有的非primitive类,都extends于Object,反编译你的类Value,你就知道了。所以Value就继承了Object的equals方法,但是这个方法还没有被你重载,这是 JDK 源代码 Object 的equals实现如下:
     public boolean equals(Object obj) {
    return (this == obj);
        }
    父类Object还不能很清楚你要如何比较,所以,他只判断地址是否相同
    所以你要自己重载Value类的equals方法
    试试下面的代码,就搞定了class Value {
      int i;
       public boolean equals(Object obj) {
    return (this.i == ((Value)obj).i);
        }
    }public class EqualsMethod2 {
      public static void main(String[] args) {
        Value v1 = new Value();
        Value v2 = new Value();
        v1.i = v2.i = 100;
        System.out.println(v1.equals(v2));
      }
      

  4.   

    chenyuan_tongji(codeguru) 不用脸红,我那次看错了,才没面子呢哈哈哈