Java內部類總結

来源:https://www.cnblogs.com/brave7/archive/2018/03/01/8486034.html
-Advertisement-
Play Games

Java內部類 一、 含義 在Java編程語言里,程式是由類(class)構建而成的。在一個類的內部也可以聲明類,我們把這 樣的類叫做內部類。 二、 作用 實現了更好的封裝,我們知道,普通類(非內部類)的訪問修飾符不能為private或protected,而內部類可以。當我們將內部類聲明為priva ...


Java內部類

一、 含義

  在Java編程語言里,程式是由類(class)構建而成的。在一個類的內部也可以聲明類,我們把這

  樣的類叫做內部類。

二、 作用

  • 實現了更好的封裝,我們知道,普通類(非內部類)的訪問修飾符不能為private或protected,而內部類可以。當我們將內部類聲明為private時,只有外部類可以訪問內部類,很好地隱藏了內部類。
  • 內部類可以繼承(extends)或實現(implements)其他的類或介面,而不受外部類的影響。
  • 內部類可以直接訪問外部類的欄位和方法,即使是用private修飾的,相反的,外部類不能直接訪問內部類的成員。

三、 原理

  內部類是一個編譯時的概念,編譯後會生成兩個獨立的class文件,如下:

  public class Outer{
      private String outerName = "outer";
      class Inner{
          private String innerName = "inner";
      }
  }

 

     編譯後的文件如下圖:

 

  編譯後Outer.Inner被重命名為Outer$Inner,句點(.)被替換成了美元符號($)。

四、 分類

  Java內部類可分為成員內部類、局部內部類、匿名內部類、靜態內部類。

  1) 成員內部類

    成員內部類可以看成是外部類的一個成員,在成員內部類中無法聲明靜態成員,但static

    final欄位是個例外。我們知道載入類時,會先初始化靜態成員,如果成員內部類有靜態成

    員,那麼內部類就會在外部類之前生成,而內部類是為外部類服務的,內部類在外部類之

    前就生成可能會脫離掌控。在實例化成員內部類時,成員內部類會持有一個外部類當前對

    象的引用,這樣在成員內部類中就可以直接訪問外部類的成員,即使是private修飾的。

     import static java.lang.System.out;
    public class Outer{
    private String outerName = "outer";
    //外部類無法直接訪問內部類的成員,需要實例化內部類對象
      private Inner inner = new Inner(); 
      public class Inner{
          private  String innerName = "inner";
           public void show(){
             out.println(outerName); //可以直接訪問外部類的成員
          }
      }
      public void show(){
          out.println(inner.innerName);
           inner.show();
      }
      public static void main(String[] args){
          Outer outer = new Outer();
          outer.show();
           //實例化內部類
          Outer.Inner inner = outer.new Inner();
          inner.show();
      }
  }

  運行結果:

    inner

    outer

    outer

    成員內部類對外部類對象的引用,是通過在this前面加上外部類的名字構成的,這種形式叫作

  限定-this,out.println(outerName)與out.println(Outer.this.outerName)是等價的。

 2)  局部內部類

  局部內部類的使用和成員內部類的使用基本一致,只是局部內部類定義在外部類的方法中,就

  像局部變數一樣,並不是外部類的成員。局部內部類在方法外是無法訪問到的,但它的實例可

  以從方法中返回,並且實例在不再被引用之前會一直存在。局部內部類也可以訪問所在方法的

  局部變數、方法參數等,限制是局部變數或方法參數只有在聲明為final時才能被訪問。  

  import static java.lang.System.out;
  public class Outer{
      private String outerName = "outer";
      public void show(final String str){   //方法參數為final類型
          class Inner{
              public void print(){
                  out.println(outerName+str);
              }
          }
          Inner inner = new Inner();
          inner.print();
      }
      public static void main(String[] args){
          Outer outer = new Outer();
          outer.show(":lalala");
      }
  }

  運行結果:

      outer:lalala

3)  匿名內部類

  可以把匿名內部類想象成是沒有類名的局部內部類,匿名內部類有以下特點:

   1、匿名內部類不能有構造器,匿名內部類沒有類名,肯定無法聲明構造器。

   2、匿名內部類必須繼承或實現一個介面,指定給new的類型為匿名類的超類型,匿名類不

      能有顯示的extends或implements子句,也不能有任何修飾符。

   3、匿名內部類和成員內部類、局部內部類一樣,也不能聲明靜態成員。   

  import static java.lang.System.out;
  public class Outer{
       private String outerName = "outer";
       public void show(final String str){
             new Inner(){   //實現了Inner介面
                   public void print(){
                          out.println(outerName+str);
                    }
              }.print();
       }
       public static void main(String[] args){
               Outer outer = new Outer();
               outer.show(":lalala");
          }
  }
  interface Inner{
         void print();
  }

  運行結果:

      outer:lalala

4) 靜態內部類

  靜態內部類,有的書上也稱為嵌套類,聲明它時需要用static修飾符,靜態內部類不同於前三

  種內部類,靜態內部類不會持有外部類當前對象的引用,所以在靜態內部類中無法訪問外部

  類的非靜態成員,可以這麼說,靜態內部類不依賴於外部類。 

  import static java.lang.System.out;
  public class Outer{
      private String outerName = "outer";
      private static int id = 123;
      private Inner inner = new Inner();
      public static class Inner{
          public void print1(){
              //out.println(outerName); 無法訪問外部類的非靜態成員
              out.println(id);
          }
          public static void print2(){
              out.println(id);
          }
      }
      public void show(){
          inner.print1();
      }
      public static void main(String[] args){
          Outer outer = new Outer();
          outer.show();
          Outer.Inner.print2(); //直接通過類名訪問靜態內部類
      }
  }

 

                    

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ######################TypeError: module.__init__() takes at most 2 arguments (3 given)繼承錯誤,沒有繼承正確的類出現問題代碼: 修正後的代碼: ##### 後期遇到我難找到錯誤的問題會繼續更新 ...
  • 今天用Eclipse Java EE版寫了幾個java工程項目,然後再寫java EE項目的jsp頁面時,Tomcat出現了這個異常信息: 解決辦法: 在菜單欄Window——>Preferences——>Server——>Runtime Environments,將列表中已經配置的Tomcat給R ...
  • 一、字元串 在Python中,加了引號的字元都被認為是字元串! 單引號、雙引號、多引號的區別? 單引號和 雙引號沒有任何區別,但是某種情況下需要單雙配合 如 msg = " My name is Small Nine ,I ' m 22 years old !’" 多引號的作用? 多引號的作用就是多 ...
  • 首先繼承Thread類,然後重寫Thread類的run()方法。 Thread類的子類的對象調用start()方法,然後虛擬機就會調用該線程的run()方法。 當程式執行到start()方法時,線程啟動,此時有兩條執行路徑,一條是主方法執行main方法,另一條是線程路徑執行線程run()里的代碼,兩 ...
  • 開散列法又叫鏈地址法(開鏈法)。 開散列法:首先對關鍵碼集合用散列函數計算散列地址,具有相同地址的關鍵碼歸於同一子集合,每一個子集合稱為一個桶,各個桶中的元素通過一個單鏈錶鏈接起來,各鏈表的頭結點存儲在哈希表中。 設元素的關鍵碼為37, 25, 14, 36, 49, 68, 57, 11, 散列表 ...
  • 解法: 最開始有三種思路: 最後採用了最後一種思路 github地址:https://github.com/CyanChan/Leetcode-Record ...
  • 近期項目中,用 jenkins 熱部署 web工程時,發現工程中靜態持有的線程(將ScheduledExecutorService定時任務存儲在靜態Map中),導致不定時出現資料庫訪問事務關閉異常,如下:org.springframework.transaction.CannotCreateTran ...
  • word裡面有2張表,需要找到第二張表,並寫入execl中: 代碼如下: 運行後生成文件 roro.xlsx,內容如下: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...