java-嵌套類

来源:http://www.cnblogs.com/justforcon/archive/2016/11/05/6031729.html
-Advertisement-
Play Games

java允許在一個類中定義另外一個類,這就叫類嵌套。類嵌套分為兩種,靜態的稱為靜態嵌套類,非靜態的稱為內部類。 使用嵌套類的原因: 嵌套類也屬於類的成員,因此也可使用類成員的可視範圍控制修飾詞,內部類能夠使用其所在類的其他類成員,而靜態嵌套類則不能使用其所在類的其他類成員。 靜態嵌套類 與靜態方法與 ...


java允許在一個類中定義另外一個類,這就叫類嵌套。類嵌套分為兩種,靜態的稱為靜態嵌套類,非靜態的稱為內部類。

使用嵌套類的原因:

  1. 能夠將僅在一個地方使用的類合理地組合。一個類可能只對於另外一個類有用,此時將前者組合到後者,可以使得程式包更加簡潔。
  2. 增強封裝性。假如由兩個類A和B,B類需要使用A類中的成員,而恰好該成員又是僅類內部可見的,如果將B定義為A的嵌套類,則B可以使用A的任何成員,而且B也可以聲明為外部不可見。
  3. 能夠使代碼可讀性和維護性更強。嵌套的類代碼相較於頂級類,更靠近它被使用的地方,方便查看。

  嵌套類也屬於類的成員,因此也可使用類成員的可視範圍控制修飾詞,內部類能夠使用其所在類的其他類成員,而靜態嵌套類則不能使用其所在類的其他類成員

靜態嵌套類

  與靜態方法與靜態欄位類似,靜態嵌套類是與其所在類相關的。靜態嵌套類不能直接使用實例變數或者實例欄位,而只能通過一個對象引用,可將靜態嵌套類視為跟其他頂級類一樣,只不過是內嵌在其他類裡面,方便打包。

  靜態嵌套類的使用方法與類中的其他類成員類似,一下演示如何創建靜態嵌套類對象:

//StaticNestedClass為OuterClass的一個嵌套類
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();

內部類(非靜態嵌套類)

  內部類是與其所在類的實例相關的  ,能夠直接使用實例對象的方法和欄位,內部類與實例相關,所以內部類不能定義靜態的成員。

  如果需要創建內部類對象,首先需要創建該內部類所在的類的對象,如下所示:

//1創建內部類所在類的對象
OuterClass outerObject=new OuterClass();
//2創建內部類對象
//註意與靜態嵌套類的構造器使用方法的差異
OuterClass.InnerClass innerObject = outerObject.new InnerClass();

嵌套類的遮蔽

  當我們聲明一個類型時,如果其名稱與當前代碼塊(如一個方法內部)所在的代碼塊(如類內部)內的另一個類型的聲明含有相同的名稱,這種現象就叫遮蔽。需要用到被遮蔽的類型時,我們不能直接引用其名稱,如下例所示:

 public class ShadowTest {

    public int x = 0;
//嵌套類
    class FirstLevel {
//以下聲明會遮蔽其所在類的名稱為x的欄位
        public int x = 1;
//以下方法的聲明會遮蔽其所在類的名稱為x的欄位
        void methodInFirstLevel(int x) {
            System.out.println("x = " + x);
            System.out.println("this.x = " + this.x);
            System.out.println("ShadowTest.this.x = " + ShadowTest.this.x);//註意this關鍵詞的使用方法
        }
    }

    public static void main(String... args) {
        ShadowTest st = new ShadowTest();
        ShadowTest.FirstLevel fl = st.new FirstLevel();
        fl.methodInFirstLevel(23);
    }
}

上述代碼輸出為:

x = 23
this.x = 1
ShadowTest.this.x = 0

序列化,教程中強烈建議不要序列化內部類,在此留下疑問。

除了非靜態嵌套類意外,還有兩種內部類,一種是局部類,還有一種是匿名類。

局部類

  局部類可以在任何代碼塊(花括弧內)中定義,一般應用於方法之中。

  局部類可以使用其所在頂級類的類成員,此外,局部類也可以使用局部變數,然而,其所使用的局部類必須有final關鍵詞修飾,即不可變變數。在java SE8中,局部類可以使用本質上不變的局部變數,即該局部變數即便沒有final關鍵詞修飾,但實際上從初始化以後,其值從未改變過。

  從java8開始,局部類也可以使用其所在方法的參數。

  與內部類相似,局部類不能定義靜態成員,在靜態方法中定義的局部類不能使用實例成員。

  在代碼塊中不能定義介面,因為介面本質是靜態的。局部類中也不能定義藉口成員,不過局部類中可以定義常量變數(用final修飾,類型為基本數據類型或者字元串,編譯時進行初始化)。

匿名類

  匿名類能是代碼更加簡潔,它不需要名稱,可以聲明,實例化一步完成。

  匿名類的聲明是一個表達式,如同調用一個構造器,不同的是其後還跟上了一個定義類的代碼塊。

  匿名類的定義的表達式包含如下幾個部分:

  • new關鍵詞
  • 一個該匿名類需要實現的藉口或者是繼承的父類的名稱
  • 一對圓括弧,包含參數,實現一個介面時,參數部分留空
  • 匿名類主體,跟類的主體類似, 可以定義方法

匿名類對於可使用的類型與局部類相同:

  • 可使用其所在類的類成員
  • 可使用其所在代碼塊的帶final修飾詞的局部變數,或者初始化後不再賦值的局部變數(java8)
  • 對於遮蔽的類型,不能直接用名稱引用

同樣匿名類不能聲明靜態的成員或者介面,但是可以聲明常量變數,在匿名類的類主體中,可以聲明實例欄位,實例方法,實例初始化代碼塊和局部類。

 


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

-Advertisement-
Play Games
更多相關文章
  • JMS是一個用於提供消息服務的技術規範,它制定了在整個消息服務提供過程中的所有數據結構和交互流程。 而activemq則是消息隊列服務,是面向消息中間件(MOM)的最終實現,是真正的服務提供者。 jms 的一個標準或者說是一個協議。 通常用於企業級應用的消息傳遞。 主要有topic 消息(1 對多) ...
  • 一、前言 在之前的隨筆之中,我們已經瞭解Java通過上傳組件來實現上傳和下載,這次我們來瞭解Struts2的上傳和下載。 註意:文件上傳時,我們需要將表單提交方式設置為"POST"方式,並且將enctype屬性設置為"multipart/form-data",該屬性的預設值為"application ...
  • iText是著名的開放項目,是用於生成PDF文檔的一個java類庫。通過iText不僅可以生成PDF或rtf的文檔,而且可以將XML、Html文件轉化為PDF文件。 官方網站:http://itextpdf.com/ 示例版本:itextpdf-5.2.1.jar 示例代碼 document.add ...
  • 一、OOP(Object-oriented Programming)面向對象程式編程 初談類和對象,所謂萬物皆對象,類和對象有什麼區別和聯繫? 類,是對某一種類型的定義,比如字元串,動物,人,飛機等等,而對象是指具體的字元串,動物,人... 如:豬是類,定義了,豬,有體重,有年齡,可以吃飯,可以睡覺 ...
  • 英文文檔: 2. 當傳入多個可迭代對象時,函數的參數必須提供足夠多的參數,保證每個可迭代對象同一索引的值均能正確傳入函數。 3. 當傳入多個可迭代對象時,且它們元素長度不一致時,生成的迭代器只到最短長度。 4. map函數是一個典型的函數式編程例子。 ...
  • 在我的上一篇博客JVM-String比較-位元組碼分析中介紹了String字元串比較的原因,藉著分析位元組碼的機會,我這篇博客將會繪圖展現方法內部位元組碼執行過程。 話不多說,貼上我們將要分析的Java方法代碼: 再貼上我們將要分析的Java方法的位元組碼: 由Code:下麵的第一行,我們得知,操作數棧深度 ...
  • org.apache.commons.lang.StringUtils中常用的方法,這裡主要列舉String中沒有,且比較有用的方法: 1. 檢查字元串是否為空: static boolean isBlank(CharSequence str) 判斷字元串是否為空或null; static bool ...
  • 以下筆記內容來自尚矽谷_Struts2_佟剛老師的視頻教程+自己一點點整理 一、 1. VS 自實現: 1). 搭建 Struts2 的開發環境 2). 不需要顯式的定義 Filter, 而使用的是 struts2 的配置文件. 3). details.jsp 比先前變得簡單了。 屬性引用:${re ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...