Java內部類的實現(xiàn)-創(chuàng)新互聯(lián)

內部類可以分為:

成都創(chuàng)新互聯(lián)自2013年創(chuàng)立以來,先為陽江等服務建站,陽江等地企業(yè),進行企業(yè)商務咨詢服務。為陽江企業(yè)網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。

靜態(tài)內部類。

非靜態(tài)內部類。

非靜態(tài)內部類又可以分為:

成員內部類。

方法內部類。

匿名內部類。

靜態(tài)內部類

我感覺這個是用的最多的,你比如說Redis的key的設計, 因為我們要中間拼接:號,所以用靜態(tài)內部類去組成不同的key是非常好的,這樣可以讓相同類型的key在同一個文件目錄下
Java內部類的實現(xiàn)

靜態(tài)內部類的定義和普通的靜態(tài)變量或者靜態(tài)方法的定義方法是一樣的,使用static關鍵字,只不過這次static是修飾在class上的,一般而言,只有靜態(tài)內部類才允許使用static關鍵字修飾,普通類的定義是不能用static關鍵字修飾的,這一點需要注意一下。

下面定義一個靜態(tài)內部類:

public class Out {

private static String name;

private int age;

public static class In{

   private int age;

   public void sayHello(){

     System.out.println("my name is : "+name);

     //--編譯報錯---

     //System.out.println("my age is :"+ age);

   }

}

}

在上述代碼中,In這個類就是一個靜態(tài)內部類。我們說內部類是可以訪問外部類的私有字段和私有方法的,對于靜態(tài)內部類,它遵循一致的原則,只能訪問外部類的靜態(tài)成員。

上述代碼中,外部類的非靜態(tài)私有字段age在靜態(tài)內部類中是不允許訪問的,而靜態(tài)字段name則是可訪問的。下面我們看,如何創(chuàng)建一個靜態(tài)內部類的實例對象。

public static void main(String [] args){

Out.In innerClass = new Out.In();

innerClass.sayHello();

}

使用場景,一般來說,對于和外部類聯(lián)系緊密但是并不依賴于外部類實例的情況下,可以考慮定義成靜態(tài)內部類。下面我們看稍顯復雜的成員內部類。

成員內部類

我們說了,四種不同類型的內部類都各自有各自的使用場景,靜態(tài)內部類適合于那種和外部類關系密切但是并不依賴外部類實例的情況。但是對于需要和外部類實例相關聯(lián)的情況下,可以選擇將內部類定義成成員內部類。

以下代碼定義了一個簡單的成員內部類:

public class Out {

private String name;

public void showName(){   System.out.println("my name is : "+name); } public class In{   public void sayHello(){     System.out.println(name);     Out.this.showName();   } }

}

以上定義了一個簡單的內部類In,我們的成員內部類可以直接訪問外部類的成員字段和成員方法,因為它是關聯(lián)著一個外部類實例的。下面我們看看在外部是如何創(chuàng)建該內部類實例的。

public static void main(String [] args){

Out out = new Out();

out.setName("六脈神劍")

Out.In in = out.new In();

in.sayHello();

}

因為成員內部類是關聯(lián)著一個具體的外部類實例的,所以它的實例創(chuàng)建必然是由外部類實例來創(chuàng)建的。

對于實例的創(chuàng)建,我們只需要記住即可,成員內部類的實例創(chuàng)建需要關聯(lián)外部類實例對象,靜態(tài)內部類實例創(chuàng)建相對簡單。下面我們主要看看在編譯階段編譯器是如何保持內部類對外部類成員信息可訪問的。

使用場景,對于那種要高度依賴外部類實例的情況下,定義一個成員內部類則會顯的更加明智。

方法內部類

方法內部類,顧名思義,定義在一個方法內部的類。方法內部類相對而言要復雜一些,下面定義一個方法內部類:

public class Out {

private String name;

public void sayHello(){

   class In{

     public void showName(){

       System.out.println("my name is : "+name);

     }

   }

   In in = new In();

   in.showName();

}}

我們定義了一個類,在該類中又定義了一個方法sayHello,然而在該方法中我們定義了一個內部類,類In就是一個方法內部類。我們的方法內部類的生命周期不超過包含它的方法的生命周期,也就是說,方法內部類只能在方法中使用。所以在聲明的時候,任何的訪問修飾符都是沒有意義的,于是Java干脆不允許使用任何的訪問修飾符修飾方法內部類。

其中還需要注意一點的是,定義和使用時兩回事,別看那一大串定義類的代碼,你實際想要使用該類,就必須new對象,而對于方法內部類而言,只能在方法內部new對象。這就是方法內部類的簡單介紹,下面我們看看其實現(xiàn)原理。

有關方法內部類的實現(xiàn)原理其實是和成員內部類差不太多的,也是在內部類初始化的時候為其傳入一個外部類實例,區(qū)別在哪呢?就在于方法內部類是定義在具體方法的內部的,所以該類除了可以通過傳入的外部實例訪問外部類中的字段和方法,對于包含它的方法中被傳入的參數(shù)也會隨著外部類實例一起初始化給內部類。

毋庸置疑的是,方法內部類的封裝性比之前介紹的兩種都要完善。所以一般只有在需要高度封裝的時候才會將類定義成方法內部類。

匿名內部類

可能內部類的所有分類中,匿名內部類的名號是大的,也是我們最常用到的,多見于函數(shù)式編程,lambda表達式等。下面我們重點看看這個匿名內部類。

匿名內部類就是沒有名字的內部類,在定義完成同時,實例也創(chuàng)建好了,常常和new關鍵字緊密結合。當然,它也不局限于類,也可以是接口,可以出現(xiàn)在任何位置。

下面我們定義一個匿名內部類:

如果您必須重寫類或接口的方法,則應該使用它??梢酝ㄟ^兩種方式創(chuàng)建Java匿名內部類

//首先定義一個普通類

public class Out {

private String name;

public void sayHello(){

   System.out.println("my name is :" + name);

}

}

~

//定義和使用一個匿名內部類

public static void main(String [] args){

Out out = new Out(){

   @Override

   public void sayHello(){

     System.out.println("my name is cyy");

   }

   public void showName(){

     System.out.println("hello single");

   }

};

out.sayHello();

}

從上述代碼中可以很顯然的讓我們看出來,我們的匿名內部類必定是要依托一個父類的,因為它是沒有名字的,無法用一個具體的類型來表示。所以匿名內部類往往都是通過繼承一個父類,重寫或者重新聲明一些成員來實現(xiàn)一個匿名內部類的定義。實際上還是利用了里式轉換原理。

其實在看了上述三種內部類的原理之后,反而覺得匿名內部類的實現(xiàn)較為簡單了。主要思路還是將內部類抽離出來,通過初始化傳入外部類的實例以達到對外部類所有成員的訪問。只是在匿名內部類中,被依托的父類不是他的外部類。

匿名內部類的主要特點在于,沒有名字,對象只能被使用一次,可以出現(xiàn)在任意位置。所以它的使用場景也是呼之欲出,對于一些對代碼簡潔度有所要求的情況下,可選匿名內部類。

總結

以上完成了對四種內部類的簡單介紹,對于他們各自實現(xiàn)的原理也都已經介紹過了。其實大致相同,由于jvm對每個類都要求一個單獨的源碼文件,所以編譯階段就完成了分離的操作,但是在分離的過程中又要保持內部類和外部類之間的這種聯(lián)系,于是編譯器添加了一些接口保持這種信息共享的結構。

使用內部類可以大大增加程序的封裝性,使得代碼整體簡潔度較高。

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

網站題目:Java內部類的實現(xiàn)-創(chuàng)新互聯(lián)
網站地址:http://www.bm7419.com/article20/cdjgjo.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供用戶體驗、標簽優(yōu)化定制網站、網站設計、搜索引擎優(yōu)化、域名注冊

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都做網站