Object类:所有类的超类
Object类是Java中所有类的始祖,在Java中每个类都是由它扩展而来的。但是并不需要这样写:
public class Emloyee extends Object
如果没有明确的指出超类,Object就被认为是这个类的超类。在Java中,只有基本数据类型不是对象,所有数组类型,不管是对象数组还是基本类型的数组都扩展(继承)了Object类。
1.equals方法
Object类中的equals方法用于检车一个对象是否等于另外一个对象。也就是说是否具有相同的引用。当时这种判断相同引用一般来说并没有什么luan用。一般只需要两个对象的状态相等,就认为这两个对象时相等的。
public class Employee{ private double salary; private LocalDate hireDay; 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 salary==other.salary&&hireDay.equals(other.hireDay);//判断值是否一致。 } }
2.相等测试与继承
Java语言规范要求equals方法具有下面的特性:
1.自反性:对于任何非空引用x,x.equals(x)返回true
2.对称性:对于任何引用x和y,当且仅当y.equals(x)返回true,x.equals(y)也应该返回true.
3.传递性:对于任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,x.equals(z)也应该返回true
4.一致性:如果x和y引用的对象没有发生任何改变,返回调用x.equals(y)应该返回同样的结果。
5.对于任何的非空引用x,x.equals(null)应该返回false。
然而利用只getClass检测,是不符合置换原则的。这是因为没有任何一个子类需要重新定义集合是否相等的语义(重新定义equals方法)。在Object中的equals方法没有被声明为final,这样做,可以让子类选择更加有效的算法对集合进行是否相等的检测(重写equals方法)。
如果子类能够拥有自己的相等概念(equals方法在子类中定义),则对称性需求将强制采用getClass进行检测。
如果由超类决定相等的概念(equals方法在父类中定义),那么久可以使用instanceof进行检测。这样就可以在不同子类的对象之间进行相等的比较。(比较的域只能是父类的数据域)
一个比较完善的equals方法:
1.方法参数命名为otherObject 类型为Object,稍后用到。
2.判断是否为同一引用,如果相同返回true。
3.判断是否为Null,如果为Null则返回false;
4.判断是否为同一个类或同一个父类,判断是否为同一个类时则需要在每个子类中定义equals方法(使用getClass方法判断)。
如果判断是否为同一个父类,那么相等时只能使用到父类的equals方法(使用instanceof方法)。
5.强制类型转换otherObject引用为需要判断的类型。
6.判断基本数据类型域和对象域是否都一致。一致返回true.