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)
   {  
      // a quick test to see if the objects are identical
      if (this == otherObject) return true;      // must return false if the explicit parameter is null
      if (otherObject == null) return false;      // if the classes don't match, they can't be equal
      if (getClass() != otherObject.getClass())
         return false;      // now we know otherObject is a non-null Employee
      Employee other = (Employee) otherObject;      // test whether the fields have identical values
      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;
}
System.out.println("bob.toString(): " + bob);
这个 最后结果是输出了bob的name salary 和 日期 为啥bob变量直接输出的是tostring的内容(只有一个bob)

解决方案 »

  1.   

    /**
         * Prints an Object and then terminate the line.  This method calls
         * at first String.valueOf(x) to get the printed object's string value,
         * then behaves as
         * though it invokes <code>{@link #print(String)}</code> and then
         * <code>{@link #println()}</code>.
         *
         * @param x  The <code>Object</code> to be printed.
         */
        public void println(Object x) {
            String s = String.valueOf(x);
            synchronized (this) {
                print(s);
                newLine();
            }
        }这个是System.out.println();的源代码,默认的时候调用String.valueOf(x),所以返回的是对象的toString
      

  2.   

    System.out.println("bob.toString(): " + bob);执行println时候查看该方法参数,发现"bob.toString(): "是String类型,后面接+号,代表后面的也是String型,所以后面的内容自动调用该对象的toString方法。
      

  3.   

    "bob.toString(): "是一个字符串,中间用了一个+来连接,所以后面的Bob会自动调用toString()方法转换成一个字符串,如果你没有重写String中的toString()方法,JDK也自己默认了一个toString()方法,会自动调用。2#分析的正确。
      

  4.   

    二楼正解  bob调用了String的toString()方法
      

  5.   

    println方法自动调用toString方法