clsaa Employee{      public voolean equals(Object otherObject){              if(this == otherObject) return true;              if(otherObject == null) return false;              if(getClass() != otherObject.getClass())
                   return false;              Employee other = (Employee)otherObject;
             
              return name.equals(other.name)
                  && salary == other.salary
                  && hireDay.equals(other.hireDay);  
      }
}
这个判断是什么意思,难道是三个if都成立了之后.在返回Employee下面的返回吗?或者是如果其中一条if为true了,就返回它所携带的return,请大家为我详细介绍下,多谢大家了,本人实在是不明白,Employee根本就不是判断语句,最后怎么返回下面的了?
还有一件事,就是下面的return怎么用了equals??name.equals(other.name).这不是一直都调用自己么?直到程序崩溃为止???除非他用了super.equals啊.
希望大家说的明白点.
希望把你能知道的详细的告诉我,本人非常感谢,问题并不仅于此.另外,如果愿意就帮帮我,hashCode到底要怎么写,其中的散列码的数字是怎么来的,比如返回7乘name.hashCode();这个7又是什么意思.

解决方案 »

  1.   

    首先是boolean,不是voolean
    其次只要运行了return xx,这个函数就结束。
    只有在上面三个if都不成立的情况下才运行
    Employee other = (Employee)otherObject;及其以下语句name.equals(other.name)&& salary == other.salary&& hireDay.equals(other.hireDay)
    是个boolean型
      

  2.   

    还有一件事,就是下面的return怎么用了equals??name.equals(other.name).这不是一直都调用自己么?直到程序崩溃为止???除非他用了super.equals啊.
    -------------------------------------
    调用自己只是算以下那一大长串的值是true还是false,只调用一下下,不会崩溃。
      

  3.   

    这位先生提问怎么那么不负责任呢,那么多错误啊,程序里面加上else或许会更清楚些。不要写这么感觉上难懂的代码!
      

  4.   

    代码是顺序执行(可能包含参数方法调用).
    方法遇到return ...语句就结束了.
    return name.equals(other.name) 中的name实为this.name,other.name为另一个实例的name.
      

  5.   

    1,严格来说这段程序写的不好,其实我们写程序应该是单入口,单出口,这么多的return ,很容易就让人模糊了,
    clsaa Employee{      public voolean equals(Object otherObject){
                  boolean equ = false;
                  if(otherObject == nullthis == otherObject){
                     equ = false; 
                  }              else if(getClass() != otherObject.getClass()){
                        equ = false; 
                  } 
                  else if (this == otherObject)
                   {
                       equ = true;
                   }else {              Employee other = (Employee)otherObject;
                 
                  equ =  name.equals(other.name)
                      && salary == other.salary
                      && hireDay.equals(other.hireDay);  
          }return equ;
    }
    整个过程就是
    a.现看参数是否是null,是的话肯定不等
    b,看看参数和该对象是否是相同的类型,不是的话肯定不等
    c,看看两个是不是同一个引用指向的内存,或者说完全是一个对象,如果是,则肯定是true(就像张三==张三一样)
    d看看对象和参数对象是否符合名字,薪水,工作日都是相同的(肯能这个方法就是说,如果这三个属性相同,就规定它相同),如果三者都想同,就是true.
    实际上人们还是愿意想搂住那样写,因为对写程序的人来说,毕竟还是思路清晰,并且省很多source的,但是对测试来说可能就麻烦了
    其实整个的流程就是还有
    name.equals(other.name)
                      && salary == other.salary
                      && hireDay.equals(other.hireDay);
    这一句里面用到的equals并不是Employee类的方法,而是name这个属性或者hireDay这个属性所属的类的方法(比方说 name是String类型的,这里的equals就是String的equals方法,hireDay是Integer类型的,equals就是Integer的equals方法).所以不会出现所谓的崩溃,因为并不是你说的调用自己的equals方法,而是调用另外的equals方法(String 类的或者Integer类的).因为equals方法是所有Object类的子类的一个共有的方法,因为Object就有这个方法了
    =====================================================================
      

  6.   

    if(otherObject == nullthis == otherObject){
    ===============================================
    这句写错了,应该是
    if(otherObject == null){
      

  7.   

    这个判断是什么意思,难道是三个if都成立了之后.在返回Employee下面的返回吗?
    --
    return 就是直接返回了
    本人实在是不明白,Employee根本就不是判断语句,最后怎么返回下面的了?--
    Employee other = (Employee)otherObject;,
    这个是转型,如何不明白什么是转型,那么请参看相应的书还有一件事,就是下面的return怎么用了equals??name.equals(other.name).这不是一直都调用自己么?直到程序崩溃为止???除非他用了super.equals啊.
    --
    比如 String name,那name.equals应该是调用的String 的equals而不是Employee 的equalshashCode到底要怎么写,其中的散列码的数字是怎么来的,比如返回7乘name.hashCode();这个7又是什么意思.
    --
    如连7是什么意思都不知道,那么请重新读小学1年级
      

  8.   

    For_suzhen(不懂装懂) ( ) 的代码可读性明显不如楼主贴出来的代码简洁才是王道
      

  9.   

    For_suzhen(不懂装懂)同志,我想问下,你说的name.equals(oherObject.name)这是调用了String的equals可是并不是所有的类都重写了equals啊,那如果有的类没重写这个方法,但是又是一个对象,怎么比较?本人期望楼下继续回答,楼上几为的回答让本人实在难以下手,
      

  10.   

    回答上面问题:确实不是所有类都实现了equals方法, 但所有类都继承自Object, 而Object实现了equals方法, 它比较的是两个对象的内存地址, 也就是比较是否同一个对象. 因此可以对任何对象调用equals方法, 但是如果你不仅仅需要比较对象的同一性, 还有其它逻辑上的比较, 则需要自己实现equals方法. 事实上, 总是实现自己的equals方法是一条最佳实践...
      

  11.   

    顺便说下, 这么多人回答, 楼主不该把分只给一个人...For_suzhen(不懂装懂) 给出的代码并没有楼主的要好, 虽然方法单入单出是好但楼主的equals方法是通用实现, 已经被大家普遍接受, 正如上面兄弟所说, 简洁是王道大家好才是真的好!
      

  12.   

    估计楼主是在看java核心计划...偶正好也在看..就来解释整个过程吧.分给不给我所谓。只是希望楼主能明白这段代码的含义..来这问这个问题,很明显是书没看明白.首先这是要重写Objec类下的equals方法.这个毋庸置疑的.因为Object类的equals方法只交代引用相等的情况下两对象相等.而有些情况.比如说这里的Employee对象的相等可能需要工资(Salary)和姓名相等.至于要编写一个很好的equals方法,书上讲得很详细了.这3个判断是并列关系,书上解释得很清楚,我这里再说一次...这3个if语句是成立后就返回值,而不会继续往下判断.很容易理解这个判断过程
    当this==otherObject 两引用相等,肯定这两个对象相等.
    当传递进来的对象为空,肯定不等.因为x.equale方法必须遵守以下特性:
    自反性,对称性,一致性,传递性.第五点,对于任何非空引用x,x.equale(Null) 应该返回真.
    第一条判断,是满足了自反性.任意非空引用x.equale(x)返回肯定为真.当两个对象引用所属的类不同,返回肯定是假,比如说Employee的对象e1.和Manager的对象e2.两者肯定不能相等.然后就是上面的条件都不成立的时候根据
                  return name.equals(other.name)
                      && salary == other.salary
                      && hireDay.equals(other.hireDay);
    判断返回值.注意,这里的.equals并不会是反复掉用本身的equals一直到崩溃.你注意在equals上面曾经提到过,两者的对象相等引用就必定为真.这里你提的问题很好,当时我并没考虑这个地方.所以我现在查了一下equals的API.这里应该是调用本身还是Object的原equals方法....有待研究.不过我理解是这里是肯定返回真或假的.个人理解这里是调用的是Object的equals.因为你要注意到.hireDay.equals(other.hireDay);这里是hireDay.equals.是以这个hireDay对象为调用主体.而不是这个整个类的调用为体.也就是说.....我不知道该怎么解释了...
    这么说吧.你可以用hireDay调用Employee类的方法吗?显然不行.只能调用object的方法对吧.所以这里不会反复执行.hashCode到底要怎么写,其中的散列码的数字是怎么来的,比如返回7乘name.hashCode();这个7又是什么意思.
    至于这个问题就太简单了...就是调用object的hashCode方法.再随便乘一个整数..这个7随便写的....看书仔细点....hashCode都是自己编写的一套散列码获得方法...over...希望偶的解释正确和让你满意.因为偶也正在看这本书
      

  13.   

    顺便说一下...
    For_suzhen(不懂装懂) 给出的代码并没有楼主的要好, 虽然方法单入单出是好
    但事实上楼主的这种代码风格更容易让人理解.
    个人喜好不同而已吧...
    己说不欲勿施于人
      

  14.   

    非常感谢kk15378924() ( ) 的慷慨叙说,这对我的帮助实在是太大了,其实我是个电脑初学者,所以懂的少,更不用说程序了,收获非常大,谢谢kk15378924() ( ) 老兄,接分,嘿嘿.
    如果你研究了出下面那个到底是调用自身还是调用他们所属的类对象,麻烦告诉声.