初始Java篇(JavaSE基礎語法)—— 內部類

?找往期文章包括但不限于本期文章中不懂的知識點:

個人主頁:我要學編程(?_?)-CSDN博客

所屬專欄:JavaSE

目錄

內部類的概念?

內部類的種類

使用舉例:

1. 靜態內部類:

2. 實例內部類

3. 局部內部類

4. 匿名內部類


內部類的概念?

當一個事物的內部,還有一個部分需要一個完整的結構進行描述,而這個內部的完整的結構又只為外部事物提供服 務,那么這個內部的完整結構最好使用內部類。在 Java 中,可以將一個類定義在另一個類或者一個方法的內部, 前者稱為內部類,后者稱為外部類。內部類也是封裝的一種體現。

最常見的語法格式:

// OutClass是外部類
// InnerClass是內部類public class OutClass {//……class InnerClass{//……}//……
}

注意:內部類和外部類共用同一個 .java后綴 的源文件,但是經過編譯之后,內部類會形成單獨的字節碼文件。?如下:

?

細心的小伙伴應該也已經發現了:內部類的類名前面有其所在的外部類類名加上一個$符號。這個就是用來區分的。就是告訴我們,A這個類是Test這個類中的內部類。

那么外部類和不同的類相比,有什么變化呢?其實沒什么變化,我們就可以把內部類看成是外部類的一個成員變量,僅僅只是多個成員變量而已。因此可以把內部類看成是一個成員變量。

內部類的種類

內部類其實有很多種。?根據其所處的位置不同,分為3種。?

1. 實例內部類。其所處的位置是成員變量的位置,并且沒有被 static 修飾。

// 外部類
public class Test {// 實例內部類class A {}
}

2. 靜態內部類。同樣是在成員變量的位置,不過有個 static 修飾它。

public class Test {// 靜態內部類static class B {}
}

3. 局部內部類。在方法內定義的類。這種類用的比較少,因為它的作用域有限。?

public class Test {public static void main(String[] args) {// 局部內部類class C {}}
}

注意:局部內部類不能被 static 修飾,就和局部變量一樣。被 static 修飾的都是類的屬性和方法了,其作用域都已經改變了,和 “局部” 兩個字發生了沖突。

4. 還有一種不是根據所處的位置定義的,那就是匿名內部類。

匿名內部類沒有名字,直接在創建對象時定義并實例化,常用于實現接口或繼承抽象類。雖然匿名內部類并非強制要求在方法中使用,實踐中幾乎總是將其放在方法內以體現其臨時性和局部性,便于管理和理解代碼。

public class Test {public static void main(String[] args) {// 匿名內部類new Test() {};}
}

使用舉例:

1. 靜態內部類:

// 外部類
public class Test {public static int a = 1;public static int b = 2;public static int c = 3;// 靜態內部類static class B {public static int d = 4;public static int e = 5;public static int a = 100; // 和外部類的成員變量名相同public int f = 6;public static void main(String[] args) {// 由于main方法時靜態方法,不創建對象的情況下,只能訪問靜態的東西。// 因此變量全部都是static修飾的。// 當外部類和內部類同名時,要通過外部類對象的引用或者類名來訪問System.out.println(Test.a);System.out.println(a);System.out.println(b);System.out.println(c);System.out.println(d);System.out.println(e);// 雖然靜態內部類中可以有非靜態的成員變量和方法,但是卻還是不能在靜態方法中使用// System.out.println(f);}}
}

?運行結果:

如果要在外部訪問靜態內部類怎么做呢?其實就是和訪問靜態成員變量是一樣的。通過類名來訪問。如下:

2. 實例內部類

// 外部類
public class Test {public int a = 1;public static int b = 2;public int c = 3;public int d = 4;// 實例內部類class B {public int f = 5;public int e = 6;public int a = 100;public void func(){// 同樣有同名的變量是優先訪問自己的System.out.println(a);// 如果想要訪問外部的,得通過 外部類名稱.this.同名成員名字 的方法System.out.println(Test.this.a);}}
}

如果想要創建內部類對象,該怎么做呢?

public class TestDrive {public static void main(String[] args) {//    通過外部類訪問內部類// 法一:Test.B tb = new Test().new B();// 法二:Test test = new Test();test.B tb = tset.new B();tb.func();}
}

我們把這個實例內部類看成是一個實例成員變量就好了,用訪問實例成員的方法來訪問實例內部類。而實例成員是通過對象的引用來訪問的。?

既然類型是通過外部類來訪問內部類的,那么對象的創建也應如此:先創建外部類對象,再通過外部類對象來創建內部類對象。

注意:

1. 外部類中的任何成員都可以在實例內部類方法中直接訪問。

2. 在實例內部類方法中訪問同名的成員時,優先訪問自己的,如果要訪問外部類同名的成員,必須:外部類名 稱.this.同名成員 來訪問。因為實例內部類本身也有一個屬于自己的 this 。

3. 實例內部類對象必須在先有外部類對象前提下才能創建。

5. 實例內部類的非靜態方法中包含了一個指向外部類對象的引用。這個引用不是顯式地在代碼中聲明的,而是由Java編譯器自動添加的。在內部類的方法中,你可以直接使用外部類的成員變量和方法,就像它們是內部類自己的一樣。實際上,編譯器會在內部類的方法代碼中插入必要的代碼來通過這個隱含的引用訪問外部類的成員。

6. 外部類中,不能直接訪問實例內部類中的成員,如果要訪問必須先要創建內部類的對象。因為內部類中的成員作用域是只在內部類中。可以理解為在另一個類中訪問一個與其不相干的類,自然要通過對象的引用來訪問,也就是需要創建一個對象。

3. 局部內部類

// 外部類
public class Test {public static void main(String[] args) {// 局部內部類class B {public int a;public int b;public void func() {System.out.println("這是內部類中的方法...");}}// 只能在定義的方法內部使用B b = new B();b.func();}
}

注意:

1. 局部內部類既然是在方法內部定義的,那么它們的作用域也只能是在方法內部。

2. 局部內部類不能被public 、 static 等修飾符修飾。因為public 、static 修飾的都是類中的變量或者方法,怎么可能會去修飾局部變量的呢?

4. 匿名內部類

雖然匿名內部類多是在有抽象類和接口的情況下使用,但并不意味著不能普通類不能有匿名內部類。

普通類:?

// 普通類
class A {public void func() {System.out.println("這是普通類的方法...");}
}// 外部類
public class Test {public static void main(String[] args) {// 這是匿名對象,也就是創建了一個沒有對象引用的對象// 正因如此,這個對象只能使用一次,匿名內部類同樣如此new A();// 匿名內部類new A(){// 匿名內部類的使用就是為了重寫抽象類和接口的方法@Overridepublic void func() {super.func(); // 可以理解為:繼承這個普通類之后,又重寫了其中的方法}}.func(); // 這里就是在調用這個對象的方法 }
}

抽象類:

// 抽象類
abstract class B {public abstract void func();
}// 外部類
public class Test {public static void main(String[] args) {new B(){@Overridepublic void func() {System.out.println("可以理解為:繼承了B這個抽象類,并重寫了B這個抽象類中的方法");}}.func();}
}

接口:

// 接口
interface C {void func();
}// 外部類
public class Test {public static void main(String[] args) {new C(){@Overridepublic void func() {System.out.println("可以理解為:實現了C這個接口,并重寫了C這個接口中的方法");}}.func();}
}

上面就是匿名內部類的使用方法。?

注意:

1. 在匿名內部類中可以使用對象的引用去接收,但是不能再其后面調用方法了,而是要通過對象的引用來調用方法。如下(注意對比):

好啦!本期?初始Java篇(JavaSE基礎語法)—— 內部類 的學習之旅就到此結束啦!我們下一期再一起學習吧!

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

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

相關文章

1分鐘帶你搞定Pandas DataFrame運算

1. DataFrame之間的運算 在運算中自動對齊不同索引的數據 如果索引不對應,則補NaN DataFrame沒有廣播機制 導包 # 導包import numpy as npimport pandas as pd 創建 DataFrame df1 不同人員的各科目成績,月考一 # 創建DataFrame二維數組df1 pd.Da…

想要修改Excel表格內容,怎么移除編輯權限?

在使用Excel進行數據處理和管理時,我們經常會遇到需要保護工作表以防止誤操作的情況。有時可能碰到“被保護單元格不支持此功能”的提示,本文將詳細介紹這個問題的解決方案,幫助你取消單元格保護,使用所需的功能。 一、取消單元格…

leetcode刷題記錄:前綴和

https://labuladong.online/algo/problem-set/perfix-sum/#%E8%A7%A3%E6%B3%95%E4%BB%A3%E7%A0%81-3 適用范圍:快速、頻繁地計算一個索引區間內的元素之和 303 區域和檢索:數組不可變 https://leetcode.cn/problems/range-sum-query-immutable/ class …

【Unitydemo制作】音游制作—排行榜邏輯Json存儲

👨?💻個人主頁:元宇宙-秩沅 👨?💻 hallo 歡迎 點贊👍 收藏? 留言📝 加關注?! 👨?💻 本文由 秩沅 原創 👨?💻 收錄于專欄:就業…

GQL 來了!ISO/IEC 正式發布 GQL 數據庫國際標準!

歷時四年籌備,超過20個國家的標準和技術專家參與制定,ISO/IEC GQL (圖查詢語言)標準于2024年4月12日正式發布! 作為國際標準化組織(ISO)繼 1987年 發布SQL后,唯一發布的數據庫查詢語…

瑞米派Ubuntu系統移植指南-米爾RemiPi

1.概述 Linux系統平臺上有許多開源的系統構建框架,這些框架方便了開發者進行嵌入式系統的構建和定制化開發,目前比較常見的有Buildroot, Yocto, OpenEmbedded等等。 同時更多的傳統的桌面系統也加入到嵌入式環境體系中,如Ubuntu&#xff0c…

Marin說PCB之POC電路layout設計仿真案例---03

今天天中午午休的時候,我剛要打開手機的準備刷抖音看無憂傳媒的學生們的“學習資料”的時候,看到CSDN -APP上有提醒,一看原來是一位道友發的一個問題: 本來小編最近由于剛剛從國外回來,手上的項目都已經結束了&#xf…

如何制作正方形,給 placeholder 換顏色,多行省略號,純css小三角,清除浮動,清除 margin,隱藏滾動條,隱藏 number 小圖標

https://www.npmjs.com/package/sass-runtime-tool yarn add sass-runtime-tool -D # or npm i -D sass-runtime-tool use "sass-runtime-tool/all.scss" as *;// 改變 placeholder 的顏色和大小 .input {include placeholder(red) {font-size: 12px;} } /* 或者 *…

一個模板元函數來檢查一個類是否有一個特定的成員

通過創建一個模板元函數來檢查一個類是否有一個特定的成員。以下是一個例子&#xff1a; #include <type_traits>template<typename T, typename void> struct has_type_member : std::false_type {};template<typename T> struct has_type_member<T, s…

Matlab:音頻處理

用Matlab繪制一段音頻信號在時域上的波形圖&#xff0c;然后用低通濾波器濾掉噪音并再次繪制 1、導入音頻文件 filename X:\1.mp3; % 替換為你的音頻文件路徑 [x, Fs] audioread(filename); 2、獲取音頻信號長度 len length(x); 3、計算時間軸 t (0:len-1) / Fs; 4、…

小程序properties默認值定義及父子組件的傳值

因經常寫vue&#xff0c;很久沒寫小程序&#xff0c;容易串頻道&#xff0c;現記錄一下小程序的組件用法、監聽傳入值及父子傳值方式 首先小程序中傳值是沒有&#xff1a;(冒號)的&#xff0c;其次properties中定義默認值不需要寫default 1.自定義組件中&#xff0c;首先json…

OSPF原理(1)

一、OSPF介紹 OSPF&#xff08;Open Shortest Path First&#xff0c;開放最短路徑優先&#xff09;協議作為一種基于鏈路狀態的路由協議&#xff0c;它為網絡中的路由器提供了一種高效、可靠的方式來共享路由信息&#xff0c;并計算出最短路徑。 特點&#xff1a; 收斂速度快…

踩坑——紀實

開發踩坑紀實 1 npm安裝1.1 查看當前的npm鏡像設置1.2 清空緩存1.3 修改鏡像1.4 查看修改結果1.5 重新安裝vue 2 VScode——NPM腳本窗口找不到3 springboot項目中updateById()失效4 前端跨域4.1 后端加個配置類4.2 CrossOrigin注解 5 路由出口6 springdoc openapi3 swagger3文件…

C語言函數遞歸

文章目錄 一、遞歸1.遞歸的概念2.遞歸的思想3.遞歸的限制條件 二、遞歸的一些典型例子1.求一個數的階乘2.順序打印一個整數的每一位3.漢諾塔4.青蛙跳臺階5斐波那契數列遞歸和迭代的對比 一、遞歸 1.遞歸的概念 遞歸是學習C語言函數繞不開的一個話題&#xff0c;那什么是遞歸呢…

【算法刷題day56】 Leetcode:647. 回文子串、516. 最長回文子序列

文章目錄 Leetcode 647. 回文子串解題思路代碼總結 Leetcode 516. 最長回文子序列解題思路代碼總結 草稿圖網站 java的Deque Leetcode 647. 回文子串 題目&#xff1a;647. 回文子串 解析&#xff1a;代碼隨想錄解析 解題思路 斜上三角&#xff0c;從左下往上遍歷&#xff0c…

【代碼隨想錄】動態規劃之完全背包問題與打家劫舍問題

前言 更詳細的在大佬的代碼隨想錄 (programmercarl.com) 本系列僅是簡潔版筆記&#xff0c;為了之后方便觀看 完全背包 for(int i 0; i < weight.size(); i) { // 遍歷物品for(int j weight[i]; j < bagWeight; j) { // 遍歷背包容量dp[j] max(dp[j], dp[j - weigh…

ElementPlus Steps步驟條插槽 v-slot:title

<el-steps finish-status"success"><el-stepv-for"item in uniqueReverseArr":status"item.status 2? success: item.status 3? error: item.status 1? finish: process"click.native"stepClick(item)"><templat…

PyTorch中Tensor簡介

PyTorch中所有的操作都是基于Tensor&#xff08;張量&#xff09;的&#xff0c;因此理解張量的含義并能夠自由創建張量是十分必要的。 張量是PyTorch中最基本的操作對象。我們可以用數學中的概念來輔助理解一下張量&#xff0c;如圖5-1所示。 標量&#xff08;Scalar&#x…

c#數據庫的增刪改查

** 安裝數據庫包 ** 在使用 SQLite 數據庫時&#xff0c;你需要安裝適當的 NuGet 包來提供與 SQLite 的集成。 1.打開 Visual Studio 中的你的項目 2.在頂部菜單欄中選擇 “項目” -> “管理 NuGet 包” 3.在 NuGet 管理器中搜索 “System.Data.SQLite” 4.找到適合你項目…

【openlayers系統學習】1.1渲染GeoJSON,添加link交互

一、渲染GeoJSON 在進入編輯之前&#xff0c;我們將看一下使用矢量源和圖層進行基本要素渲染。Workshop在 data? 目錄中包含一個 countries.json? GeoJSON文件。我們首先加載該數據并將其渲染在地圖上。 首先&#xff0c;編輯 index.html? 以便向地圖添加深色背景&#xf…