Object类----equals方法与equals覆写

时间:2021-08-19 16:19:48
/* object:所有类的根类 object是不段抽取而来的,具有所有对象都具备的共性内容。 常用的共性功能: */
/* class Fu //extends Object { Fu() { super(); } } class Zi extends Fu //子类并不继承object 因为java没有多继承 { Zi() { super(); } }*/

class Person extends Object {
    private int age;
    Person(int age)
    {
        this.age = age;
    }
    //我们发现 equal函数完全可以用 == 来代替 十分鸡肋
    //并且 如果我们不想要比较地址值 而是内容 那我们该怎么做?
    //如下定义一个比较函数吗?
    public boolean compare(Person p)
    {
        return this.age == p.age;
    }

    /* *(non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) * 一般都会覆盖此方法,根据对象的特有内容,建立判断对象是否有相同的依据。 * 一般不比较地址值 没有意义。 */

    //然而 因我们继承了object 已经有equal函数 我们只需要进行覆写。
    public boolean equals(Object obj)//注意 参数需和父类中的函数参数相同 否则便是重载
    {
        //return this.age == obj.age;//出现问题:其实参数是多态形式 传进来的参数已经
        //被向上提升为object型 而提升后子类特有数据无法被调用。
        //因此 我们需要向下转型: 注意:向下转型时要注意类型。
        if(!(obj instanceof Person))
        {
// return false;
            throw new ClassCastException("类型错误");
        }
        Person p = (Person)obj;
        return this.age == p.age;
    }
}
class Demo3 {

}

public class ObjectDemo1 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Person p1 = new Person(20);
        Person p2 = new Person(10);

        Demo3 d = new Demo3();
        //出现新问题 因为覆写的equals函数里的参数是object
        //那么意味着所有类都可以往里传。
        //如我们现在往里穿demo形式的d
        //这时 我们就需要做一些处理。
        System.out.println(p1.equals(d));
// System.out.println(p1.equals(p2));//false 比较的地址值
    }

}