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)
System.out.println(V1)
System.out.println(V2)
System.out.println(V1.i)
System.out.println(V2.i)
2中,我觉得应该是true啊。
比的是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));
}
}