c++ string类的常用方法_【常用类方法】Object
Object類的知識點總結
概述:
1. Object類是所有其他類的父類
2. Object類只有一個構造方法,這也是為什么所有子類在調用構造方法時都會默認先調用父類的無參構造方法
3. Object類沒有成員變量
方法:
1. public int hashCode()
2. public final Class getClass()
3. public String toString()
4. public boolean equals(Object obj)
5. protected void finalize()
6. protected Object clone()
具體方法:
- public int hashCode():
返回此對象的哈希碼值(散列碼),支持此方法是為了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。
hashCode 的常規協定是:
1. 一致性:在 Java 應用程序執行期間,在對同一對象多次調用 hashCode 方法時,必須一致地返回相同的整數,前提是將對象進行 equals 比較時所用的信息沒有被修改。從某一應用程序的一次執行到同一應用程序的另一次執行,該整數無需保持一致。
2. 如果根據 equals(Object) 方法,兩個對象是相等的,那么對這兩個對象中的每個對象調用 hashCode 方法都必須生成相同的整數結果。 如果重寫了equals()方法,一定也要重寫hashCode()方法
3. 如果根據 equals(java.lang.Object) 方法,兩個對象不相等,那么對這兩個對象中的任一對象上調用 hashCode 方法不要求一定生成不同的整數結果。但是,程序員應該意識到,為不相等的對象生成不同整數結果可以提高哈希表的性能。
重寫:
int result = c;
//根據每一個關鍵域的hashcode去生成
31 * i == ( i << 5 ) - i ;
result = 31 * field.hashCode + result ;
…
return result;
實際上,由 Object 類定義的 hashCode 方法確實會針對不同的對象返回不同的整數。(這一般是通過將該對象的內部地址轉換成一個整數來實現的,但是 JavaTM 編程語言不需要這種實現技巧。)
- public final Class getClass()
返回此 Object 的運行時類。
Class:類類型,用來描述該類型的類
String getName():返回該類的全限定名
注意事項:
a) 返回的是運行時類
b) 用final修飾,所有對象該方法的行為一致
返回的 Class 對象是由所表示類的 static synchronized 方法鎖定的對象。實際結果類型是 Class<? extends |X|>,其中 |X| 表示清除表達式中的靜態類型,該表達式調用 getClass。
- public String toString()
返回該對象的字符串表示。通常,toString 方法會返回一個“以文本方式表示”此對象的字符串。結果應是一個簡明但易于讀懂的信息表達式。建議所有子類都重寫此方法。
Object中toString的默認實現是返回一個字符串,該字符串由類名(對象是該類的一個實例)、at 標記符“@”和此對象哈希碼的無符號十六進制表示組成。
getClass().getName() + “@” + Integer.toHexString(hashCode())
默認實現不能很好的體現對象,所以推薦子類都重寫toString()
重寫方式:
1. 根據關鍵域去重寫
2. 快捷鍵生成
- public boolean equals(Object obj)
指示其他某個對象是否與此對象“相等”。
equals 方法在非空對象引用上實現相等關系:
默認實現:
return this == obj ;
針對不同的類:
實體類:不同對象代表不同實體,采用默認實現即可
值類:關鍵域相等,就認為兩個對象相等,需要重寫equals方法
1. 自反性:對于任何非空引用值 x,x.equals(x) 都應返回 true。
2. 對稱性:對于任何非空引用值 x 和 y,當且僅當 y.equals(x) 返回 true 時,x.equals(y) 才應返回 true。
3. 傳遞性:對于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 應返回 true。
4. 一致性:對于任何非空引用值 x 和 y,多次調用 x.equals(y) 始終返回 true 或始終返回 false,前提是對象上 equals 比較中所用的信息沒有被修改。
5. 非空性:對于任何非空引用值 x,x.equals(null) 都應返回 false。
(Java語法沒有強制要求嚴格遵循這些原則,但是違反可能會對程序造成災難性的后果)
重寫:
a) 子類沒有新的要比較的屬性,就用instanceof進行判斷
Demo:
public boolean equals(Object obj) {
if(obj instanceof Demo) {
Demo demo = (Demo) obj ;
//用關鍵屬性進行比較
}
return false;
}
里氏替換原則
b) 子類有新的要比較的屬性,就用getClass()方法進行判斷
Demo:
public boolean equals(Object obj) {
if(obj == null || obj.getClass() != getClass() {
return false ;
}
Demo demo = (Demo) obj;
//用關鍵屬性進行比較
}
沒有遵循里氏替換原則
c) 快捷鍵生成
“==“ 和 equals 的區別
==:
a) 如果比較的是基本數據類型,判斷他們的值是否相等
b) 如果比較的是引用數據類型,判斷他們是否是同一個對象
equals:
a) 不能比較基本數據類型
b) 比較引用數據類型,如果沒有重寫Object的equals(),默認判斷是否是同一個對象
c) 如果重寫了,一般是根據對象的值進行判斷
Object 類的 equals 方法實現對象上差別可能性最大的相等關系;即,對于任何非空引用值 x 和 y,當且僅當 x 和 y 引用同一個對象時,此方法才返回 true(x == y 具有值 true)。
注意:當此方法被重寫時,通常有必要重寫 hashCode 方法,以維護 hashCode 方法的常規協定,該協定聲明相等對象必須具有相等的哈希碼。
- protected void finalize()
垃圾回收器回收該對象之前,會調用該方法
作用:可以釋放系統資源
注意事項:
a) 如果直接調用,相當于普通方法的調用,并不會回收該對象
b) 釋放系統資源最好不要放在該方法里面,推薦使用try…catch…finally
當垃圾回收器確定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。
子類重寫 finalize 方法,以配置系統資源或執行其他清除。
finalize 的常規協定是:當 JavaTM 虛擬機已確定尚未終止的任何線程無法再通過任何方法訪問此對象時,將調用此方法,除非由于準備終止的其他某個對象或類的終結操作執行了某個操作。finalize 方法可以采取任何操作,其中包括再次使此對象對其他線程可用;不過,finalize 的主要目的是在不可撤消地丟棄對象之前執行清除操作。例如,表示輸入/輸出連接的對象的 finalize 方法可執行顯式 I/O 事務,以便在永久丟棄對象之前中斷連接。
Object 類的 finalize 方法執行非特殊性操作;它僅執行一些常規返回。Object 的子類可以重寫此定義。
Java 編程語言不保證哪個線程將調用某個給定對象的 finalize 方法。但可以保證在調用 finalize 時,調用 finalize 的線程將不會持有任何用戶可見的同步鎖定。如果 finalize 方法拋出未捕獲的異常,那么該異常將被忽略,并且該對象的終結操作將終止。
在啟用某個對象的 finalize 方法后,將不會執行進一步操作,直到 Java 虛擬機再次確定尚未終止的任何線程無法再通過任何方法訪問此對象,其中包括由準備終止的其他對象或類執行的可能操作,在執行該操作時,對象可能被丟棄。
對于任何給定對象,Java 虛擬機最多只調用一次 finalize 方法。
finalize 方法拋出的任何異常都會導致此對象的終結操作停止,但可以通過其他方法忽略它
- protected Object clone()
創建并返回此對象的一個副本。“副本”的準確含義可能依賴于對象的類。
默認:淺拷貝
如何實現深拷貝:
a) 實現Cloneable接口
b) 調用super.clone(),完成基本數據類型的拷貝
c) 對所有的引用數據類型完成深拷貝(下一級也應該實現深拷貝)
這樣做的目的是,對于任何對象 x,表達式:
x.clone() != x為 true,表達式:
x.clone().getClass() == x.getClass()也為 true,但這些并非必須要滿足的要求。一般情況下:
x.clone().equals(x)為 true,但這并非必須要滿足的要求。
按照慣例,返回的對象應該通過調用 super.clone 獲得。如果一個類及其所有的超類(Object 除外)都遵守此約定,則 x.clone().getClass() == x.getClass()。
按照慣例,此方法返回的對象應該獨立于該對象(正被復制的對象)。要獲得此獨立性,在 super.clone 返回對象之前,有必要對該對象的一個或多個字段進行修改。這通常意味著要復制包含正在被復制對象的內部“深層結構”的所有可變對象,并使用對副本的引用替換對這些對象的引用。如果一個類只包含基本字段或對不變對象的引用,那么通常不需要修改 super.clone 返回的對象中的字段。
Object 類的 clone 方法執行特定的復制操作。首先,如果此對象的類不能實現接口 Cloneable,則會拋出 CloneNotSupportedException。注意,所有的數組都被視為實現接口 Cloneable。否則,此方法會創建此對象的類的一個新實例,并像通過分配那樣,嚴格使用此對象相應字段的內容初始化該對象的所有字段;這些字段的內容沒有被自我復制。所以,此方法執行的是該對象的“淺表復制”,而不“深層復制”操作。
Object 類本身不實現接口 Cloneable,所以在類為 Object 的對象上調用 clone 方法將會導致在運行時拋出異常。
總結
以上是生活随笔為你收集整理的c++ string类的常用方法_【常用类方法】Object的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jsp项目开发案例_Laravel中使用
- 下一篇: c++rpg黑框游戏_NO总本色出演断智