【JAVA基礎之內部類】匿名內部類

🔥作者主頁:小林同學的學習筆錄

🔥小林同學的專欄:JAVA之基礎專欄

目錄

1.內部類

1.1 概述

1.1.1 什么是內部類

1.1.2 什么時候使用內部類

1.2 內部類的分類

1.3 成員內部類

1.3.1? 獲取成員內部類對象的兩種方式

1.3.2? 經典面試題

1.4? 靜態內部類

1.4.1? 靜態內部類對象的創建格式

1.5? 局部內部類

1.6? 匿名內部類

1.6.1? 引出匿名內部類?

1.6.2? 匿名內部類用處

1.6.3? 匿名內部類的使用場景


1.內部類

1.1 概述

1.1.1 什么是內部類

將一個類A定義在另一個類B里面,里面的那個類A就稱為內部類,B則稱為外部類,其他稱為外部其他類可以把內部類理解成寄生,外部類理解成宿主。

1.1.2 什么時候使用內部類

一個事物內部還有一個獨立的事物,內部的事物脫離外部的事物無法獨立使用

  1. 人里面有一顆心臟。

  2. 汽車內部有一個發動機。

  3. 目的為了實現更好的封裝性。

1.2 內部類的分類

按定義的位置來分

  1. 成員內部內,類定義在了成員位置 (類中方法外稱為成員位置,無static修飾的內部類)

  2. 靜態內部類,類定義在了成員位置 (類中方法外稱為成員位置,有static修飾的內部類)

  3. 局部內部類,類定義在方法內

  4. 匿名內部類,沒有名字的內部類,可以在方法中,也可以在類中方法外。

1.3 成員內部類

類定義在成員位置上

1.3.1? 獲取成員內部類對象的兩種方式

  • 方式一:外部直接創建成員內部類的對象
    • 外部類.內部類 變量 = new 外部類().new 內部類();
  • 方式二:在外部類中定義一個方法提供內部類的對象(一般用在內部類用private修飾才用到)

代碼演示:

方式一:
public class Test {public static void main(String[] args) {//  宿主:外部類對象。// Outer out = new Outer();// 創建內部類對象。Outer.Inner oi = new Outer().new Inner();oi.method();}
}class Outer {// 成員內部類,屬于外部類對象的。// 拓展:成員內部類不能定義靜態成員。public class Inner{// 這里面的東西與類是完全一樣的。public void method(){System.out.println("內部類中的方法被調用了");}}
}方式二:
public class Outer {String name;private class Inner{static int a = 10;}public Inner getInstance(){return new Inner();}
}public class Test {public static void main(String[] args) {Outer o = new Outer();System.out.println(o.getInstance());}
}

1.3.2? 經典面試題

public class Test {public static void main(String[] args) {Outer.inner oi = new Outer().new inner();oi.method();}
}class Outer {	// 外部類private int a = 30;// 在成員位置定義一個類class inner {private int a = 20;public void method() {int a = 10;System.out.println(???);	// 10   答案:aSystem.out.println(???);	// 20	答案:this.aSystem.out.println(???);	// 30	答案:Outer.this.a}}
}

執行原理:

?

1.4? 靜態內部類

靜態內部類可以直接訪問外部類的靜態成員。

靜態內部類不可以直接訪問外部類的非靜態成員,如果要訪問需要創建外部類的對象。

靜態內部類中沒有虛擬機所創建的Outer.this

如何調用靜態內部類的方法?

  • 非靜態方法:創建對象,并調用方法
  • 靜態方法:外部類名.內部類名.方法名()

1.4.1? 靜態內部類對象的創建格式

外部類.內部類 ?變量 = new ?外部類.內部類構造器;

代碼演示:

// 外部類:Outer01
class Outer01{private static  String sc_name = "小白";private String sc_age = 24;// 內部類: Inner01public static class Inner01{// 這里面的東西與類是完全一樣的。private String name;public Inner01(String name) {this.name = name;}public void showName(){System.out.println(this.name);// 拓展:靜態內部類可以直接訪問外部類的靜態成員。System.out.println(sc_name);//訪問外部類的非靜態的變量需要創建外部類的對象Outer01 outer01 = new Outer01();System.out.println(outer.sc_age);}}
}public class InnerClassDemo01 {public static void main(String[] args) {// 創建靜態內部類對象。// 外部類.內部類  變量 = new  外部類.內部類構造器;Outer01.Inner01 in  = new Outer01.Inner01("張三");in.showName();}

1.5? 局部內部類

將內部類定義在方法里面就叫做局部內部類,類似于方法中的局部變量

外部類是無法直接獲取局部內部類的,需要創建該類的對象,然后再進行使用

該類可以直接訪問外部類的成員,也可以訪問方法內的局部變量

public class Outer {private int outerField = 10;public void outerMethod() {final int localVar = 20;//局部內部類class LocalInner {void display() {System.out.println("Outer Field: " + outerField);System.out.println("Local Variable: " + localVar);}}//外部類獲取內部類信息,需要創建對象LocalInner inner = new LocalInner();inner.display();}public static void main(String[] args) {Outer outer = new Outer();outer.outerMethod();}
}

1.6? 匿名內部類

1.6.1? 引出匿名內部類?

正常類:

?

匿名內部類(Student被匿名):

?

代碼演示:

interface Swim {public abstract void swimming();
}public class Demo07 {public static void main(String[] args) {// 使用匿名內部類對象,并且調用匿名內部類里面的方法new Swim() {@Overridepublic void swimming() {System.out.println("自由泳...");}}.swimming();// 接口 變量 = new 實現類(); // 多態,走子類的重寫方法Swim s2 = new Swim() {@Overridepublic void swimming() {System.out.println("蛙泳...");}};s2.swimming();s2.swimming();}
}

注意:

new Swim(){@Overridepublic void swim() {System.out.println("Demo01匿名內部類");}
};

這樣的話是不會有打印數據的,因為整體只是一個匿名內部類對象,需要再去調用相應的成員

?

匿名內部類字節碼文件反編譯看到的效果

?

實際案例:

public class Test01 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("11");list.add("12");list.add("13");//下面就是一個匿名內部類list.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}});}
}

反編譯之后

?

1.6.2? 匿名內部類用處

匿名內部類在Java中有著一些重要的用途,其中包括:

  1. 簡化代碼:使用匿名內部類可以減少代碼量,避免編寫大量的類定義。

  2. 事件處理器:在GUI編程中常常使用匿名內部類來實現事件處理器,如按鈕點擊事件、菜單項選擇等。

  3. 回調函數:匿名內部類也可以用作回調函數的實現,例如對異步任務的處理。

  4. 接口實現:如果只需要使用接口的一次實例,可以直接使用匿名內部類來實現接口的抽象方法。

  5. 方法重寫:可以在匿名內部類中重寫父類或接口的方法,以實現特定的邏輯。

總之,匿名內部類提供了一種簡潔、靈活的方式來實現某些具體功能,通常用于臨時、一次性的場景中。

1.6.3? 匿名內部類的使用場景

interface Swim {public abstract void swimming();
}public class Demo07 {public static void main(String[] args) {// 普通方式傳入對象// 創建實現類對象Student s = new Student();goSwimming(s);// 匿名內部類使用場景:作為方法參數傳遞Swim s3 = new Swim() {@Overridepublic void swimming() {System.out.println("蝶泳...");}};// 傳入匿名內部類goSwimming(s3);// 完美方案: 一步到位goSwimming(new Swim() {public void swimming() {System.out.println("大學生, 蛙泳...");}});goSwimming(new Swim() {public void swimming() {System.out.println("小學生, 自由泳...");}});}// 定義一個方法,模擬請一些人去游泳public static void goSwimming(Swim s) {s.swimming();}
}

總結:

?

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

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

相關文章

用C語言把一棵普通二叉樹安排得明明白白

1. 樹的相關術語 結點的度&#xff1a;一個結點含有的子樹的個數稱為該結點的度&#xff1b; 如上圖&#xff1a;A的為6 葉結點或終端結點&#xff1a;度為0的結點稱為葉結點&#xff1b; 如上圖&#xff1a;B、C、H、I...等結點為葉結點 非終端結點或分支結點&#xff1a;度不…

【Linux】-Tomcat安裝部署[12]

目錄 簡介 安裝 安裝部署JDK環境 解壓并安裝Tomcat 簡介 Tomcat是由Apache開發的一個Servlet容器&#xff0c;實現了對Servlet和JSP的支持&#xff0c;并提供了作為Web服務器的一些特有功能&#xff0c;如Tomcat管理和控制平臺、安全域管理和Tomcat閥等。 簡單來說&#…

使用 mysql-binlog-connector 監聽處理 MySQLBinlog 文件

1. 需求概述 業務開發中經常需要根據一些數據變更實現相對應的操作。例如&#xff0c;一些用戶注銷自己的賬戶&#xff0c;系統可以給用戶自動發短信確認&#xff0c;這時有兩種解決方案&#xff0c;一種是耦合到業務系統中&#xff0c;當用戶執行注銷操作的時候&#xff0c;執…

【軟件工程】【23.10】p2

關鍵字&#xff1a; 軟件復用技術、過程途徑、特定需求是文檔核心、數據字典條目、高內聚低耦合獨立性、數據流圖映射模塊結構圖、UML依賴、用例圖關系、RUB迭代、程序規格說明等價類劃分、有效性測試的目標、噴泉模型面向對象、軟件驗證過程、CMMI

算法提高之程序自動分析

算法提高之程序自動分析 核心思想&#xff1a;并查集 離散化 因為不是每個數都會用到 所以離散化一下**(不需要保留順序)**對于每一個值為1的等式 優先處理之后處理值為0的等式時 若ab已經連在一起 即為矛盾 #include <iostream>#include <cstring>#include &l…

【Linux】Centos7安裝RabbitMQ

【Linux】Centos7安裝RabbitMQ 下載 從 rabbitmq 的 GitHub 倉庫下載 https://github.com/rabbitmq/rabbitmq-server/releases rabbitmq 是 erlang 語言編寫的&#xff0c;需要先安裝 erlang https://github.com/rabbitmq/erlang-rpm/releases 安裝 使用rz命令上傳 erlang 和 …

Polar 網站被黑

Polar 網站被黑 開題&#xff0c;挺好看的前端&#xff0c;可惜啥也沒有。 信息搜集一波&#xff0c;掃目錄出現幾個敏感目錄&#xff0c;但是沒什么用。 繼續搜集&#xff0c;在返回包中發現了HINT F5XDAXZQNZSV6ZRRNZSF63JTF4base32解碼后是一個路由/n0_0ne_f1nd_m3/&#x…

數據倉庫實驗四:聚類分析實驗

目錄 一、實驗目的二、實驗內容和要求三、實驗步驟1、建立數據表2、建立數據源視圖3、建立挖掘結構Student.dmm4、部署項目并瀏覽結果5、挖掘模型預測 四、實驗結果分析五、實驗總結體會 一、實驗目的 通過本實驗&#xff0c;進一步理解基于劃分的、基于層次的、基于密度的聚類…

Easy-poi 和 EasyExcel 選型

目錄 共同點地址如何選 共同點 easy-poi 和 easyexcel 都是基于 apache poi 進行二次開發的&#xff0c;底層都是依賴的 apache poi使用簡單&#xff0c;都可以通過簡單的注解實現excel文件的導入導出 地址 esay poi 是一個開源的 excel,word 處理框架。鏈接 easy excel 是…

Xed編輯器開發第二期:使用Rust從0到1寫一個文本編輯器

第三篇 這部分接著處理用戶退出命令以及一些其他新功能&#xff1b; 3.1 使用CtrlQ退出 modifiers: event::KeyModifiers::CONTROL,使用CONTROL替換之前的NONE值即可&#xff1b; 3.2 重構鍵盤輸入 讓我們重構我們的代碼&#xff0c;以便我們有一個用于低級按鍵讀取的函數&…

《Rust奇幻之旅:從Java和C++開啟》第1章Hello world 2/5

講動人的故事,寫懂人的代碼 很多程序員都在自學Rust。 ??但Rust的學習曲線是真的陡,讓人有點兒怵頭。 程序員工作壓力大,能用來自學新東西的時間簡直就是鳳毛麟角。 ??目前,在豆瓣上有7本Rust入門同類書。它們雖有高分評價,但仍存在不足。 首先,就是它們介紹的Rust新…

【前端面經】BFC

BFC BFC什么是 BFC&#xff1f;元素開啟 BDC 后的特殊布局效果元素開啟 BFC 的方式 BFC 什么是 BFC&#xff1f; 官方解釋&#xff1a;A block formatting context (BFC) is a part of a visual CSS rendering of a web page. It’s the region in which the layout of block…

什么是谷歌爬蟲?

其實就是谷歌用來瀏覽網絡信息的一個自動化程序&#xff0c;他們會在你的網站爬取&#xff0c;尋找和搜集信息&#xff0c;谷歌爬蟲可以說決定著一個網站在谷歌的生死 谷歌爬蟲的作用機制就在于發現新網站以及新網頁&#xff0c;然后他會把網頁的內容帶回去&#xff0c;更新到…

PikaUnsafe upfileupload

1.client check 客戶端檢測&#xff0c;前端js檢測&#xff0c;禁用js和修改后綴名即可。 php格式不能上傳&#xff0c;我們修改后綴上傳。 蟻劍成功連接。 2.MIME type 這個就是 content-type 規定上傳類型&#xff0c;上面的方法也能成功&#xff0c;也可以修改 conten-ty…

面試框架【面試準備】

前言 2023-9-12 12:12:04 2023-09-14 16:13:04 公開發布于 2024-5-22 00:16:21 以下內容源自《【面試準備】》 僅供學習交流使用 版權 禁止其他平臺發布時刪除以下此話 本文首次發布于CSDN平臺 作者是CSDN日星月云 博客主頁是https://blog.csdn.net/qq_51625007 禁止其他平…

奇偶數遞增遞減-第13屆藍橋杯選拔賽Python真題精選

[導讀]&#xff1a;超平老師的Scratch藍橋杯真題解讀系列在推出之后&#xff0c;受到了廣大老師和家長的好評&#xff0c;非常感謝各位的認可和厚愛。作為回饋&#xff0c;超平老師計劃推出《Python藍橋杯真題解析100講》&#xff0c;這是解讀系列的第70講。 奇偶數遞增遞減&a…

vite+ts+mock+vue-router+pinia實現vue的路由權限

0.權限管理 前端的權限管理主要分為如下&#xff1a; 接口權限路由權限菜單權限按鈕權限 權限是對特定資源的訪問許可&#xff0c;所謂權限控制&#xff0c;也就是確保用戶只能訪問到被分配的資源 1.項目搭建 創建vite項目 yarn create vite配置別名 npm install path -…

4. C++入門:內聯函數、auto關鍵字、范圍for及nullptr

內聯函數 概念 以inline修飾的函數叫做內聯函數&#xff0c;編譯時C編譯器會在調用內聯函數的地方展開&#xff0c;沒有函數調用建立棧幀的開銷&#xff0c;內聯函數提升程序運行的效率 對比C的宏 C語言不足&#xff1a;宏 #define ADD(x, y) ((x)(y))int main() {int ret…

python實現520表白圖案

今天是520哦&#xff0c;作為程序員有必要通過自己的專業知識來向你的愛人表達下你的愛意。那么python中怎么實現繪制520表白圖案呢&#xff1f;這里給出方法&#xff1a; 1、使用圖形庫&#xff08;如turtle&#xff09; 使用turtle模塊&#xff0c;你可以繪制各種形狀和圖案…

Docker 安裝kingbase V8r6

下載 官網下載&#xff0c;注意&#xff1a;這里下載 Docker 版本v8r6 安裝 # 導入鏡像 docker load -i kingbase.tar# 重命名 docker tag [image-name]:[tag] [new-image-name]:[new-tag]# 刪除 docker rmi [image-name]:[tag]# 創建容器 docker run -tid \ --privileged \…