第五章继承:所有类的超类Object类

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)

猜你喜欢

转载自blog.csdn.net/rachel9798/article/details/82533095