1. 程式人生 > >10 為什麼會有Object類? ==與equals()的區別?

10 為什麼會有Object類? ==與equals()的區別?

為什麼會有Object類?

Object類正如我們人類的祖先一樣,所有的類都繼承於Object類。

祖先是開源時代,那個時候祖先還只有一些最基本的能力。
像人類會有基本能力一樣,比如說吃飯,睡覺這些功能。

那麼Object類有什麼呢?
toString, equals, getClass, hashCode, notify,notifyAll, wait, finalize, clone

所以我們看一下祖先Object類中的equals方法。在多型中,多型最大的用處就是引數的傳遞,而這個引數越大越好,最大的是什麼呢?當然就是祖先Object類了。

public boolean equals(Object obj) {
    return (this == obj); //注意:equals()方法裡就是==
}

equals方法的起源就是==

如何表現人與人之前是不同的,用程式碼實現一下:

package com.junc.test;

public class EqualsMethod {
    public static void main(String[] args) {
        Person me = new Person();
        Person other = new Person();

        boolean i = me.equals(other);   //我是不是跟他一樣
        System.out.println(i);          //輸出 false
    }
}

class Person extends Object{ 
    //extends Object可以省去,因為預設繼承祖先Object
}

class Object {
    public boolean equals(Object obj) {//相當於Object obj = new Person();
        return (this == obj); 
    }
}

既然是繼承祖先,那麼子類Person就繼承Object裡的方法equals()。

傳入引數就相當於 Object obj = new Person();

因為我與別人是不同的人,所以輸出false。

隨著不斷的變化,我們給equals()賦予新的意義,那就是比較屬性,例如比較姓名或性別這些屬性。比如很多人叫張三,也有可能不同,這個怎麼去比較呢?

package com.junc.test;

public class EqualsMethod {
    public static void main(String[] args) {
        Person me = new Person("張三", "男");
        Person other = new Person("張三", "女");

        boolean i = me.equals(other);
        System.out.println(i);  //輸出為true
    }
}

class Person {
    private String name;
    private String sex;

    public Person(String name, String sex) {
        super();
        this.name = name;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public boolean equals(Object obj) { //重寫了Object類中的equals()方法
        Person p = (Person) obj;
        return this.name.equals(p.name); //比較兩人姓名,返回true
    }
}

==與equals()的區別 :

==是比較運算子,它即可以比較值,也可以比較物件地址。
equals()是方法,如果不重寫Object類中的equals()方法,那麼它等同於==,即this == obj,如果重寫,則equals()方法通常比較的是物件的屬性。