国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

對(duì)象

nanfeiyan / 2266人閱讀

摘要:入隊(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)緩存。

ReferenceQueue referenceQueue = 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中。

ReferenceQueue queue = 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),可省略。

局部內(nèi)部類

就是在對(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與List就是兩個(gè)不同的類型,它們在系統(tǒng)運(yùn)行期生成,有自己的虛方法表和類型數(shù)據(jù),這種實(shí)現(xiàn)稱為類型膨脹,是真實(shí)泛型。?
Java泛型只在程序源碼中存在,在編譯后的字節(jié)碼文件中,就已經(jīng)被替換為原來的原生類型(Raw Type),并且在相應(yīng)的地方插入了強(qiáng)制轉(zhuǎn)型代碼,因此對(duì)于運(yùn)行期的Java來說,ArrayList與ArrayList就是同一個(gè)類。這種實(shí)現(xiàn)方法稱為類型擦除,是偽泛型。

所以以下代碼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);    // Father


Enum

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

相關(guān)文章

  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你的“對(duì)象”還好嗎?

    摘要:很多情況下,通常一個(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); 馬上就要到七夕了,離年底老媽老爸...

    李昌杰 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你的“對(duì)象”還好嗎?

    摘要:很多情況下,通常一個(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); 馬上就要到七夕了,離年底老媽老爸...

    Lyux 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你的“對(duì)象”還好嗎?

    摘要:很多情況下,通常一個(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); 馬上就要到七夕了,離年底老媽老爸...

    AaronYuan 評(píng)論0 收藏0
  • JS對(duì)象和jQuery對(duì)象

    摘要:原文地址對(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...

    mtunique 評(píng)論0 收藏0
  • JavaScript對(duì)象

    摘要:對(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í)體。和...

    xavier 評(píng)論0 收藏0
  • JavaScript-對(duì)象

    摘要:對(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ì)象也有屬性定義它的特征。...

    xeblog 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<