摘要:入隊(duì)列,即表示當(dāng)前對(duì)象已回收。時(shí),清空對(duì)象的屬性即執(zhí)行,再將對(duì)象加入該對(duì)象關(guān)聯(lián)的中。當(dāng)一個(gè)被掉之后,其相應(yīng)的包裝類對(duì)象會(huì)被放入中。原因是編譯程序?qū)崿F(xiàn)上的困難內(nèi)部類對(duì)象的生命周期會(huì)超過局部變量的生命期。
一個(gè)類的靜態(tài)成員在類的實(shí)例gc后,不會(huì)銷毀。
對(duì)象引用強(qiáng)度強(qiáng)引用Strong Reference
就是指在代碼之中普遍存在的,類似:“Object objectRef = new Obejct”。只要強(qiáng)引用還存在,永遠(yuǎn)不會(huì)被GC清理。
軟引用SoftReference
當(dāng)Jvm內(nèi)存不足時(shí)(內(nèi)存溢出之前)會(huì)被回收。
SoftReference很適合用于實(shí)現(xiàn)緩存。
ReferenceQueuereferenceQueue = new ReferenceQueue (); SoftReference softReference = new SoftReference (new Man(), referenceQueue); /*If this reference object has been cleared, either by the program or by the garbage collector, then this method returns null.*/ softReference.get(); //This method is invoked only by Java code; when the garbage collector enqueues references it does so directly, without invoking this method. softReference.enqueue(); //入隊(duì)列,即表示當(dāng)前Reference對(duì)象已回收。 //Tells whether or not this reference object has been enqueued softReference.isEnqueued();
弱引用WeakReference
弱引用的對(duì)象,只能生存到下一次GC前,當(dāng)GC工作時(shí),無論內(nèi)存是否足夠,都會(huì)回收掉弱引用關(guān)聯(lián)的對(duì)象。
GC時(shí),清空Reference對(duì)象的referent屬性(即執(zhí)行Reference.clear()),再將Reference對(duì)象加入該對(duì)象關(guān)聯(lián)的ReferenceQueue中。
ReferenceQueuequeue = new ReferenceQueue (); WeakReference ref = new WeakReference (new Man(), queue); Assert.assertNotNull(ref.get()); Object obj = null; obj = queue.poll(); Assert.assertNull(obj); System.gc(); Assert.assertNull(ref.get()); Thread.sleep(10);// 入隊(duì)列操作較慢,要等一下。 obj = queue.poll(); Assert.assertNotNull(obj);
虛引用PhantomReference
一個(gè)虛引用的對(duì)象,隨時(shí)都會(huì)被gc。為一個(gè)對(duì)象設(shè)置虛引用關(guān)聯(lián)的唯一目的就是希望能在這個(gè)對(duì)象被GC回收時(shí)收到一個(gè)系統(tǒng)通知。
phantomReference.get方法永遠(yuǎn)返回null, 當(dāng)從內(nèi)存中刪除時(shí),調(diào)用isEnqueued會(huì)返回true
為什么要用ReferenceQueue
Object obj = new Object(); Ref ref = new Ref(obj);
對(duì)于以上代碼,我們希望當(dāng)一個(gè)對(duì)象被gc掉的時(shí)候通知用戶線程,進(jìn)行額外的處理時(shí),就需要使用引用隊(duì)列ReferenceQueue。當(dāng)一個(gè)obj被gc掉之后,其相應(yīng)的包裝類ref對(duì)象會(huì)被放入queue中。我們可以從queue中獲取到相應(yīng)的對(duì)象信息,進(jìn)行額外的處理。比如反向操作,數(shù)據(jù)清理等。
比如weakHashMap使用weakReference當(dāng)作key來進(jìn)行數(shù)據(jù)的存儲(chǔ),當(dāng)key中的引用被gc掉之后,它不是自動(dòng)將相應(yīng)的entry給移除掉,而是我們調(diào)用get,size,put等方法時(shí),weakHashMap從key的ReferenceQueue中獲取引用信息,從而使得被gc掉的key值所對(duì)應(yīng)的entry從map中被移除,然后再處理我們的業(yè)務(wù)調(diào)用。
類的初始化對(duì)于有static final 修飾的變量的類,當(dāng)引用該變量時(shí),該類不會(huì)被構(gòu)造。
對(duì)于有static變量的類,當(dāng)?shù)谝淮螌?shí)例化該類,則靜態(tài)變量會(huì)初始化,第二次不會(huì)。
父類靜態(tài)屬性?-> 父類靜態(tài)塊?-> 子類靜態(tài)屬性?-> 子類靜態(tài)塊?-> 父類屬性?-> 父類塊?-> 父類構(gòu)造器?-> 子類屬性 -> 子類塊 -> 子類構(gòu)造器???
相同等級(jí)下先定義的先初始化。
class SuperClass{ public SuperClass(){ System.out.println("SuperClass of constructor"); m(); } public void m(){ System.out.println("SuperClass.m()"); } } public class SubClassTest extends SuperClass { private int i = 10; public SubClassTest(){ System.out.println("SubClass of constructor"); super.m(); m(); } public void m(){ System.out.println("SubClass.m(): i = " + i); } }
測試:
SuperClass t = new SubClassTest();
在生成對(duì)象時(shí),父類調(diào)用的M()方法,不是父類的 M()方法,而是子類中被重寫了的M()方法!!子類的private int i 也被父類訪問到,和private的成員只能在本類使用的原則相違背。其實(shí)我們說的這條原則是編譯期間所遵守的,在JAVA程序的編譯期間,它只檢查語法的合法性,在JAVA的JVM中,即運(yùn)行期間,不管你聲明的什么,對(duì)于JVM來說都是透明的,而動(dòng)態(tài)引用是在運(yùn)行期間執(zhí)行的,所以能拿到SubClass的private成員,只是此時(shí)還沒執(zhí)行 i = 10,所以只能將i賦予初值0。
抽象類和接口記住一個(gè)原則:接口目的是抽象,抽象類目的是復(fù)用;
接口可以繼承接口,一個(gè)抽象類或具體類可以實(shí)現(xiàn)多個(gè)接口(對(duì)于模塊功能擴(kuò)展,不需要修改原有接口)。
抽象類在實(shí)現(xiàn)接口中可以不用實(shí)現(xiàn)接口的所有方法。
接口的方法都是抽象方法。抽象類比接口靈活(彈性),多層抽象類的繼承可以讓整個(gè)主體更有擴(kuò)展性和層次性。
當(dāng)一個(gè)類實(shí)現(xiàn)一個(gè)接口時(shí),如果不能完全實(shí)現(xiàn)就把這個(gè)類寫作抽象類,就跟一個(gè)類如果不能實(shí)現(xiàn)他所繼承的抽象類的全部抽象方法,那這個(gè)類也要命名為抽象類。
接口中定義變量必須為public static final,一般默認(rèn),可省略。
就是在對(duì)象的方法內(nèi)部定義的類。而該局部內(nèi)部類中的方法訪問該局部內(nèi)部類所在的方法中的局部變量時(shí),該局部變量要加上final。
原因是:編譯程序?qū)崿F(xiàn)上的困難:內(nèi)部類對(duì)象的生命周期會(huì)超過局部變量的生命期。當(dāng)該方法被調(diào)用時(shí),該方法中的局部變量在棧中被創(chuàng)建,當(dāng)方法調(diào)用結(jié)束時(shí),退棧,這些局部變量全部死亡。而內(nèi)部類生命期,與其它類一樣,只有沒有其它人再引用它時(shí),它才能死亡。
為什么局部變量定義為final可以呢?因?yàn)閒inal變量為不可改變,編譯程序具體實(shí)現(xiàn):將所有的局部內(nèi)部類對(duì)象要訪問的final型局部變量,拷貝到局部內(nèi)部類中。
在Java8中,這種限制被新的概念“effectively final”取代了。它的意思是你可以聲明為final,也可以不聲明final但是要按照final來用,也就是一次賦值永不改變。即保證它加上final前綴后不會(huì)出編譯錯(cuò)誤。
注:不管變量是不是final,他的生命周期都在于{}中。
泛型使得類型錯(cuò)誤可以在編譯時(shí)被捕獲,而不是在運(yùn)行時(shí)當(dāng)作 ClassCastException 展示出來;消除強(qiáng)制類型轉(zhuǎn)換,這使得代碼更加可讀。
類型擦除:
C#里面泛型無論在程序源碼中、編譯后的IL中(Intermediate Language,中間語言,這時(shí)候泛型是一個(gè)占位符)或是運(yùn)行期的CLR中都是切實(shí)存在的,List
Java泛型只在程序源碼中存在,在編譯后的字節(jié)碼文件中,就已經(jīng)被替換為原來的原生類型(Raw Type),并且在相應(yīng)的地方插入了強(qiáng)制轉(zhuǎn)型代碼,因此對(duì)于運(yùn)行期的Java來說,ArrayList
所以以下代碼method()無法重載:
public?class?GenericTypes?{?? ?? ???public?static?void?method(List?list)?{?? ??????......?? ???}? ? ???public?static?void?method(List ?list)?{?? ???????...... ???}?? }?
?
方法的Signature屬性是在字節(jié)碼層面存儲(chǔ)一個(gè)方法的特征簽名,這個(gè)屬性中保存了參數(shù)化類型的信息。雖然擦除法對(duì)方法體的源碼的字節(jié)碼進(jìn)行類型擦除,但由于Signature,我們還是能通過反射API取得參數(shù)化類型。?
對(duì)象引用一個(gè)父類對(duì)象的引用指向一個(gè)子類對(duì)象,從編譯角度,該引用只能調(diào)用父類中定義的方法和變量;如果子類中重寫了父類中的一個(gè)方法,那么會(huì)調(diào)用子類中的這個(gè)方法;變量不能被重寫(覆蓋),”重寫“的概念只針對(duì)方法。
對(duì)象引用在內(nèi)存中兩個(gè)對(duì)象都生成了,子類、父類變量都生成了。
class Father { String name = "Father"; public void func1() { func2(); // 若子類實(shí)現(xiàn)了func2(),則調(diào)用子類的func2() } public void func2() { System.out.println("Father func2"); } } class Child extends Father { String name = "Child"; public void func2() { System.out.println("Child func2"); } }
測試:
Child child1 = new Child(); Father child2 = new Child(); child2.func1(); // Child func2 // 與方法重載不同,屬性是無法重載的,屬性跟類型走 System.out.println(child1.name); // Child System.out.println(child2.name); // FatherEnum
Enum用于數(shù)據(jù)結(jié)構(gòu)是穩(wěn)定的,而且數(shù)據(jù)個(gè)數(shù)是有限的“數(shù)據(jù)集”。
//其內(nèi)部實(shí)現(xiàn) public abstract class Enum> implements Comparable , Serializable public enum Man { //wangliqiu、centifocus必定是public static final。 wangliqiu, centifocus; public String name; public int age; public String sex; } //類比以上enum public static class Man { public static final Man wangliqiu = new Man(); public static final Man centifocus = new Man(); public String name; public int age; public String sex; }
示例:
public enum ColorEnum { red, // green, // yellow, // blue; } public static void main(String[] args) { ColorEnum colorEnum = ColorEnum.blue; switch (colorEnum) { case red: System.out.println("color is red"); break; case blue: System.out.println("color is blue"); break; } // 遍歷 for (ColorEnum color : ColorEnum.values()) { System.out.println(color); } System.out.println("枚舉索引位置:" + ColorEnum.red.ordinal());// 0 // 枚舉默認(rèn)實(shí)現(xiàn)java.lang.Comparable接口,因?yàn)镋NUM抽象類實(shí)現(xiàn)了。 System.out.println(ColorEnum.red.compareTo(ColorEnum.green));// -1 }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/67273.html
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來。注意中,對(duì)象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來。注意中,對(duì)象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來。注意中,對(duì)象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:原文地址對(duì)象和對(duì)象的區(qū)別對(duì)象和對(duì)象使用說明,需要的朋友可以參考下。同樣,對(duì)象也不能使用方法。學(xué)習(xí)開始就應(yīng)當(dāng)樹立正確的觀念,分清對(duì)象和對(duì)象之間的區(qū)別,之后學(xué)習(xí)就會(huì)輕松很多的。 原文地址:http://www.cnblogs.com/yellow... DOM對(duì)象和JQuery對(duì)象的區(qū)別 jQuery對(duì)象和DOM對(duì)象使用說明,需要的朋友可以參考下。jQuery對(duì)象和DOM對(duì)象第一次學(xué)習(xí)jQ...
摘要:對(duì)象的分類內(nèi)置對(duì)象原生對(duì)象就是語言預(yù)定義的對(duì)象,在標(biāo)準(zhǔn)定義,有解釋器引擎提供具體實(shí)現(xiàn)宿主對(duì)象指的是運(yùn)行環(huán)境提供的對(duì)象。不過類型是中所有類型的父級(jí)所有類型的對(duì)象都可以使用的屬性和方法,可以通過的構(gòu)造函數(shù)來創(chuàng)建自定義對(duì)象。 對(duì)象 javaScript中的對(duì)象,和其它編程語言中的對(duì)象一樣,可以比照現(xiàn)實(shí)生活中的對(duì)象來理解。在JavaScript中,一個(gè)對(duì)象可以是一個(gè)單獨(dú)擁有屬性和類型的實(shí)體。和...
摘要:對(duì)象是什么在中,一個(gè)對(duì)象就像一個(gè)單獨(dú)擁有屬性和類型的實(shí)體。一個(gè)杯子作為一個(gè)對(duì)象,杯子有顏色重量等屬性。同樣,對(duì)象也有屬性定義它的特征。方法是關(guān)聯(lián)到某個(gè)對(duì)象的函數(shù),或者說,一個(gè)方法是一個(gè)值為某個(gè)函數(shù)的對(duì)象屬性。 對(duì)象是什么 在JavaScript中,一個(gè)對(duì)象就像一個(gè)單獨(dú)擁有屬性和類型的實(shí)體。一個(gè)杯子作為一個(gè)對(duì)象,杯子有顏色、重量等屬性。同樣,JavaScript對(duì)象也有屬性定義它的特征。...
閱讀 1481·2021-11-17 09:33
閱讀 1260·2021-10-11 10:59
閱讀 2892·2021-09-30 09:48
閱讀 1905·2021-09-30 09:47
閱讀 3024·2019-08-30 15:55
閱讀 2337·2019-08-30 15:54
閱讀 1493·2019-08-29 15:25
閱讀 1646·2019-08-29 10:57