<CoreJava> 5.2 Object:所有类的超类

1、Object类是Java所有类的超类。如果没有明确指出一个类的超类,那么object就是这个类的超类,并且不需要显示的写出。

2、Object类型的变量可以引用任何类型的对象:
Object obj = new Employee("vincent", 100000);
如果要对内容进行操作必须要类型转换:
Employee e = (Employee)obj;

3、在Java中只有基本数据类型(即数值,布尔值,字符)不是对象。所有的数组类型都是Object的扩展类。

5.2.1 Equals方法
1、判断两个对象是否有相同的引用。如果两个对象的状态相同,就认为二者相等。
例如:两个雇员对象的姓名,薪水,雇佣日期都一样,就认为他们相等(实际中只要比较他们在数据库中的ID更有效):
class Employee {
    ...
    public boolean equals(Object otherObject) {
        if(this == otherObject) return true;
        if(otherObject == null) return false;
        if(this.getClass() != otherObject.getClass())
        return false;
        Employee other = (Employee)otherObject;
        return name.equals(other.name)
            && salary == other.salary
            && hireDay == other.hireDay);
    }
}
gerCalss方法将返回一个对象所属的类。

2、在子类中使用equals方法时,先调用超类中的equals方法。超类中的equals为false那么子类一定为false。如果超类中的域都相等就要比较子类中的实例域。

5.2.2相等测试与继承
1、Java要求equals具有以下特性:
1)自反性:对任何非空引用x,x.equals(x)的返回值为true;
2)对称性:对任何引用x和y,当且仅当x.equals(y)为true, y.equals(x)也为true;
3)一致性:如果x和y的引用没有改变,那么反复调用x.equals(y)的返回值相同;
4)传递性:对于任何引用x、y和z,如果:x.equals(y)为true,y.equals(z)也为true,那么x.equals(z)一定为true;
5)对任意非空引用x,x.equals(null)返回false。

2、编写一个完美equals的建议:
1)显式参数命名为otherObject,然后将它转换成other变量;
2)检测this和otherObject是否引用同一个对象:
if (this == otherObject) return true;
3)检测otherObject是否为null:
if(otherObject == null) return false;
4)比较this与otherObject是否属于同一个类:
if(this.getCalss() != otherObject.getCalss()) return false;
5)将otherObject转换成相应类的类型变量:
ClassName other = (ClassName) otherObject
6)开始对所有需要比较的域进行比较,使用“==”比较基本数据类型,使用“equals“比较对象域。

5.2.4 ToString方法
toString方法是一种非常有用的调试工具。强烈建议为每一个自定义类加上toString方法。

源代码:例5-3的程序实现了Employee类和Manager类的equals,hashcode和toString方法:
EqualsTest.java:
  1. package com.vincent.corejava.equalstest;  
  2.   
  3. public class EqualsTest {  
  4.     public static void main(String[] args) {  
  5.         Employee alice1 = new Employee("Alice Adams"750019871215);  
  6.         Employee alice2 = alice1;  
  7.         Employee alice3 = new Employee("Alice Adams"750019871215);  
  8.         Employee bob = new Employee("Bob"50001989101);  
  9.           
  10.         System.out.println("alice1 == alice2: " + (alice1 == alice2));  
  11.         System.out.println("alice1 == alice3: " + (alice1 == alice3));  
  12.         System.out.println("alice1.equals(alice3): " + alice1.equals(alice3));  
  13.         System.out.println("alice1.equals(bob): " + alice1.equals(bob));  
  14.         System.out.println("bob.toString(): " + bob);  
  15.           
  16.         Manager carl = new Manager("Carl"800019871215);  
  17.         Manager boss = new Manager("Carl"800019871215);  
  18.         boss.setBonus(5000);  
  19.           
  20.         System.out.println("boss.toString(): " + boss);  
  21.         System.out.println("carl.equals(boss): " + carl.equals(boss));  
  22.         System.out.println("alice1.hashCode(): " + alice1.hashCode());  
  23.         System.out.println("alice3.hashCode(): " + alice3.hashCode());  
  24.     }  
  25.   
  26. }  

Employee.java:
  1. package com.vincent.corejava.equalstest;  
  2.   
  3. import java.util.Date;  
  4. import java.util.GregorianCalendar;  
  5.   
  6. class Employee {  
  7.     private String name;  
  8.     private double salary;  
  9.     private Date hireDay;  
  10.   
  11.     public Employee(String aName, double aSalary, int year, int month, int day) {  
  12.          name = aName;  
  13.          salary = aSalary;  
  14.          GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);  
  15.          hireDay = calendar.getTime();  
  16.      }  
  17.       
  18.     public String getName() {  
  19.         return name;  
  20.     }  
  21.       
  22.     public double getSalary() {  
  23.         return salary;  
  24.     }  
  25.       
  26.     public Date getHireDay() {  
  27.         return hireDay;  
  28.     }  
  29.       
  30.     public void raiseSalary(double byPercent) {  
  31.         double raise = salary * byPercent / 100;  
  32.         salary += raise;  
  33.     }  
  34.       
  35.     public boolean equals(Object otherObject) {  
  36.         //检测二者是否引用同一个对象  
  37.         if (this == otherObject) return true;  
  38.         //检测otherObject是否为空引用  
  39.         if (otherObject == nullreturn false;  
  40.         //检测二者是否属于同一个类  
  41.         if (this.getClass() != otherObject.getClass()) return false;  
  42.           
  43.         Employee other = (Employee)otherObject;  
  44.         return name.equals(other.name)  
  45.                 && salary == other.salary  
  46.                 && hireDay.equals(other.hireDay);  
  47.     }  
  48.       
  49.     public int hashCode() {  
  50.         return   
  51.                 7 * name.hashCode()  
  52.                 + 11 * new Double(salary).hashCode()  
  53.                 + 13 * hireDay.hashCode();  
  54.     }  
  55.       
  56.     public String toString() {  
  57.         return getClass().getName() +   
  58.                 "[name= " + name   
  59.                 + ", salary= " + salary   
  60.                 + ", hireDay= " + hireDay   
  61.                 +"]";  
  62.     }  
  63.   
  64. }  

Manager.java:
  1. package com.vincent.corejava.equalstest;  
  2.   
  3. public class Manager extends Employee{  
  4.     private double bonus;  
  5.   
  6.     public Manager(String aName, double aSalary, int year, int month, int day) {  
  7.         super(aName, aSalary, year, month, day);  
  8.         bonus = 0;  
  9.     }  
  10.       
  11.     public double getSalary() {  
  12.         double baseSalary = super.getSalary();  
  13.         return baseSalary +bonus;  
  14.     }  
  15.       
  16.     public void setBonus(double aBonus) {  
  17.         bonus = aBonus;  
  18.     }  
  19.       
  20.     public boolean equals(Object otherObject) {  
  21.         if (!super.equals(otherObject)) return false;  
  22.         Manager other = (Manager)otherObject;  
  23.         return bonus == other.bonus;  
  24.     }  
  25.       
  26.     public int hashCode() {  
  27.         return super.hashCode() + 17 * new Double(bonus).hashCode();  
  28.     }  
  29.       
  30.     public String toString() {  
  31.         return super.toString() + "[bonus= " + bonus + "]";  
  32.     }  
  33.   
  34. }  



运行结果:
alice1 == alice2: true
alice1 == alice3: false
alice1.equals(alice3): true
alice1.equals(bob): false
bob.toString(): com.vincent.corejava.equalstest.Employee[name= Bob, salary= 5000.0, hireDay= Sun Oct 01 00:00:00 CST 1989]
boss.toString(): com.vincent.corejava.equalstest.Manager[name= Carl, salary= 8000.0, hireDay= Tue Dec 15 00:00:00 CST 1987][bonus= 5000.0]
carl.equals(boss): false
alice1.hashCode(): 339562723
alice3.hashCode(): 339562723
posted @ 2013-02-28 18:54  vincent_hv  阅读(265)  评论(0编辑  收藏  举报