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) 

在这个方法中为什么最后要写上super.equals(obj),难道写返回false不行吗,有点不理解! 
为什么还要让交到Object去比较?
有的是这么回答的:后调用super.equals()的意思是,当obj是Name的父类的实例时,调用父类的equals方法来判断是否相等。不能直接返回false,有可能是true的。 
但我想问的是:难道传进来的是obj=老子;通过判断返回true了,就认为老子=儿子了?这逻辑上也不成立啊!!!

解决方案 »

  1.   


    public boolean equals(object obj){   
         Name name=null;  
        if(obj instanceof Name){ //判断的前提条件传入的obj必须是Name的实例,如果不是没有对比的可能。  
          name=(Name)obj;  
          if(name.firstname==this.firstname&&name.lastname==this.lastname){ //这里才是判断传入的obj是否符合要求。符合的条件是firestname相等,lastname相等。 
            return true;  //完全相等,则回true
           }else return false;  //不相等则会false
         }  
       return super.equals(obj)  
    }  这里注意的是 instanceof 不是判断超类与子类的。而是判断一个实例是否是某个类的实例
    就像用Name name = new Name();比较的就是name与Name之间,像这个就是返回true.
      

  2.   

    equals应该有一致性,比如 x.equals(y)是true的话,在x和y都没改变的情况下y.equals(x)也应该是true;
    那我定义两个classclass Person
    {
        public Person(String name)
        {
           this.name = name;
        }
        pubclis Sting name;
    }class Employee extends Person
    {
        public Employee(Sting name, double salary)
        {
            super(name);
            this.salary = salary;
         }    pubclic double salary; 
    }Person a = new Person("Squall");
    Employee e = new Employee("Squall", 0.1);那么假如a.equals(e)返回true的话,(只判断人的名字)
    e.equals(a)不调用 return super.equals(obj)  ;显然返回false
    不符合equals应该有一致性
      

  3.   

    完美的equals 
    public boolean equals(object obj){ 
     if(obj==null){
            return false;
    }
    if(this==obj){
          return true;
    }
    if(this.getClass()!==obj.getClass()){
         return false;}     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 false; 
    }  
      

  4.   

    并不是所有的人都适合做开发的 
    LZ完全没有面向对象的思想和观念A extends B 
    并不表示B是老子 A是儿子 即便是有老子 儿子2个类  也不会设计儿子继承老子 
    你以为你将来继承你老爸的遗产 你就extends你爸
    愚蠢之极
      

  5.   

    如果没有进入第一层if处理,那么表示obj并不是与Name是同类“产品”。所以必须要调用父类的equlas方法再次进行比较。
      

  6.   

    子辈继承自父辈
    如果传进来的不是子辈,让父辈去判断吧OVER
      

  7.   

    最后也可以把return super.equals(obj); 改成
    return false;
    因为Object的equals方法实际是比较是否指向同一对象。既然传进来的obj不是Name类型,就不可能指向同一对象。super.equals(obj)必然返回false
      

  8.   

    [code=Java][/codpublic 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)  
    }  
    e]
      

  9.   


    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)  
    }  
      

  10.   

    这个方法是否需要调用父类,取决于需求和设计。没有什么特别的理由可言!比如,你判断传过来的类,根本不是你希望的,你完全可以return false. 至少我会这么做。至于让父类去判断,呵呵,
    1 代码是你写的,我想你自己清楚
    2 代码是其他人写的,那是他的应用设计需要这样,不需要过多的理由。 需求如此!比如,声明采用的是父类,对象实例是子类。 而子类定义了一个完全不同的eauals方法。如果发生了一个父类实例和一个子类实例判断equals的时候,会怎么样呢???1 我们完全可以按照子类的要求来判断,return false.这是我推荐的。
    2 在某些特殊的业务需求下,调用父类的equals还是有可能需要的,毕竟传过来的有可能是一个父类。OVER.