1.介绍
Object类是Java所有类的始祖,在Java中所有类都是由它扩展而来的。
如果没有明确地指出超类,就认为Object类为这个类的超类。
可以使用Object类型的变量引用任何类型的对象:
Object obj=new Employee("Harry Hacker",35000);
在Java中,只要基本类型不是对象。所有数组类型都扩展了Object类。
Employee[] staff=new Employee[10];
Object obj=staff;
Object obj=new int[10];
2. equals方法
equals方法将判断两个对象是否具有相同的引用。
equals方法比较的过程:
首先调用超类的equals方法。 如果检测失败,对象不可能相同。
如果超类的域都相等,就需要比较子类里的实例域。
(注:getClass方法将返回一个对象所属的类)
public class Employee{
····
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 non-null Employee(形参与该对象参数类型相同时)
//强制类型转换:考虑otherObject可能为Employee的子类的情况
Employee other=(Employee)otherObject;
//test whether the fields hava identical values(测试域是否有相同的值)
return name.equals(other.name) && salary==other.salary &&hireDay.equals(other.hireDay);
}
}
3.相等测试与继承
Java语言要求equals方法具有下面特性:
自反性:对于任何非空引用x,x.equals(x)应该返回 true。
对称性:对于任何引用x,y,如果x.equals(y)返回true,则y.equals(x)也应返回true。
传递性:对于任何引用x,y,z,如果x.equals(y)返回true,y.equals(z)返回true,则x.equals(z)也返回true。
一致性:如果x和y引用的对象没有发生任何改变,则反复调用x.equals(y)应该得到相同的结果。
对于任何非空的引用,x.equals(null)应该返回false。
继续讨论下对称性问题:
e.equals(m);
其中e为Emloyee类型的对象,而m为Manager类型的对象,并且两者具有相同的姓名(name)、薪水(salary)和雇用日期(hireDay)。如果在Employee.equals中用instanceof检测,则应返回true。这以为则反过来,m.equals(e)方法调用应需要返回true。这也就使得Manager类的equals方法必须能够用自己与任何一个Employee比较,而不考虑经理拥有的特有信息。
下面从两个不同角度看问题:
从子类能拥有自己相等的概念:则对称性要求用getClass方法检测
从父类拥有自己相等的概念:那么就可以使用instanceof进行检测,这样就可以在不同子类的对象进行相等的比较。
static boolean equals(type[] a,type[] b)
//如果两个数组的长度相同,并且在对应位置上的数据元素相同,则返回true。否则,返回false
static boolean equals(Object a,Object b)
//如果a和b都为null,返回true。如果只有其中之一为null,返回false。否则返回a.equals(b)