天天看点

关于相等测试与继承+Hashcode+toString ,求指导!

在这个示例中演示的是 相等测试与继承+Hashcode+toString

具体的代码及运行结果如下:

Console如下:

alice1 == alice2: true
alice1 == alice3: false
alice1.equals(alice3): true
alice1.equals(bob): false
bob.toString(): Employee[name=Bob Brandson,salary=50000.0,hireDay=Sun Oct 01 00:00:00 CST 1989]
boss.toString(): Manager[name=carl Cracker,salary=80000.0,hireDay=Tue Dec 15 00:00:00 CST 1987][bonus=5000.0]
carl.toString(): Manager[name=Carl Cracker,salary=80000.0,hireDay=Tue Dec 15 00:00:00 CST 1987][bonus=0.0]
carl.equals(boss): false
alice1.hashCode(): 377780067
alice3.hashCode(): 377780067
bob.hashCode(): 955285015
carl.hashCode(): 386513600
boss.hashCode(): 510031328
           

如上所示:现在的问题是(见红色字体),求大牛指导!

System.out.println("alice1.equals(alice3): " + alice1.equals(alice3)); //运行结果为:alice1.equals(alice3): true

System.out.println("carl.equals(boss): " + carl.equals(boss)); //但是这句的结果是:carl.equals(boss): false 这里为什么会使false? 求解答

import java.util.Date;
import java.util.GregorianCalendar;

public class EqualsTest {

	/**
	 * @author cruise 2013-3-23 22:11
	 * 
	 * 
	 */
	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.toString(): " + carl);
		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("boss.hashCode(): " + boss.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 feilds 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;

}