问一个Object的equals方法的问题

问题描述:

thinking in java上面的例子:
[code="java"]
class Value{
int i;
}

public class Equals{
public static void main(String[] args){
Value value1 = new Value();
Value value2 = new Value();
value1.i = 100;
value2.i = 100;
System.out.println(value1.equals(value2));
}
}
[/code]
输出是false。
然后我覆盖了hashCode方法,使之返回同样的值,但还是返回false。

thinking in java上的解释是equals“比较引用”,具体实现就是
[quote]
public boolean equals(Object obj) {
return (this == obj);
}
[/quote]

我想知道这个所谓的“引用”是不是可以理解成堆空间里对象的地址?
这个“引用”的值可以被输出吗?
如果我不覆盖equals方法,上面的程序是不是永远都输出false?

你理解的没错,Java中的reference就是一个地址,它指向了一个内存空间,这个空间存放着一个对象的相关信息。
可以参考
[url]http://flare.iteye.com/blog/155467[/url]

如果你不覆盖equals方法,会永远返回false。
reference值貌似没有什么办法获得,也许有,不过我不知道。 :(

是这个样子的

假如你不覆盖equals方法,那么永远是false,就比如String类型的假如
String a=new String("abc");
String b=new String("abc");
我们知道a.equals(b)=true;是吧,就是因为String重写了equals方法,把值拿出来做了对比,否则a.eauals(b)就等于false。
所以equals默认就是比较对象,就和==是一样的效果,这个对象引用的底层地址你用字节码可以看出。

[quote]怎样用字节码看出引用的地址[/quote]
你先看编译后的class文件

Java内存由虚拟机管理,直接获得内存地址是不行的也是不允许的,这个概率只能理解和实验吧.
另外看编译后的class文件能看到引用地址吗? 引用地址应该是运行时确定的而不是编译期确定的吧.

[quote]引用
怎样用字节码看出引用的地址

你先看编译后的class文件[/quote]

字节码是虚拟机可以识别的java程序的表现形式,
由.java的文本文件编译而来,保存了编译器能
确定的一些静态信息,而引用地址是程序运行时
动态分配的,在字节码中不可能看见引用地址。

[quote]好比用二进制打开exe一样? [/quote]

这个。。。 可以这么理解

@Override
public boolean equals(Object obj) {
if (obj instanceof Value){
return true;
}
return false;
}