Object类的简单介绍(#)
所有类的超类
- java类中
所有类的始祖
//但在实现上不需要这样写
public class Employee extends Object{...}
//如果没有明确的指出超类,那么Object就被认为是这个类的超类
public class Employee {...}
所有的数组类型,不管是对象数组还是基本类型的数组都扩展了 Object 类
equals()方法的使用情况(#)
Object类中的equals()实现(##)
Object类既然是所有类的超类,那么其中的一些方法就是所有类都可以使用的,比如说其中的equals方法,equals()方法在Object类中的实现如下:
public boolean equals(Object obj) {
return (this == obj);
}
其主要作用是用于检测一个对象是否等于另外一个对象。在该类中,这个方法通过判断两个对象是否具有相同的引用来决定返回值:
- 如果具有相同的引用——返回true,否则返回false
Object类中equals方法的适用问题(##)
但是对于多数类来说, 这种判断并没有什么意义!!
比如,采用这种方式比较两个 PrintStream 对象是否相等就完全没有意义
经常需要检测两个对象状态的相等性, 如果两个对象的状态相等, 就认为这两个对象是相等的
对象状态——对于每个特定的类实例(对象)都有一组特定的实例域值。这些值的集合就是这个对象的当前状态 ( state )。 例如一个Employee对象a{name: "张三",salary: 5000, gender : "male"}和另一个Employee对象b{name: "张三",salary: 5000, gender : "male"},两者虽然引用不同,但是其中的值都是相等的,那么这两个对象状态就是相等的
综上所述,如果需要比较两个对象的状态是否相同,那么就需要重写Object中的equals方法。
总结其使用情况(##)
情况 1:类没有覆盖 equals() ⽅法。则通过 equals() ⽐较该类的两个对象时,调用超类Object中的equals()方法,比较的是两个对象的引用是否相同。
情况 2:类覆盖了 equals() ⽅法。⼀般,我们都覆盖 equals() ⽅法来⽐较两个对象的状态是否相等;若它们的状态相等,则返回 true (即,认为这两个对象相等)。
equals()方法编写注意(#)
Java 语言规范要求 equals 方法具有下面的特性:
1 ) 自反性;2 ) 对称性;3 ) 传递性;4 ) 一致性;5 ) 对于任意非空引用 x, x.equals(null) 应该返回 false
这就很好的避免了类库实现者在数据结构中定位一个元素时还要考虑调用 x.equals(y), 还是调用 y.equals(x) 的问题
此外,注意方法重载时参数的问题,例如下面的例子
public class Employee
{
public boolean equals(Employee other) {
... ...
}
}
这个方法声明的显式参数类型是 Employee。其结果并没有覆盖 Object 类的 equals 方法, 而是定义了一个完全无关的方法。