日期:2014-05-20  浏览次数:20674 次

equals()方法疑问!!!
class   Super{
int   a=10;
void   hi(){
System.out.println( "你好 ");
}
}
class   sub   extends   Super{
int   b=20;
void   hi(){
System.out.println( "hi~~~~ ");
}
void   bye(){
System.out.print( "sssss ");
}
}
public   class   Inher10{
public   static   void   main(String[]   args){
Super   ob1=new   sub();
sub   ob2=(sub)ob1;
sub   ob3=new   sub();

System.out.println(ob2.equals(ob3));

}
}
请问ob3和ob2各自指向对象的内容不同在哪里啊?

------解决方案--------------------
在你的例子里,不同是因为他们不是同一个东西。

解释这个问题不是一句两句的,但是不难。
1,obj1 == obj2是比较obj1和obj2是不是reference同一个对象实例。
2,obj1.equals(obj2)是按照equals()的逻辑来比较两个对象实例。
3,如果一个class没有定义自己的equals()方法,那么它会继承Object class里的equals()方法,在这个方法里,比较逻辑跟==相同。

在上面的例子里,class sub没有定义自己的equals()方法,所以比较的还是obj2,obj3是不是同一个对象实例。显然,他们不是同一个。
反之,如果在class sub里定义了自己的equals()方法:
public boolean equals(Object o)
{
return (o instanceof sub) && o.a == this.a && o.b == this.b;
}
那么就会按照这个逻辑比较两个对象实例。

------解决方案--------------------
{虽然每个类都通过,默认继承,或间接从object类中继承得到了equals()方法.
实际在object类中的原始方法的内容中不会去做任何判断,
实际经过测试,实际上,作了这样一个判断,
if(this == obj){
return true;
}else{
return false;
}
仅仅只是返回false而已.}

所以,你这程序无论怎么写,都仅仅只会的到,equals=false而已.
建议好好看一下API文档.
可通过以下程序可知:
public class TestEquals {
public static void main(String[] args){
MyObject o1 = new MyObject();
MyObject o2 = new MyObject();
MyObject o3 = o1;
System.out.println(o1.equals(o2));
System.out.println(o1.equals(o3));
}
}

class MyObject{

}
如果想获得自己所想的的equls()的,必须在自己的类中重写
从object中继承得到的equls()方法.
如果不重写,只要,不是同一个对象,那得到的一定是false;
------解决方案--------------------
您在:“Super ob1=new sub(); sub ob2=(sub)ob1; sub ob3=new sub();”创建了两个对象ob2、ob3,既然ob2与ob3是不同的对象,那自然“ob2.equals(ob3)”会false。

------解决方案--------------------
不同的对象ob2.equals(ob3)肯定是false