Java基礎——Object類的三個常用方法

內容整理自《Java 核心技術 卷一》

Object類的簡介
java.lang.Object
java.lang包在使用的時候無需顯示導入,編譯的時候由編譯器自動導入
Object類是所有類的超類,是java中唯一沒有父類的類,如果沒有明確地指出超類,Object就被認爲是這個類的超類
在Java中,只有基本類型不是對象
Object類的方法
equals方法()
Object類中的equals方法用於監測一個對象是否等於另外一個對象。但是,如果單單是在Object類當中,這個方法僅僅只判斷兩個對象是否具有相同的引用。如果兩個對象具有相同的引用,它們一定是相等的
爲什麼每個類要重寫equals的原因:然而,對於多數類來說,這種判斷沒有太大的意義。例如兩個Employee對象,需要判斷的是兩個對象的name、time和salary是否相等,而不僅僅只是判斷兩個對象是否具有相同的引用
在類中equals的重寫:
class Employee
{
String name;
double salary;
Date hireDay;

//此處用Object類接收所有的類型
public boolean equals(Object otherObject){
//1.判斷是否是相同的引用
if(this == otherObject) return true;
//2.判斷對象是否爲空
if(otherObject == null) return false;
//3.判斷是否是同一個類
if(getClass() != otherObject.getClass()) return false;

    //4.做類型轉換
    Employee other = (Employee) otherObject;
    //5.檢測各個域是否相等
    return name.equals(other.name)
    && salary == other.salary
    && hireDay.equals(other.hireDay);
}
...

}

爲什麼要用getClass()而不用instanceof
例如有一個引用對象Employee e,和一個對象Manager m,並且兩個對象具有相同的姓名、薪水和僱傭日期。現在判斷 e.equals(m),當代碼執行到 m instanceof Employee 的時候,返回的是true。但是如果判斷m.equals(e),e instanceof Manager的時候,返回了false。這違背了Java語言對equals方法的特性要求,自反性:a == b , b == a 。
hashCode()
每個對象都擁有自己的一個散列碼,是一個整形值,如果重寫了equals方法,就必須重寫hashCode方法
hashCode的返回值必須是int,舉例說明:
class Employee
{
public int hashCode()
{
return 7*name.hashCode()+11*new Double(salary).hashCode
+13*hireDay.hashCode();
}
}
爲什麼重寫了equals就必須重寫hashCode:感覺不錯的解答,總結的就是,如果重寫了equals而不重寫hashCode可能導致兩個對象通過equals方法判斷爲相等,但是卻具有不同的散列值
toString()
toString()方法,它用於返回表示對象值的字符串。例如,Point類的toString方法將返回下面這樣的字符串:java.awt.Point[x=10,y=20]
隨處可見toString方法的主要原因是:只要對象與一個字符串通過操作符“+”連接起來,Java編譯器就會自動地調用toString方法,以便獲得這個對象的字符串描述
強烈建議爲自定義的每一個類增加toString方法。這樣做不僅自己受益,而且所有使用這個類的程序員也會從這個日誌記錄支持中受益匪淺

轉載出處 https://blog.csdn.net/HughGilbert/article/details/71213682

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章