Java常見錯誤-內部類-簡要分析

Java常見錯誤-內部類-簡要分析

  • 概念
  • 分類
    • 成員內部類(非靜態內部類)
    • 靜態內部類
      • 成員內部類和靜態內部類區別
    • 局部內部類
    • 匿名內部類
  • 注意事項
  • 總結

概念

? 內部類,顧名思義,就是在一個類的內部定義的類。這種設計允許將一個類的實現細節封裝起來,并可以實現非常緊密的耦合,對于某些特定場景下,比如事件監聽器模型、線程創建等,內部類能提供更加優雅和簡潔的解決方案

分類

  1. 成員內部類(非靜態內部類):這是最普通的內部類形式,它作為外部類的一個成員存在,可以直接訪問外部類的成員變量和方法,即使它們是私有的。

  2. 靜態內部類(靜態嵌套類):靜態內部類與成員內部類的主要區別在于靜態內部類不需要依賴于外部類的實例,它可以通過外部類直接訪問,類似于外部類中的靜態成員。

  3. 局部內部類:局部內部類是在方法或代碼塊中定義的類,它的作用域僅限于該方法或代碼塊。它可以訪問外部類的成員,同時也可以訪問所在方法的局部變量,但要求這些局部變量必須被聲明為final。

  4. 匿名內部類:沒有名字的內部類,通常用來創建某個接口的實例或者實現抽象類的一個子類。它可以直接在需要使用的地方創建并實例化,常用于事件處理、線程創建等場景。

成員內部類(非靜態內部類)

public class memberOuterClass {private int data = 5;class InnerClass {void display() {System.out.println("Data from outer class: " + data);}}public static void main(String[] args) {OuterClass outer = new OuterClass();OuterClass.InnerClass inner = outer.new InnerClass();inner.display();}
}

反編譯.class:

public class memberOuterClass {private int data = 5;public memberOuterClass() {}public static void main(String[] var0) {memberOuterClass var1 = new memberOuterClass();InnerClass var2 = var1.new InnerClass();var2.display();}class InnerClass {InnerClass() {}void display() {System.out.println("Data from outer class: " + memberOuterClass.this.data);}}
}

? 可以發現反編譯后的代碼中,外部類和內部類都多了一個無參的構造方法無論外部類還是內部類,編譯器自動添加默認無參構造函數是為了確保類的可實例化性、支持繼承機制以及維護類實例與其環境的正確關聯

靜態內部類

  • 靜態內部類內允許有static屬性、方法;
public class OuterClass {private static int staticData = 10;static class StaticInnerClass {void display() {System.out.println("Static data from outer class: " + staticData);}}public static void main(String[] args) {OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass();inner.display();}
}

成員內部類和靜態內部類區別

1、在是否可以使用static修飾上

  • 成員內部類內不允許有static屬性、static方法;除非final static存常量池中

2、對外部類的引用及互相訪問上

  • 非靜態成員內部類:可以直接訪問外部類的所有成員(包括靜態和非靜態),因為它持有一個隱式的外部類實例的引用(通常稱為this$0)。這意味著非靜態內部類的實例化必須在外部類的實例上下文中進行
  • ``靜態成員內部類`不持有對外部類實例的直接引用,因此它不能直接訪問外部類的非靜態成員變量和方法 。它可以訪問外部類的靜態成員(包括靜態字段和方法),因為靜態成員屬于類本身,不依賴于類的實例進行創建

3、內部類創建上

  • 靜態內部類
public class Outer {public static class StaticInner {public void show() {System.out.println("靜態內部類");}}
}// 使用靜態內部類,無需創建Outer實例
Outer.StaticInner inner = new Outer.StaticInner();
inner.show();
  • 成員內部類
public class Outer {public class MemberInner {public void show() {System.out.println("成員內部類");}}
}// 使用成員內部類,需先創建Outer實例
Outer outer = new Outer();
Outer.MemberInner inner = outer.new MemberInner();
inner.show();

小結靜態內部類的實例化不需要外部類的實例。成員內部類的實例化需要先有外部類的實例,并通過外部類實例來創建內部類實例

4、一個外部類內多個成員內部類分別繼承不同父類,實現"多繼承"

public class Outer {// 第一個內部類繼承自類Apublic class InnerA extends A {// InnerA 的實現}// 第二個內部類繼承自類Bpublic class InnerB extends B {// InnerB 的實現}public static void main(String[] args) {// 創建 InnerA 和 InnerB 的實例InnerA innerA = new Outer().new InnerA();InnerB innerB = new Outer().new InnerB();}
}

局部內部類

public class OuterClass {void someMethod() {final int localData = 7;class LocalInnerClass {void show() {System.out.println("Local data: " + localData);}}LocalInnerClass local = new LocalInnerClass();local.show();}public static void main(String[] args) {OuterClass outer = new OuterClass();outer.someMethod();}
}

注:局部內部類就像是方法里面的一個局部變量一樣,是不能有public、protected、private以及static修飾符的。

匿名內部類

import java.util.ArrayList;
import java.util.List;public class Test {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("Hello");list.add("World");list.forEach(new java.util.function.Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}});// 或者使用Lambda表達式簡化(也是匿名內部類的一種體現)list.forEach(s -> System.out.println(s));}
}

? 匿名內部類是一種特殊的類,它不具備明確的構造器,這限制了它的應用場景。主要用途是作為接口的簡短實現,尤其是用作回調機制。在編譯時,它會被系統自動生成一個類似于Outer$1.class的名稱。通常,匿名內部類用于擴展已有類或實現接口,并專注于提供必要的方法實現,而不涉及額外的功能

注意事項

//TODO

總結

? 內部類是Java語言提供的一種特殊類,它允許類定義嵌套在其他類中,這為程序設計提供了更大的靈活性。不同類型的內部類有著不同的應用場景和訪問規則,如成員內部類用于需要訪問外部類非靜態成員的情況,靜態內部類更像一個獨立的類但邏輯上屬于外部類,局部內部類和匿名內部類則常用于臨時性需求,如事件處理或實現特定接口的簡短實現。理解并恰當使用內部類,可以使代碼更加清晰、高效和易于維護。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/24535.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24535.shtml
英文地址,請注明出處:http://en.pswp.cn/web/24535.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度學習-10-測試

深度學習-10-測試 本文是《深度學習入門2-自製框架》 的學習筆記&#xff0c;記錄自己學習心得&#xff0c;以及對重點知識的理解。如果內容對你有幫助&#xff0c;請支持正版&#xff0c;去購買正版書籍&#xff0c;支持正版書籍不僅是尊重作者的辛勤勞動&#xff0c;也是鼓勵…

Web前端ES6-ES13筆記合集(下)

#### 五.ES10新特性 ##### 1. Object.fromEntries > Object.fromEntries()方法允許你輕松地將鍵值對列表轉換為對象 js const arr [["name", "kerwin"], ["age", 100]]; console.log(Object.fromEntries(arr))//{name: kerwin, age: 100} …

pytorch 筆記:pytorch 優化內容(更新中)

1 Tensor創建類 1.1 直接創建Tensor&#xff0c;而不是從Python或Numpy中轉換 不要使用原生Python或NumPy創建數據&#xff0c;然后將其轉換為torch.Tensor直接用torch.Tensor創建或者直接&#xff1a;torch.empty(), torch.zeros(), torch.full(), torch.ones(), torch.…

樹莓派【Raspberry Pi-64位】3b+,Pi4J 2.0入門

一.前言: 前面的文章講解了樹莓派在centos7 arm64版本下的使用,用一款智能小車為例子,做了代碼實踐。 由于centos7不再維護,且Pi4J 1.x版本也因為WiringPi 的局限,Pi4J從1.x升級為2.x.所以本專欄的技術棧也將進行調整,A.從centos7系統回到Raspberry Pi-64位系統。B.Pi4…

4.通用編程概念

目錄 一、變量與常量1.1 變量1.2 常量 二、遮蔽三、數據類型3.1 標量類型1. 整型2. 浮點型3. 布爾類型4.字符類型 3.2 復合類型1. 元組2. 數組 四、函數五、語句和表達式六、函數的返回值 一、變量與常量 1.1 變量 在Rust中默認的變量是不可變的&#xff0c;如果修改其值會導致…

《青少年編程與數學》課程方案:4、課程策略

《青少年編程與數學》課程方案&#xff1a;4、課程策略 一、工程師思維二、使命感驅動三、價值觀引領四、學習現代化五、工作生活化六、與時代共進 《青少年編程與數學》課程策略強調采用工程師思維&#xff0c;避免重復造輪子&#xff0c;培養使命感&#xff0c;通過探索興趣、…

編程語言有哪些?這些希望你都知道

編程語言有哪些 編程語言有很多種&#xff0c;包括但不限于以下幾種&#xff1a; Java&#xff1a;當今最普遍使用的開發語言之一&#xff0c;簡單易學&#xff0c;且跨平臺性非常強&#xff0c;對網絡開發的支持令人稱贊。Python&#xff1a;語法清楚&#xff0c;干凈&#…

【Vue】如何提供訪問vuex的數據

文章目錄 一、提供數據二、訪問Vuex中的數據通過$store訪問的語法1&#xff09;模板中使用2&#xff09;組件邏輯中使用3&#xff09;js文件中使用 三、通過輔助函數 - mapState獲取 state中的數據 一、提供數據 State提供唯一的公共數據源&#xff0c;所有共享的數據都要統一…

[office] 快速刪除excel中的空行和列的方法 #其他#學習方法#經驗分享

快速刪除excel中的空行和列的方法 用戶在網上下載好的Excel表格打開之后發現有很多空白行&#xff0c;怎么樣將這些空白行或單元格一次性刪除掉呢?下面教大家在Excel中用定位一次性可以把空白行刪除 用戶在網上下載好的Excel表格打開之后發現有很多空白行&#xff0c;怎么樣將…

Vue3 使用audio播放語音+監聽播放語音完成事件

需求&#xff1a;輸入一段文字&#xff0c;點擊語音框&#xff0c;將本地語音&#xff08;提前準備好的&#xff09; 播放出來 播放中效果 代碼 <div class"listConAI" click"handleOpenSpeech" ><imgsrc"../../../../assets/images/blueo…

web前端 孫俏:深度探索與實戰之路

web前端 孫俏&#xff1a;深度探索與實戰之路 在這個數字化、信息化的時代&#xff0c;web前端技術以其獨特的魅力&#xff0c;吸引著越來越多的開發者投身其中。今天&#xff0c;我們將跟隨孫俏的腳步&#xff0c;一同探索web前端的深度與廣度&#xff0c;揭開其神秘的面紗。…

中文文案寫作有哪些合適的AIGC工具?

這是計育韜老師第 8 次開展面向全國高校的新媒體技術公益巡講活動了。而在每場講座尾聲&#xff0c;互動答疑環節往往反映了高校師生當前最普遍的運營困境&#xff0c;特此計老師在現場即興答疑之外&#xff0c;會盡量選擇有較高價值的提問進行文字答疑梳理。 *本輪巡講主題除了…

【Vue】開啟嚴格模式及Vuex的單項數據流

文章目錄 一、引出問題二、開啟嚴格模式 一、引出問題 目標 明確 vuex 同樣遵循單向數據流&#xff0c;組件中不能直接修改倉庫的數據 這樣數據的流向才會更加清晰&#xff0c;將來對數據的修改&#xff0c;都在倉庫內部實現的&#xff0c;更易于維護 直接在組件中修改Vuex中…

Git:版本控制的藝術與GitLab實戰指南

在當今快速發展的軟件開發領域&#xff0c;高效、協同的代碼管理是項目成功的關鍵。Git&#xff0c;作為一款分布式版本控制系統&#xff0c;憑借其強大的功能和靈活性&#xff0c;成為了眾多開發者首選的版本控制工具。本文將帶您深入探索Git的核心概念、基礎操作&#xff0c;…

B3870 [GESP202309 四級] 變長編碼

[GESP202309 四級] 變長編碼 題目描述 小明剛剛學習了三種整數編碼方式&#xff1a;原碼、反碼、補碼&#xff0c;并了解到計算機存儲整數通常使用補碼。但他總是覺得&#xff0c;生活中很少用到 2 31 ? 1 2^{31}-1 231?1 這么大的數&#xff0c;生活中常用的 0 ~ 100 0…

Spring進階技巧:利用AOP提前介入的巧妙實踐

Spring框架中的面向切面編程&#xff08;AOP&#xff09;是一種強大的機制&#xff0c;它允許開發者在不修改原有代碼的情況下&#xff0c;對程序進行橫向切面的功能擴展。AOP提供了一種方式&#xff0c;可以在目標Bean的生命周期早期階段就實施切面邏輯&#xff0c;這為我們在…

Python 中如何使用 lambda 函數

在 Python 中&#xff0c;可以使用 lambda 函數來創建匿名函數。lambda 函數的語法是&#xff1a;lambda 參數: 表達式。以下是一些使用 lambda 函數的例子&#xff1a; 通過 lambda 函數來計算兩個數的和&#xff1a; add lambda x, y: x y print(add(2, 3)) # 輸出 5通過…

Oracle 日志挖掘

oracle 11g 日志挖掘測試 需要開啟補充日志 alter database add supplemental log data; SELECT SUPPLEMENTAL_LOG_DATA_MIN, SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI FROM V$DATABASE;在用戶下執行一些刪除&#xff0c;插入等操作 SQL> create table zxy( …

LLM評測數據集

1. C-Eval 數據集源地址: C-Eval Official Repository 數據范圍: 該數據集包括學科類知識測試&#xff0c;涵蓋廣泛的學科知識&#xff0c;例如數學、物理、化學等。 數據集大小及數據形式: 數據集包含13,948道單選題&#xff0c;題目均為中文。 論文地址: C-Eval: A Multi-…

【一百一十】【算法分析與設計】[SDOI2009] HH的項鏈,樹狀數組應用,查詢區間的種類數,樹狀數組查詢區間種類數

P1972 [SDOI2009] HH的項鏈 [SDOI2009] HH的項鏈 題目描述 HH 有一串由各種漂亮的貝殼組成的項鏈。HH 相信不同的貝殼會帶來好運&#xff0c;所以每次散步完后&#xff0c;他都會隨意取出一段貝殼&#xff0c;思考它們所表達的含義。HH 不斷地收集新的貝殼&#xff0c;因此&am…