最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Java內(nèi)部類與靜態(tài)內(nèi)部類的區(qū)別

 更新時間:2023年06月26日 09:28:26   作者:單程車票  
本文主要介紹了淺談Java內(nèi)部類與靜態(tài)內(nèi)部類的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

本篇記錄一下最近看過的面試問題:內(nèi)部類與靜態(tài)內(nèi)部類的區(qū)別?

下面將以較短的篇幅來講解該面試題的知識要點,如果看完題目還沒有想到答案的讀者們可以往下閱讀這篇文章,希望能給你帶來一些收獲。

內(nèi)部類是什么?

在講解內(nèi)部類與靜態(tài)內(nèi)部類的區(qū)別之前,先來看看內(nèi)部類是什么,為什么 Java 需要內(nèi)部類?

內(nèi)部類是指定義在另一個類中的類,它可以訪問外部類的成員變量和方法,并且可以被外部類的其他成員所使用。

為什么需要使用內(nèi)部類呢?主要有以下兩點原因(這里引用 Java 核心技術(shù)卷1 的兩句話):

  • 內(nèi)部類可以對同一個包中的其他類隱藏。
  • 內(nèi)部類方法可以訪問定義這個類的作用域中的數(shù)據(jù),包括原本私有的數(shù)據(jù)。

通過代碼來講解內(nèi)部類的兩個特點

/**
?* 內(nèi)部類測試
?* @author 單程車票
?*/
public class InnerClassTest {
? ? public static void main(String[] args) {
? ? ? ? Tree tree = new Tree();
? ? ? ? tree.addNode(10);
? ? ? ? // Tree.Node = tree.new Node(10); // 編譯報錯,外部其他類無法使用內(nèi)部類 Node
? ? }
}
class Tree {
? ? private List<Node> nodes = new ArrayList<>();
? ? // 通過 private 修飾 Node 內(nèi)部類
? ? private class Node {
? ? ? ? private int value;
? ? ? ? public Node(int val) {
? ? ? ? ? ? value = val;
? ? ? ? }
? ? ? ? public void printLength() {
? ? ? ? ? ? System.out.println("插入節(jié)點值為:" + value);
? ? ? ? ? ? // 內(nèi)部類成員可以訪問外部類的私有數(shù)據(jù)
? ? ? ? ? ? // 更正規(guī)語法是 Tree.this.nodes.size()
? ? ? ? ? ? System.out.println("當(dāng)前長度為:" + nodes.size());
? ? ? ? }
? ? }
? ? // 添加 Node 方法(外部類的成員可以使用內(nèi)部類)
? ? public void addNode(int value) {
? ? ? ? Node node = new Node(value);
? ? ? ? nodes.add(node);
? ? ? ? node.printLength();
? ? }
}

運行結(jié)果:

通過上面的代碼可以看到,內(nèi)部類其實是可以使用 private 和 protected 這兩個訪問權(quán)限符來修飾的(外部類是無法通過這兩個訪問權(quán)限符修飾的),這也就說明了內(nèi)部類是可以通過這兩個訪問權(quán)限符來控制對外部其他類的隱藏的。

此外,通過上面的代碼還可以清晰的看到外部類 Tree 的方法(成員)可以訪問到外部類的作用域內(nèi)的變量,包括私有變量。這里的原理是在編譯時內(nèi)部類會被編譯為 外部類名 + $ + 內(nèi)部類名(Tree$Node.class)這樣一個類文件,也就是說編譯器對內(nèi)部類進(jìn)行了處理,與虛擬機(jī)無關(guān)。

可以看到,內(nèi)部類編譯后會生成一個構(gòu)造器,這個構(gòu)造器會比源碼多帶上一個參數(shù),這個參數(shù)的類型就是外部類 Tree,并且被保存在 this$0 字段中,到這里也就能說明其實內(nèi)部類在編譯后會通過構(gòu)造器將外部類的引用傳遞進(jìn)來,這樣內(nèi)部類可以持有外部類對象引用來訪問外部類的變量。
當(dāng)然,除了以上兩點原因之外,內(nèi)部類還可以解決 Java 單繼承的問題,由于篇幅問題這里就不再贅述了,有興趣的讀者們可以自行了解。

內(nèi)部類與靜態(tài)內(nèi)部類的區(qū)別?

接下來,就應(yīng)該談?wù)劽嬖囶}:內(nèi)部類與靜態(tài)內(nèi)部類的區(qū)別了,從題目中應(yīng)該也可以了解到內(nèi)部類其實細(xì)分為成員內(nèi)部類、局部內(nèi)部類、匿名內(nèi)部類和靜態(tài)內(nèi)部類。
所以,這道面試題其實問的就是非靜態(tài)內(nèi)部類和靜態(tài)內(nèi)部類的區(qū)別,也可以理解為成員內(nèi)部類和靜態(tài)內(nèi)部類的區(qū)別。關(guān)于剩下兩種內(nèi)部類,由于內(nèi)容過多且篇幅有限,這里就不做過多說明。

非靜態(tài)內(nèi)部類與靜態(tài)內(nèi)部類的區(qū)別?

非靜態(tài)內(nèi)部類:

  • 實例化:非靜態(tài)內(nèi)部類的實例化必須依賴于外部類的實例化,即需要先創(chuàng)建外部內(nèi)實例再創(chuàng)建非靜態(tài)內(nèi)部類實例(如下面代碼中的 new Inner().new InnerClass())。
  • 訪問外部類的變量和方法:非靜態(tài)內(nèi)部類可以訪問外部類的所有變量和方法(包括非靜態(tài)和靜態(tài))。
  • 聲明內(nèi)部類的變量和方法:非靜態(tài)內(nèi)部類可以聲明非靜態(tài)的變量和方法,但不可以聲明靜態(tài)的變量和方法。

靜態(tài)內(nèi)部類:

  • 實例化:靜態(tài)內(nèi)部類的實例化不依賴于外部類的實例化,即可以直接創(chuàng)建靜態(tài)內(nèi)部類實例(如下面代碼中的 new Inner.StaticInnerClass())。
  • 訪問外部類的變量和方法:靜態(tài)內(nèi)部類可以訪問外部類的靜態(tài)變量和靜態(tài)方法,但不可以訪問外部類的非靜態(tài)變量和非靜態(tài)方法。
  • 聲明內(nèi)部類的變量和方法:靜態(tài)內(nèi)部類可以聲明非靜態(tài)的和靜態(tài)的變量和方法。

給出代碼演示:

/**
?* 測試類
?* @author 單程車票
?*/
public class Inner {
? ? private String field = "外部非靜態(tài)字段";
? ? private static String staticField = "外部靜態(tài)字段";
? ? public void print() {
? ? ? ? System.out.println("外部非靜態(tài)方法");
? ? }
? ? public static void staticPrint() {
? ? ? ? System.out.println("外部靜態(tài)方法");
? ? }
? ? // 非靜態(tài)內(nèi)部類
? ? public class InnerClass {
? ? ? ? private String innerField = "內(nèi)部非靜態(tài)字段";
? ? ? ? // private static String innerStaticField = "內(nèi)部靜態(tài)字段"; // 編譯不通過,不支持 static 聲明
? ? ? ? public void innerPrint() {
? ? ? ? ? ? System.out.println("內(nèi)部非靜態(tài)方法");
? ? ? ? }
? ? ? ? // 編譯不通過,不支持 static 聲明
? ? ? ? // public static void innerStaticPrint() { System.out.println("內(nèi)部靜態(tài)方法"); }
? ? ? ? public void read() {
? ? ? ? ? ? System.out.println("讀取非靜態(tài)字段:" + field);
? ? ? ? ? ? System.out.println("讀取靜態(tài)字段:" + staticField);
? ? ? ? ? ? print(); // 調(diào)用非靜態(tài)方法
? ? ? ? ? ? staticPrint(); // 調(diào)用靜態(tài)方法
? ? ? ? }
? ? }
? ? // 靜態(tài)內(nèi)部類
? ? public static class StaticInnerClass {
? ? ? ? private String innerField = "內(nèi)部非靜態(tài)字段";
? ? ? ? private static String innerStaticField = "內(nèi)部靜態(tài)字段";
? ? ? ? public void innerPrint() {
? ? ? ? ? ? System.out.println("內(nèi)部非靜態(tài)方法");
? ? ? ? }
? ? ? ? ?public static void innerStaticPrint() {
? ? ? ? ? ? ? System.out.println("內(nèi)部靜態(tài)方法");
? ? ? ? ?}
? ? ? ? public void read() {
? ? ? ? ? ? // System.out.println("讀取非靜態(tài)字段:" + field); // 編譯不通過,無法讀取非靜態(tài)字段
? ? ? ? ? ? System.out.println("讀取靜態(tài)字段:" + staticField);
? ? ? ? ? ? // print(); // 編譯不通過,無法調(diào)用非靜態(tài)方法
? ? ? ? ? ? staticPrint(); // 調(diào)用靜態(tài)方法
? ? ? ? }
? ? }
? ? public static void main(String[] args) {
? ? ? ? // 非靜態(tài)內(nèi)部類實例化,依賴外部類
? ? ? ? Inner.InnerClass innerClass = new Inner().new InnerClass();
? ? ? ? // 靜態(tài)內(nèi)部類實例化,不依賴外部類
? ? ? ? Inner.StaticInnerClass staticInnerClass = new Inner.StaticInnerClass();
? ? }
}

使用靜態(tài)內(nèi)部類的時機(jī)?

只要內(nèi)部類不需要訪問外部類對象時,也就是不需要生成外部類對象引用時,就應(yīng)該使用靜態(tài)內(nèi)部類。

到此這篇關(guān)于淺談Java內(nèi)部類與靜態(tài)內(nèi)部類的區(qū)別的文章就介紹到這了,更多相關(guān)Java內(nèi)部類與靜態(tài)內(nèi)部類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java生產(chǎn)者消費者的三種實現(xiàn)方式

    Java生產(chǎn)者消費者的三種實現(xiàn)方式

    這篇文章主要介紹了Java生產(chǎn)者消費者的三種實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 小白也可以學(xué)會的Java NIO的Write事件

    小白也可以學(xué)會的Java NIO的Write事件

    剛開始對NIO的寫操作理解的不深,不知道為什么要注冊寫事件,何時注冊寫事件,為什么寫完之后要取消注冊寫事件,今天特地整理了本篇文章,需要的朋友可以參考下
    2021-06-06
  • 詳解Java中的checked異常和unchecked異常區(qū)別

    詳解Java中的checked異常和unchecked異常區(qū)別

    這篇文章主要介紹了詳解Java中的checked異常和unchecked異常區(qū)別,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • Java使用JSONPath解析JSON完整內(nèi)容詳解

    Java使用JSONPath解析JSON完整內(nèi)容詳解

    這篇文章主要介紹了Java使用JSONPath解析JSON完整內(nèi)容詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Spring Boot應(yīng)用Docker化的步驟詳解

    Spring Boot應(yīng)用Docker化的步驟詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot應(yīng)用Docker化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • Java實現(xiàn)的計算最大下標(biāo)距離算法示例

    Java實現(xiàn)的計算最大下標(biāo)距離算法示例

    這篇文章主要介紹了Java實現(xiàn)的計算最大下標(biāo)距離算法,涉及java針對數(shù)組的遍歷、運算等相關(guān)操作技巧,需要的朋友可以參考下
    2018-02-02
  • Quartz中的Job與JobDetail解析

    Quartz中的Job與JobDetail解析

    這篇文章主要介紹了Quartz中的Job與JobDetail解析,你定義了一個實現(xiàn)Job接口的類,這個類僅僅表明該job需要完成什么類型的任務(wù),除此之外,Quartz還需要知道該Job實例所包含的屬性;這將由JobDetail類來完成,需要的朋友可以參考下
    2023-11-11
  • SpringBoot返回對象時,如何將Long類型轉(zhuǎn)換為String

    SpringBoot返回對象時,如何將Long類型轉(zhuǎn)換為String

    這篇文章主要介紹了SpringBoot返回對象時,實現(xiàn)將Long類型轉(zhuǎn)換為String,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 解決swaggerUI頁面沒有顯示Controller方法的坑

    解決swaggerUI頁面沒有顯示Controller方法的坑

    這篇文章主要介紹了解決swaggerUI頁面沒有顯示Controller方法的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringBoot注解@EnableScheduling定時任務(wù)詳細(xì)解析

    SpringBoot注解@EnableScheduling定時任務(wù)詳細(xì)解析

    這篇文章主要介紹了SpringBoot注解@EnableScheduling定時任務(wù)詳細(xì)解析,@EnableScheduling 開啟對定時任務(wù)的支持,啟動類里面使用@EnableScheduling 注解開啟功能,自動掃描,需要的朋友可以參考下
    2024-01-01

最新評論

天全县| 玉龙| 苏州市| 化德县| 胶南市| 鄂托克前旗| 聂荣县| 绩溪县| 东源县| 黄山市| 利津县| 台州市| 武夷山市| 电白县| 巴彦淖尔市| 花莲县| 石嘴山市| 新巴尔虎左旗| 绩溪县| 祥云县| 武冈市| 台东县| 辉南县| 博白县| 宜丰县| 萨嘎县| 台湾省| 双桥区| 开封县| 肥城市| 吉安县| 调兵山市| 廊坊市| 藁城市| 大洼县| 门源| 贡山| 工布江达县| 自治县| 罗江县| 丰原市|