一、Object
java.lang.Object 是所有類的根類,每個 Java 對象都是一個 Object。本文主要說明的是 Object 類中的一組方法,這些方法是所有對象都需要的一些關鍵行為的默認實現。除非重寫這些方法,否則都會直接繼承自 Object 類。其中,Object 中的 wait、notify 和 notifyAll 方法是 Java 並發支持的一部分。
二、toString 方法
定義:是對象用來創建一個自我描述的字符串的方法。
任何一個對象都可以和一個字符串進行連接。
下面例子中的兩個方法都為 Foo 類創建了新的實例並調用其 toString 方法。運行結果完全相同:
System.out.println(
"This is a new foo: " + new Foo());
System.out.println(
"this is a new foo: ".concat((new Foo()).toString()));
在 Object 類中,toString 方法的實現基於對象在堆中的位置,其返回一個沒什麼用的字符串。在代碼中對 toString 方法重寫是方便後期調試良好的開端。
我們可以在 eclipse 中的編輯器中 右鍵——源碼——生成 toSting() 方便的進行重寫如下圖(我用的是中文版):關於漢化的方法,我會將鏈接放在文章的末尾。
三、finalize 方法:<喎?/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPgogICAgICAgILjDt723qLrNIGNsb25lILe9t6jSu9H5trzK9NPawPrKt9LFwfSjrNa709DU2tfTwODW0NbY0LTByyBmaW5hbGl6ZSC3vbeoyrGjrEphdmEgssW74dTa1MvQ0MqxtffTw7jDt723qKGjPGJyPgoKICAgICAgICC1q8rHo6y1scDgz9TKvrao0uXByyBmaW5hbGl6ZSC3vbeoyrGjrLbUuMPA4LXEttTP89a00NDArLv4u9jK1cqxo6y74bX308O4w7e9t6iho0phdmEgsru1q87et6ixo9akyrLDtMqxuvK74bX308MgZmluYWxpemUgt723qKOsyrW8ysnPo6zL/Mn11sHO3reoyLexo9K7tqi74bX308PV4rj2t723qKGjPGJyPgoKICAgICAgICC0y83io6y199PDIGZpbmFsaXplILe9t6i/ycTcu+HW2NDCvKS77tK7uPa21M/zo6GjoaOh1K3S8qO6tbHSu7j2ttTP87K7tObU2r/J08O1xNL908PKsaOsSmF2YSC+zbvh19S2r7bUy/zWtNDQwKy7+LvYytWho7WrysejrGZpbmFsaXplILe9t6i1xMq1z9a74c6q1eK49rbUz/OhsLS0vaihsdK7uPbQwrXEv8nTw7XE0v3Tw6OswP3I57DRyrXP1sHLIGZpbmFsaXplILXEttTP87zTtb3Es7j2wdCx7dbQo6HTydPa1eK49tSt0vKjrGZpbmFsaXplILe9t6i1xMq1z9bX6LCtwcu21Mv5tqjS5bXEwOC1xLrctuDTxbuvoaM8YnI+CgogICAgICAgINfbyc/L+cr2o6zKudPDIGZpbmFsaXplILe9t6ijrLK7u+G0+MC0usO0pqOsyLS0+MC0wcvSu7bRu7W0pqOsPHN0cm9uZz6yu72o0unKudPDo6GjoaOhPC9zdHJvbmc+PGJyPgoKPGJyPgoKPHN0cm9uZz7LxKGiY2xvbmUgt723qKO6PC9zdHJvbmc+CiAgICAgICAgzai5/bjDt723qL/J0tSyu7X308O5udTsuq/K/bb41rG907S0vai21M/zoaMKICAgICAgICDL5Mi71NogT2JqZWN0IMDg1tC2qNLlwcsgY2xvbmUgt723qKOstavU2tK7uPa21M/z1tC199PDIGNsb25lILe9t6i74bW81sLSu7Oho6yz/bfHuMO21M/zyrXP1sHLIENsb25lYWJsZSC907/aoaM8YnI+CgogICAgICAgIMjnufvO0sPHtLS9qNK7uPa21M/ztcS0+rzbuty437XEyrG68qOsY2xvbmUgt723qL/J0tSzyc6q0rvW1tPQ08O1xNPFu6+3vcq9oaPL5Mi71NrEs9CpzNi2qLXEx+m/9s/Co6zKudPDIGNsb25lILe9t6i/ycTcysex2NDrtcSjrLWrysfNqLn9uLTWxrm51Oy6r8r9o6jTw9LRvq3T0LXEyrXA/df3zqrG5M6o0ru1xLLOyv2jqc/UtcO4/LzTtcS88rWlo6y2+MfSuty24Mfpv/bPwqOs1eLR+bXEzai5/bi01sa5udTsuq/K/bXEtPq828rHv8nS1Lr2wtS1xKGjyOfPwsv5yvajugo8cHJlIGNsYXNzPQ=="brush:java;"> Student stu1 = new Student();
Student stu2 = stu1;
同樣不建議使用clone方法,如上所述,更多情況下,通過復制構造函數,可以解決大多數問題。
五、equals 方法:
通過這個方法和 hashCode 方法,調用者都可以知道一個對象是否和另一個對象相同。
equals 方法的實現必須具有以下4個特性,且相關聲明必須始終為真:
自反性:x.equals(x)
對稱性:x.equals(y)==y.equals(x)
傳遞性:(x.equals(y) && y.equals(z)) == x.equals(z)
一致性:如果 x.equals(y) 在程序生命周期的任意點都為真,只要 x 和 y 的值不變,則 x.equals(y) 就始終為真!
滿足這4大特性,相當困難。常見錯誤之一是定義一個新的類(違反了自反性),在某些情況下等價於已有的類。
假設使用了已有的定義了類 EnglishWeekdays 的庫,假設又定義了類 FrenchWeekdays。顯然,我們很可能會為 FrenchWeekdays 類定義 equals 方法,該方法和 EnglishWeekdays 相應的 French 等值進行比較並且返回真。 但是!!!千萬不要這麼做,已有的 EnglishWeekdays 類看不到新定義的
FrenchWeekdays 類,因而它永遠都無法確定你所定義的類的實例是否是等值的。因此這種方式違反了自反性!!!
六、hashCode方法
該方法和 equals 方法應該是成對出現的,只要重寫了其中一個方法,另外一個也應該重寫。
很多的庫程序把 hashCode 方法作為判斷兩個對象是否等價的一種優化方式。
這些庫首先比較兩個對象的哈希碼,如果這兩個對象的哈希碼不同,那麼就沒有必要執行代價更高的比較操作,因為這兩個對象一定是不同的。
哈希碼算法的特點在於計算非常快速,這方面可以很好的取代equals方法。
一方面訪問大型數組的每個元素來計算其哈希碼,很可能還比不上執行真正的比較操作,而另外一方面,通過哈希碼計算可以非常快速的返回0值,只是可能不是非常有用。
所以在使用哈希碼算法方面我們需要根據實際情況來考量。
eclipse漢化教程:http://download.csdn.net/detail/fu222cs98/6982553
本文參考自《Android程序設計》
引用說明:Programming Android by Zigurd Mednieks, Laird Dornin, G.Blake Meike, and Masumi Nakamura. Copyright 2011 O'Reilly
Media, Inc., 978-1-449-38969-7