public double getSalary()
   { 
      double baseSalary = super.getSalary();
      return baseSalary + bonus;
   }这个方法在什么时候调用过?  baseSalary + bonus;返回的是多少哦 80000+5000吗?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", 80000, 1987, 12, 15);
      Manager boss = new Manager("Carl Cracker", 80000, 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());
   }
}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 getHireDay()
   {  
      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; 
      // super.equals checked that this and other belong to the same class
      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对象的时候,调用getSalary()就会执行该方法
      

  2.   


    Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);
    boss.setBonus(5000);
    boss.getSalary();返回的就是8000+5000基本工资加红利。
      

  3.   

    还有就是return bonus == other.bonus;这句话就是通过System.out.println("carl.equals(boss): "  + carl.equals(boss));
     other.bonus从哪里能看得出bouns指的是第二个参数?  就是说bonus从什么地方传过来的?
      

  4.   

    子类里的getSalary()方法没有被调用吧, 还有返回结果是80000+5000 对吧
      

  5.   

    这个问题是因为在调用manager 的 public boolean equals(Object otherObject)
    方法的时候传递的是manager(如果是正确的话)对象,在自己的类里边,当然可以调用自己的任何方法,
    使用自己的任何域
      

  6.   

    如果调用的话就返回80000+5000  是不?   不要少写0 我会理解错的 哈哈还有就是return bonus == other.bonus;这句话就是通过System.out.println("carl.equals(boss): "  + carl.equals(boss)); 
    other.bonus从哪里能看得出bouns指的是第二个参数?  就是说bonus从什么地方传过来的? 
      

  7.   

    前边不是有个类型转换吗?( Manager other = (Manager) otherObject; )
    从这句话,此时other也是Manager类型的对象,既然是Manager类型的对象
    other在自己的类里边访问自己的域值bonus没有任何问题。
    bonus是通过manager对象传递过来的。