在Java中,Object类是所有类的父类,Java中的每一个类都扩展了Object。例如,我们有如下一个员工类:
public class Employee {
private String name;//员工姓名
private double salary;//薪水
private LocalDate hireDay;//入职日期
//下面是构造方法
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}
public Employee() {}
}
我们可以使用Object类型的变量引用任何类型的对象:
Object object = new Employee("John",5000);
但是,Object类型的变量只能用于作为任意值的一个泛型容器。要想对其中的内容做具体的操作时,还需要清楚对象的原始类型,并进行相应的强制类型转换。
当我们想对对象变量object进行操作时,就必须先进行强转:
Employee employee = (Employee) object;
然后对employee进行操作。
Object类中的equals方法
Object类中的equals方法用于检测一个对象是否等于另外一个对象。接下来通过一个例子来了解equals方法的实现机制:
public class Employee {
private String name;//员工姓名
private double salary;//薪水
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}
public Employee() {}
public boolean equals(Object object){
//接收参数时是使用Object类型来接收参数
//先判断这两个对象的引用是否相同,如果这两个对象的引用相同,
// 那么就直接返回true
if (this == object)
return true;
//如果参数是空,直接返回false
if (object == null)
return false;
//如果两个对象的引用不同,就在判断它们所属的类是否相同,
// 只有当两个对象属于同一个类时,才有可能相等;如果不属于同一个类,
// 就直接返回false
//注意:对放在Object泛型容器里的对象进行getClass()时,会返回其原始类型
if (getClass() != object.getClass())
return false;
//如果两个对象属于同一个类,就先进行类型转换,然后在对其实例字段进行比较
Employee employee = (Employee) object;
//返回两个对象实例字段比较的结果:都相等返回true,否则返回false
return Objects.equals(name,employee.name)
&& salary == employee.salary;
//因为name是String类型,为了防备name为null,在这里使用了工具类Objects的equals方法。
// 如果两个参数都为空,Objects.equals(a,b)调用将返回true;
// 如果其中一个参数为null,则返回false;
// 如果两个参数都不为null,则调用 a.equals(b)。
// 如果写成 name.equals(employee.name),那么当name为null时,就会产生空指针异常错误
}
}
通过上面例子可知,equals方法实现机制大概分为以下几步:
- 判断两对象引用是否相同
- 判断参数是否为空
- 判断两对象是否属于同一个类
- 进行强制类型转换,并逐一比较对象的实例字段。
当我们需要新定义一个类(Manager)继承自Employee,并在其中添加一些字段,那么就需要重写父类的equals方法。 在子类中重写equals方法时,需要首先调用父类的equals。如果父类的equals方法返回了false,那么对象就不可能相等。如果父类中的字段都相等,再继续比较子类中新增的实例字段。
public class Manager extends Employee{
public Manager(){}
private double bons;
@Override
public boolean equals(Object object) {
//先调用父类的 equals方法比较从父类中继承得到的实例字段,
// 如果相等再进一步比较子类中新增加的实例字段
if (!super.equals(object))
return false;
Manager manager = (Manager) object;
return bons == manager.bons;
}
}