java中int,初探Object in java

 2023-10-27 阅读 34 评论 0

摘要:為什么80%的碼農都做不了架構師?>>> ?? java中int、object類是類層次的根,每個類都有一個作為父類的Object。所有的對象,包含數組,實現了該類的方法。?? ?final native Class<?> getClass(); ?? ?返回該對象運行時的class,

為什么80%的碼農都做不了架構師?>>> ??hot3.png

java中int、object類是類層次的根,每個類都有一個作為父類的Object。所有的對象,包含數組,實現了該類的方法。

?? ?final native Class<?> getClass();
?? ?返回該對象運行時的class,返回的Class對象是由代表類的static synchronized方法。實際的結果類型是Class<? extends |X|>? ,|X|在getClass被調用后執行表達式的靜態類型擦除,如:下代碼段沒有類型轉換處理:
?? ??? ?Number n = 0;
?? ??? ?Class<? extends Number> c = n.getClass();
?? ?
?? ?final natve int hashCode();
?? ?返回對象的hash code值,為支持hash tables的特性,如通過java.util.HashMap提供
?? ?通常hashCode定義是:
?? ??? ?一個java應用程序執行期間,不論何時,不止一次的對同一對象的調用,hashCode方法必須始終返回相同的整數,在對象被修改沒有提供相等比較信息。這個整數不需要保持一致,從一個應用到另一個相同的應用中。
?? ??? ?如果根據equals方法比較2個對象相等,則分別調用2個對象的hashCode方法必須產生相同的整數結果。
?? ??? ?如2個不相等的對象,則分別調用2個對象的hashCode方法產生不同的值。這點不是要求的,然而,程序員考慮為不同對象生成不同hashCode值可以提高hash tables的性能。
?? ?通過Object類定義hashCode方法為不同對象生成不同hashCode值,是合理可行的(通常是轉換對象內部地址到一個整數,但這不是java語言實現的)

?? ?boolean equals(Object obj)
?? ?表明是否有其他對象”等于“該對象,該方法實現在一個non-null object引用的等價關系:
?? ?自反性:non-null引用的值x,x.equals(x)應該返回true
?? ?對稱性:non-null引用的值x、y,當且僅當y.equals(x)為true,則x.equals(y)應該?? ??? ??? ? 為true;
?? ?傳遞性:non-null引用的值x、y、z,如果x.equals(y)為true,y.equals(z)為?? ??? ??? ??? ?true,則x.equals(z)應該為true;
?? ?一致性: non-null引用的值x、y ,多次調用x.equals(y)一致的返回true或false,在對象被修改沒有提供相等比較信息;
?? ? 任何non-null引用的值x,x.equals(null)應該返回false;
?? ?equals方法為Object實現了最有可能確定對象的等價關系。對于non-null引用的值x、y,當且僅當x和y引用同一個對象(x == y)時,則該方法返回true。注意,通常需要重寫該方法,每次重寫該方法時,保持通常hashCode定義方法,指出相等對象必須有相等的hashCode值

?? ?native Object clone();
?? ?創建并返回此對象的拷貝,拷貝的精度取決于該對象的類。總的意圖是,對于任何對象x,這表達式:
?? ??? ?x.clone() != x;//返回true
?? ??? ?x.clone().getClass() == x.getClass();//將返回true,但這些不是絕對要求
?? ?然而,通常x.clone().equals(x) 返回true,但這些不是絕對要求。
?? ?通常約定,返回對象通過調用super.clone方法應該可獲取的。如果一個類和它所有的超類(除Object)服從這個約定, x.clone().getClass() == x.getClass();//將返回true
?? ?通常約定,此方法返回的對象應該獨立于該對象。為了實現這種獨立性,可能需要在該方法返回它之前修改一個or多個返回對象的字段,這意味著,copy任何可變對象(包括內部的”深層結構“)被克隆對象的副本替換對這些對象的引用。如果一個類僅包含原始字段or引用不可變的對象,此時通過clone返回的對象沒有字段需要修改。
?? ?若對象的class沒有實現Cloneable接口,則拋出CloneNotSupportedException。注意所有的數組被認為是實現了Cloneable接口并且clone方法返回一個數組類型T[],T為任何引用或原始類型。否則,這個方法創建一個該對象類的一個新實例,并初始化所有該對象相關的字段內容,如分配,字段內容沒有自己克隆,因此,該方法執行了該對象的”shallow copy“,不是”deep copy“操作

?? ?String toString();
?? ?返回對象的字符串表現形式,通常該方法返回該對象的的”文本表示“的一個字符串,結果應該是信息簡明,信息表現便于人閱讀,建議所有子類重寫此方法,返回一個字符串組成類的名稱的對象的一個實例,和符號@,和該對象hashCode無符號十六進制的表現形式,既:
getClass().getName() + '@' + Integer.toHexString(hashCode())

?? ?final native void notify();
?? ?在對象監控上喚醒一個正在等待的線程,若該對象上任何線程都在等待,選擇其中的一個被喚醒,選擇是任意的,取決于discretion的實現。一個線程在對象監控上等待,可以通過調用一個wait方法。
?? ?被喚醒的線程將無法繼續進行,直到當前線程釋放此對象上的鎖。被喚醒的線程以常規方式與任何其他可能線程競爭同步對象。如,被喚醒的線程在鎖定此對象的下一個線程有不可靠的特權和缺點。
?? ?此方法只能被一個擁有此對象監視器的線程調用,一個線程成為對象監視器的擁有者通過下面3種方法之一:
?? ??? ?通過執行一個同步的該對象的實例方法;
?? ??? ?通過執行一個同步的語句塊(同步對象);
?? ??? ?對于Class的對象,通過執行類的synchronized static方法;
?? ?一次只能有一個線程擁有對象監視器,若當前的線程不是對象監視器的擁有者,則拋出IllegalMonitorStateException

?? ?
?? ?final native void notifyAll();
?? ?喚醒對象監視器上所有等待的線程,一個線程在對象監控上等待,可以通過調用一個wait方法。

?? ?final native void wait(long timeout);
?? ?使當前線程等待直到另一個線程調用notify/notifyAll方法,或者一個指定的時間已經過去。
?? ?當前線性必須是對象監視器擁有者。該方法使當前線程T為該對象將自己等待,然后放棄此對象上任何和所有的同步請求,線程T在線程調度上將變成disable并處于休眠狀態,直到有如下事情發生:
?? ??? ?一些其他的線程為該對象調用notiy方法并且線程T正好是任意選擇的線程被喚醒;
?? ??? ?一些其他的線程為該對象調用notiyAll方法;
?? ??? ?一些其他的線程中斷了線程T;
?? ??? ?指定的實際時間已過,或多或少。如果timeout為0,不考慮實際時間和線程只是等待通知;
?? ?然后線程T從等待集中移除為該對象和重新進行線程調度。它以常規方式與任何其他可能線程競爭同步對象,一旦它獲得了對象的控制,該對象上的所有同步請求將被恢復到原狀。這是wait方法被調用根據時間的情況。線程T從調用wait方法調用返回,因此,在wait方法返回,對象同步的狀態和線程T狀態都精確的到wait方法調用后。
?? ?一個線程也可以不使用notify,interrupted,timing out來喚醒,稱”偽喚醒“,然而,這很少發生在實際上,應用必須防范的測試需要被喚醒的線程,且如條件不滿足繼續等待。換言之,等待總是發生在循環中,如:
?? ??? ?synchronized (obj) {
? ?? ??? ??? ? while (<condition does not hold>)
????? ??? ??? ??? ?obj.wait(timeout);
?? ??? ??? ??? ? ... // Perform action appropriate to condition
?? ??? ?}
?? ?若當前線程被中斷在任何線程之前或在其等待期間,則拋出InterruptedException,該異常不拋出知道此對象的鎖定狀態已經恢復。
?? ?注意wait方法,為該對象將當前線程設置等待,只有這個對象解鎖;任何其他對象在當前線程可以同步,線程等待時仍處于鎖定。 此方法只能被一個擁有此對象監視器的線程調用。

?void finalize()
?調用垃圾收集器在垃圾收集對象確定沒有其他對象的引用。子類可重寫該方法處理系統資源或執行其他cleanup。
?若jvm已經調用該方法,不再有任何方法通過活動線程來訪問這個對象,除非由于準備終結一些其他對象or類采取動作的結果。
?finalize方法可以采取任何操作,包括再次使此對象對其他線程可用;不過,通常其目的是在不可撤銷的丟棄對象之前執行清除操作。
?如:表示輸入/輸出連接的對象的 finalize 方法可執行顯式 I/O 事務,以便在永久丟棄對象之前中斷連接。
?Object 類的 finalize 方法執行非特殊性操作;它僅執行一些常規返回。Object 的子類可以重寫此定義。
?Java 編程語言不保證哪個線程將調用某個給定對象的 finalize 方法。但可以保證在調用 finalize 時,調用 finalize 的線程將不會持有任何用戶可見的同步鎖定。如果 finalize 方法拋出未捕獲的異常,那么該異常將被忽略,并且該對象的終結操作將終止。
?在啟用某個對象的 finalize 方法后,將不會執行進一步操作,直到 Java 虛擬機再次確定尚未終止的任何線程無法再通過任何方法訪問此對象,其中包括由準備終止的其他對象或類執行的可能操作,在執行該操作時,對象可能被丟棄。
?對于任何給定對象,Java 虛擬機最多只調用一次 finalize 方法。
?finalize 方法拋出的任何異常都會導致此對象的終結操作停止,但可以通過其他方法忽略它。

轉載于:https://my.oschina.net/rksi5/blog/226252

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/164384.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息