1. 程式人生 > >Object類之equals方法

Object類之equals方法

class Cat
{
    int color;
    int height;
    int weight;
    public boolean equals(Object obj)
    {
        if(obj == null)
            return false;
        else
        {
            if(obj instanceof Cat)
            {
                Cat c = (Cat)obj;
                if(c.color == this.color && c.height == this.height && c.weight == this.weight)
                    return true;
            }
        }
        return false;
    }
}
public class TestEquals
{
    public static void main(String[] args)
    {
        Cat c1 = new Cat();
        Cat c2 = new Cat();
        System.out.println(c1==c2);//false
        System.out.println(c1.equals(c2));//false 重寫equals方法後,輸出為true
        String s1 = "Hello";
        String s2 = "Hello";
        System.out.println(s1==s2);//true
        System.out.println(s1.equals(s2));//true
    }
}
/*
1.String類中equals方法:
public boolean equals(Object anObject)將此字串與指定的物件比較。當且僅當該引數不為 null,並且是與此物件表示相同字元序列的 String 物件時,結果才為 true。

覆蓋:
類 Object 中的 equals
引數:
anObject - 與此 String 進行比較的物件。
返回:
如果給定物件表示的 String 與此 String 相等,則返回 true;否則返回 false。

2.Object類中的equals方法:
public boolean equals(Object obj)
指示其他某個物件是否與此物件“相等”。
equals 方法在非空物件引用上實現相等關係:

自反性:對於任何非空引用值 x,x.equals(x) 都應返回 true。
對稱性:對於任何非空引用值 x 和 y,當且僅當 y.equals(x) 返回 true 時,x.equals(y) 才應返回 true。
傳遞性:對於任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,並且 y.equals(z) 返回 true,那麼 x.equals(z) 應返回 true。
一致性:對於任何非空引用值 x 和 y,多次呼叫 x.equals(y) 始終返回 true 或始終返回 false,前提是物件上 equals 比較中所用的資訊沒有被修改。
對於任何非空引用值 x,x.equals(null) 都應返回 false。
Object 類的 equals 方法實現物件上差別可能性最大的相等關係;即,對於任何非空引用值 x 和 y,當且僅當 x 和 y 引用同一個物件時,此方法才返回 true(x == y 具有值 true)。

注意:當此方法被重寫時,通常有必要重寫 hashCode 方法,以維護 hashCode 方法的常規協定,該協定宣告相等物件必須具有相等的雜湊碼。


引數:
obj - 要與之比較的引用物件。
返回:
如果此物件與 obj 引數相同,則返回 true;否則返回 false。
2.Object類中的equals方法一般達不到我們的要求,因此一般都要重寫
系統已經存在的String類已經重寫了該方法
3.其實兩個物件相比,已經預設呼叫了Object類的equals方法
對於:
Cat c1 = new Cat();
        Cat c2 = new Cat();
        System.out.println(c1==c2);//false
        System.out.println(c1.equals(c2));
預設方法是返回false
只有引用變數指向同一個物件(記憶體)才為true
而對於:
String s1 = "Hello";
        String s2 = "Hello";
        System.out.println(s1==s2);//true
        System.out.println(s1.equals(s2));//true
因為重寫了Object類的equals方法,預設只要引用變數指向的物件中值相等,就為true
4.instance與typeof
前者是java的,後者是C,C++的
判斷一個物件是否是一個類的物件
5.classpath問題
一般使用eclipse後就不會出現這種問題了
這和一臺機器上安裝多個版本的jdk類似,path變數中靠前的版本會覆蓋掉後面的版本
和classpath中前面的目錄下的重名的類會覆蓋掉後面的目錄中的同名的類一個道理
*/