public boolean equals(object obj){  
     Name name=null;  
    if(obj instanceof Name){  
      name=(Name)obj;  
      if(name.firstname==this.firstname&&name.lastname==this.lastname){  
        return true;  
       }else return false;  
     }  
   return super.equals(obj)  
}  
最后一句return super.equals(obj),为什么要交到父类去判断,难道返回false不是更直接吗?请从下塑造型的角度来回答!

解决方案 »

  1.   

    你怎么又问一遍啊??代码是你写的,我们哪里知道!???如果我写的,我一定
    return false;
      

  2.   

    晕,高手也不是天天没事干,替你回答问题的啊。再说,你的问题在你发的另一个帖子里已经有人说的相当清楚了,自己好好看看吧:http://topic.csdn.net/u/20080306/17/92d4f39d-283a-4660-8ffb-63b8c20043ba.html
      

  3.   

    给你说了是对称性原则````x.equals(y),那么y.equals(x).对称性不许它返回为false,或出异常;就是不管你是老子还是儿子,不可能x==y,而y!=x;
    如果t1是t2的派生类,而却t1.firstname==t2.firstname&&t1.lastname==t2.lastname.
    那你t2.equals(t1)那你上面的代码判断的结果是什么?是true;
    那你反过老t1.equals(t2)也要为true,在派生类的equals方法判断不了结果就交给他的基类去判断。
    但是java中所有类的最终基类是Object,所以在t1的所有祖先中都没有办法让t1.equals(t2)为true时最终就是
    调用Object的equals方法也就是判断t1是不是一个对象,答案是肯顶的,为true
    ```
      

  4.   

    当然可以;
    不过:假设this也并非Name类型,但它也含有firstName与lastName属性。当参数obj是Name类型时,可以自己判断;当参数obj不是Name类型时,this与obj的equals()也可以为true,最简单的情况就是this与obj是同一个引用,即this==obj。
    综上所述:当参数obj不是Name类型时,也可能返回true,所以交给父类判断好些。
      

  5.   

    override的equals逻辑既然已经完整了
    其余的用Object的equals逻辑也好 return false, return true也好 
    也无所谓了
      

  6.   

    这个equals方法覆盖就有缺陷if(obj instanceof Name)如果obj是Name的子类 那么这个条件成立 按照这个意思就是 老子跟儿子名字一样的话  老子就等于儿子!建议写法 if(obj.getClass()==Name.class)
      

  7.   

    别抠了
    实际当中都不会这么复杂
    重写个equals还父子类?
    顶多写个po的equals方法判断判断主键id是否相等就得
      

  8.   

    这个equals的写法有点问题
    子类重写equals方法是因为父类的equals方法不满足子类的需求
    比如搂主的例子中如果子类的两个对象名字不同则通过父类的方法来判断,那么
    假如父类认为学号相同则两个对象equals,则出现了一下逻辑:①两个姓名相同但学号不同的子类对象equals
    ②两个姓名不同但学号相同的子类对象equals无论哪个结果都是不符合逻辑的,比较通用的写法如下:
    public boolean equals(Object otherobj){
    if(otherobj == null) return false;

    if(thisobj == otherobj) return true;

    if(super(otherobj)){
    //你自己的判断逻辑
    }

    return false;
    }