代码如下,问题在代码后,谢谢各位!!!
import java.util.*;public class EqualsTest
{
public static void main(String[] args)
{
Employee alice1 = new Employee("Alice Adams", 75000, 1987,12,15);
Employee alice2 = alice1;
Employee alice3 = new Employee("Alice Adams", 75000, 1987,12,15);
Employee bob = new Employee("Bob Brandson", 50000,1989, 10, 1);

System.out.println("alice1 == alice2: " + (alice1 == alice2));
System.out.println("alice1 == alice3: " + (alice1 == alice3));
System.out.println("alice1.equals(alice3): " + alice1.equals(alice3));
System.out.println("alice1.equals(bob): " + alice1.equals(bob));

System.out.println("bob.toString():" + bob);

Manager carl = new Manager("Carl Cracker", 8000, 1987,12,15);
Manager boss = new Manager("Carl Cracker", 8000, 1987,12,15);
boss.setBonus(5000);

System.out.println("boss.toString(): " + boss);
System.out.println("carl.equals(boss): " + carl.equals(boss));
System.out.println("alice1.hashCode(): " + alice1.hashCode());
System.out.println("alice3.hashCode(): " + alice3.hashCode());
System.out.println("bob.hashCode(): " + bob.hashCode());
System.out.println("carl.hashCode(): " + carl.hashCode());
System.out.println(carl.getClass() + "\n" + boss.getClass());
}
}class Employee
{
public Employee(String n, double s, int year, int month, int day)
{
name = n;
salary = s;
GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
hireDay = calendar.getTime();
}

public String getName()
{
return name;
}

public double getSalary()
{
return salary;
}

public Date hireDay()
{
return hireDay;
}

public void raiseSalary(double byPercent)
{
double raise = salary * byPercent / 100;
salary += raise;
}

public boolean 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);
}

public int hashCode()
{
return 7 * name.hashCode() + 11 * new Double(salary).hashCode() + 13 * hireDay.hashCode();
}

public String toString()
{
return getClass().getName() + "[name=" + name + "salary=" + salary + ",hireDay=" + hireDay + "]";
}

private String name;
private double salary;
private Date hireDay;
}class Manager extends Employee
{
public Manager(String n, double s, int year, int month, int day)
{
super(n,s,year,month,day);
bonus = 0;
}

public double getSalary()
{
double baseSalary = super.getSalary();
return baseSalary + bonus;
}

public void setBonus(double b)
{
bonus = b;
}

public boolean equals(Object otherObject)
{
if (!super.equals(otherObject))
return false;
Manager other = (Manager)otherObject;
return bonus == other.bonus;
} public int hashCode()
{
return super.hashCode() + 17 * new Double(bonus).hashCode();
}

public String toString()
{
return super.toString() + "[bonus=" + bonus + "]";
}

private double bonus;
}
问题1:
Manager类中重写了equals()方法,其中if (!super.equals(otherObject))这句代码我不理解是什么意思?为什么这样重写方法之后,carl.equals(boss)的结果就为false了呢?问题2:
在Employee和Manager两个类中,两次重写了hashCode()方法,其中为什么要用一个数字去乘以对象的hashCode呢?这样做有什么意义?问题3:
在两次重写hashCode时,都用了Double(salary)或者Double(bonus),这里的Double()方法是强制类型转换吗?如果是的话,之前不是已经将这两个变量申明为double类型了吗?问题4:
都用了new double(salary).hashCode(),为什么要用new关键去生成新的对象呢?为什么不能像hireDay或者name一样,直接name.hashCode()呢?

解决方案 »

  1.   

    问题1:因为你有继承,他是一个子类,所以必须考虑父类的情况。
    2。这是一种策略,你也可以用一个数去加。  当你写完后hashCode方法后问问自己
       是否两个equal的实例,拥有相同的jhashCode
       两个不同的实例,是否拥有相同的hashCode
    3。Double这叫类。而double是简单数据类型,Double是double 的包装类。详情可参见包装类。
    4。还是包装类。。Double是类。 所以创建一个新对象要new 
      

  2.   

    问题1:
    carl.equals(boss)的结果为false的原因是因为两个对象的bonus域不等。car1.bonus==0,而boss.bonus==5000.而不是因为执行super.equals(otherObject),也就是是超类Employee的equals方法而导致的。问题2,3,4
    hashCode()方法是Object类的方法。double是内置类型/基本类型,不是一个类对象,不能有方法。需将其转换成Double类对象。
      

  3.   

    非常感谢!
    再请问一下,在Manager类中,像那样重写equals()方法是为什么?那样写的含义或作用是什么?
      

  4.   


    基本同意1楼说的,但是第一个问题,也就是LZ一直迷惑的equals问题,并不像一楼所说的那样。
    因为父类的equals有类型和其他属性的判断,所以子类重载该方法后,在该方法调用父类的方法,可以省略类型判断和其他属性比较的代码
      

  5.   

    首先感谢楼上三位的帮助!
    if (!super.equals(otherObject))
        return false;
    上面这句代码的含义,是不是用父类equals()方法对对象进行比较,如果父类equals()方法比较下来的结果为false的话,那么就return false?
    不知道我理解的对不对?
      

  6.   

    if (!super.equals(otherObject))
        return false;====
    这句话其实很容易理解。
    Mannager类继承了Employee类
    Manager类比Employee类多了一个bonus实例域。
    所以,比较两个Manager类是否相等的时候,就需要
    比较所有的实例域是否相等,
    也就是name,salary,hireDay和bonus
    而前三个实例域在Employee中已经比较过了,
    所以直接调用父类的equals方法来比较前三个实例域
    弱返回false,那么就不用比较bonus了,直接返回false
    如果没有返回false,就再比较bonus实例域,懂了么?
    这样写代码就重用了代码,避免了重复的工作
    这也是继承的初衷。