Java學習筆記二十:Java中的內部類

来源:https://www.cnblogs.com/qiaoyifan/archive/2018/06/08/9157892.html
-Advertisement-
Play Games

Java中的內部類一:什麼是內部類;二:Java 中的成員內部類;三:Java 中的靜態內部類;四:Java 中的方法內部類; ...


Java中的內部類

 

 

一:什麼是內部類;

  (1).什麼是內部類呢?

  內部類( Inner Class )就是定義在另外一個類裡面的類。與之對應,包含內部類的類被稱為外部類。

  (2).那為什麼要將一個類定義在另一個類裡面呢?獨立的一個類不好嗎?

 

  內部類的主要作用如下:

 

1. 內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包中的其他類訪問該類

 

2. 內部類的方法可以直接訪問外部類的所有數據,包括私有的數據

 

3. 內部類所實現的功能使用外部類同樣可以實現,只是有時使用內部類更方便

  (3)內部類有幾種呢?

  內部類可分為以下幾種:

  • 成員內部類
  • 靜態內部類
  • 方法內部類
  • 匿名內部類

二:Java 中的成員內部類;

  內部類中最常見的就是成員內部類,也稱為普通內部類。我們來看如下代碼:

 

//外部類HelloWorld
public class HelloWorld{
   
    private int a = 99;//外部類的私有屬性
    //內部類Inner
    public class Inner{
        int b = 2;
        public void test(){
        System.out.println("訪問外部類中的a:"+a);
        System.out.println("訪問內部類中的b:"+b);
        }
    }
    //測試成員內部類
    public static void main(String[]args){
        HelloWorld o = new HelloWorld();//創建外部類對象,對象名為o
        Inner i = o.new Inner();//使用外部類對象創建內部類對象,對象名為i
        i.test();//調用內部類對象的test方法
    }
}

 

運行結果為:

 

從上面的代碼中我們可以看到,成員內部類的使用方法:

 

1、 Inner 類定義在 HelloWorld類的內部,相當於 HelloWorld 類的一個成員變數的位置,Inner 類可以使用任意訪問控制符,如 public 、 protected 、 private 等

 

2、 Inner 類中定義的 test() 方法可以直接訪問 HelloWorld類中的數據,而不受訪問控制符的影響,如直接訪問 HelloWorld類中的私有屬性a

 

3、 定義了成員內部類後,必須使用外部類對象來創建內部類對象,而不能直接去 new 一個內部類對象,即:內部類 對象名 = 外部類對象.new 內部類( );

 

4、 編譯上面的程式後,會發現產生了兩個 .class 文件

 

HelloWorld.class

HelloWorld$Inner.class

 

  其中,第二個是外部類的 .class 文件,第一個是內部類的 .class 文件,即成員內部類的 .class 文件總是這樣:外部類名$內部類名.class

 

另外,註意:

1、 外部類是不能直接使用內部類的成員和方法滴

  可先創建內部類的對象,然後通過內部類的對象來訪問其成員變數和方法。

2、 如果外部類和內部類具有相同的成員變數或方法,內部類預設訪問自己的成員變數或方法,如果要訪問外部類的成員變數,可以使用 this 關鍵字。如:

//外部類HelloWorld
public class HelloWorld{
   
    int b = 1;
    //內部類Inner
    public class Inner{
        int b = 2;
        public void test(){
        System.out.println("訪問外部類中的b:"+HelloWorld.this.b);
        System.out.println("訪問內部類中的b:"+b);
        }
    }
    //測試成員內部類
    public static void main(String[]args){
        HelloWorld o = new HelloWorld();//創建外部類對象,對象名為o
        Inner i = o.new Inner();//使用外部類對象創建內部類對象,對象名為i
        i.test();//調用內部類對象的test方法
    }
    
}

運行結果為:

 

三:Java 中的靜態內部類;

  靜態內部類是 static 修飾的內部類,這種內部類的特點是:

1、 靜態內部類不能直接訪問外部類的非靜態成員,但可以通過 new 外部類().成員 的方式訪問 

2、 如果外部類的靜態成員與內部類的成員名稱相同,可通過“類名.靜態成員”訪問外部類的靜態成員;如果外部類的靜態成員與內部類的成員名稱不相同,則可通過“成員名”直接調用外部類的靜態成員

3、 創建靜態內部類的對象時,不需要外部類的對象,可以直接創建 內部類 對象名= new 內部類();

舉個例子:

//外部類HelloWorld
public class HelloWorld{
   
    private int a = 99;//外部類的私有變數
    static int b = 1;//外部類的靜態變數
    //靜態內部類
    public static class SInner{
        int b =2;
        public void test(){
        System.out.println("訪問外部類中的b:"+HelloWorld.b);
        System.out.println("訪問內部類中的b:"+b);
        }
    }
    //測試靜態內部類
    public static void main(String[]args){
        SInner si = new SInner();//直接創建內部類的對象
        si.test();//調用test方法
    }
}

運行結果為:

 

四:Java 中的方法內部類;

  方法內部類就是內部類定義在外部類的方法中,方法內部類只在該方法的內部可見,即只在該方法內可以使用。

舉一個例子:

 

//外部類HelloWorld
public class HelloWorld{
   
    //外部類中的方法
    public void show(){
        final int a =25;//常量
        int b = 13;//變數
        //方法內部類
        class MInner{
            int c =2;//內部類中的變數
            public void print(){
                System.out.println("訪問外部類的方法中的常量a:"+a);
                System.out.println("訪問內部類中的變數c:"+c);
            }
        }
        MInner mi = new MInner();//創建方法內部類中的對象
        mi.print();//調用內部類中的方法
    }
    //測試方法內部類
    public static void main(String[]args){
        HelloWorld mo = new HelloWorld();
        mo.show();//調用外部類的方法
    }
}

 

註意:由於方法內部類不能在外部類的方法以外的地方使用,因此方法內部類不能使用訪問控制符和 static 修飾符。

 


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

-Advertisement-
Play Games
更多相關文章
  • 這節課來學習一下html5中新增的標簽,我們先來看一下,html5中新增了哪些標簽? 打開W3school的網頁,點擊參考手冊中的HTML/HTML5標簽,有一個按字母順序排列的標簽,但凡標簽後面帶有5標記的,都是html5新增的標簽。 而有一些標簽是css才用到的,這裡先不學 有一些是用不到的,如 ...
  • //計算天數差的函數,通用 function DateDiff(sDate1, sDate2){ //sDate1和sDate2是2006-12-18格式 var aDate, oDate1, oDate2, iDays aDate = sDate1.split("-") oDate1 = new ...
  • 來做一個這個界面 fieldset和legend標簽在企業中用到的非常少,在企業里的邊框都要求非常好看 ...
  • ref:https://blog.csdn.net/wuxiaobingandbob/article/details/78642020?fps=1&locationNum=1 http://www.cnblogs.com/imyalost/p/6792724.html http://www.cnbl ...
  • wframe不是控制項庫,也不是UI庫,她是一個微信小程式面向對象編程框架,代碼只有幾百行。她的主要功能是規範小程式項目的文件結構、規範應用程式初始化、規範頁面載入及授權管理的框架,當然,wframe也提供了一些封裝好了的函數庫,方便開發者調用。 wframe目前已實現的核心功能: 1. 應用程式初始 ...
  • define和typedef的區別 define是單純的字元替換,typedef是重新定義了新的類型 ...
  • Java面向對象的三大特性之繼承一:繼承的概念;二:類的繼承格式;三:為什麼需要繼承;四:繼承的特性;五:繼承的關鍵字; ...
  • def func1(seq1): dic={ 'num':0, 'string':0, 'space':0, 'other':0 } for line in seq1: if line.isdigit(): dic['num'] += 1 elif line.isalpha(): dic['stri ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...