Java中內(nèi)部類的概念與分類詳解
只能使用修飾限定符:public 和 默認(rèn) 來修飾類
內(nèi)部類概念
在 Java 中,將一個(gè)類定義在另一個(gè)類的內(nèi)部,稱為內(nèi)部類
就是在一個(gè)類內(nèi)部進(jìn)行其他類結(jié)構(gòu)的嵌套操作
內(nèi)部類也是封裝的一種體現(xiàn)
舉例:
//外部類
public class OutClass {
//內(nèi)部類
class InnerClass{
}
}
注意:內(nèi)部類和外部類共享一個(gè) java源文件,但是經(jīng)過編譯之后,會(huì)形成各自單獨(dú)的字節(jié)碼文件

內(nèi)部類的分類:
成員內(nèi)部類
在外部類中,內(nèi)部類定義位置與外部類成員所處的位置相同,因此稱為成員內(nèi)部類
成員內(nèi)部類有:普通內(nèi)部類和靜態(tài)內(nèi)部類
普通內(nèi)部類
未被 static 修飾的成員內(nèi)部類
//外部類
public class OutClass {
public void method(){
}
//普通內(nèi)部類
class InnerClass1{
}
}
如何使用普通內(nèi)部類??
先看普通類的使用:
package Date20210917;
public class Test1 {
int a;
public void method1(){
}
//普通內(nèi)部類
class InnerClass{
int b;
void method2() {
}
}
public static void main(String[] args) {
Test1 test1 = new Test1();
test1.method1();
}
普通類:先構(gòu)造對(duì)象—通過對(duì)象訪問類內(nèi)部的成員
那么,我們可以試著 new 一個(gè) InnerClass 的對(duì)象:

我們發(fā)現(xiàn)并不可行,因?yàn)?InnerClass 也是 外部類的成員,所以我們在使用內(nèi)部類時(shí),需借助外部類的對(duì)象來創(chuàng)建內(nèi)部類的對(duì)象
則正確操作:
public static void main(String[] args) {
//普通類:先構(gòu)造對(duì)象—通過對(duì)象訪問類 內(nèi)部的成員
Test1 test1 = new Test1();
test1.method1();
//普通內(nèi)部類
InnerClass innerClass = test1.new InnerClass();
innerClass.method2();
}
不同文件下 普通內(nèi)部類的使用:
package Date20210917;
//外部類
public class OutClass {
//測(cè)試Test1 中的內(nèi)部類的使用:
void test(){
Test1 test1 = new Test1();
//要實(shí)例化 Test1 中內(nèi)部類的對(duì)象
//InnerClass; 編譯器不能識(shí)別,因?yàn)樵擃悰]在此文件中
Test1.InnerClass t = test1.new InnerClass();
}
public static void main(String[] args) {
}
}
當(dāng)內(nèi)外部類出現(xiàn)同名變量時(shí),使用就近原則~ 即:優(yōu)先訪問內(nèi)部類的
public class Test1 {
int a;
int b;
public void method1(){
}
//普通內(nèi)部類
class InnerClass{
int b;
void method2() {
a = 10;
method1();
b = 66; //給內(nèi)部類自己的 成員變量 b 賦值
}
}
}
內(nèi)部類中給同名外部類成員變量賦值:
Test1.this.b = 88;
調(diào)試驗(yàn)證:

即:編譯后,對(duì) method2 進(jìn)行以下修改
修改前:
void method2() {
a = 10;
method1();
b = 66; //給內(nèi)部類自己的 成員變量 b 賦值
Test1.this.b = 88;
}
修改后:
void method2(InnerClass this){
this$0.a = 10;
method1(this$0);
this.b = 66;
Test1.this.b = 88;
}
總結(jié):
- 普通內(nèi)部類對(duì)象必須在先有外部類對(duì)象前提下才能創(chuàng)建
- 外部類中,不能直接訪問內(nèi)部類中的成員,如果要訪問必須先要?jiǎng)?chuàng)建內(nèi)部類的對(duì)象
- 外部類中的任何成員都可以被在普通內(nèi)部類方法中直接訪問
- 在內(nèi)部類方法中訪問同名的成員時(shí),優(yōu)先訪問自己的(就近原則),如果要訪問外部類同名的成員,必須:外部類名稱.this.同名成員 來訪問
靜態(tài)內(nèi)部類
被 static 修飾的內(nèi)部成員類稱為靜態(tài)內(nèi)部類
public class Test2 {
int a;
int b;
static int c;
static void method1(){
System.out.println("我是method()");
}
static class InnerClass{
int d;
static int e;
void method2(){
}
}
}
靜態(tài)內(nèi)部類對(duì)象的創(chuàng)建
1.同文件中創(chuàng)建:
//靜態(tài)成員變量的訪問 System.out.println(Test2.c); //不需要借助外部類對(duì)象來創(chuàng)建 InnerClass innerClass = new InnerClass();
2.不同文件里 創(chuàng)建:
void test2(){
//靜態(tài)成員變量的訪問:
System.out.println(Test2.c);
//靜態(tài)內(nèi)部類對(duì)象 (類比靜態(tài)成員變量的訪問)
Test2.InnerClass t = new Test2.InnerClass();
//靜態(tài)內(nèi)部類對(duì)象可以直接創(chuàng)建,不需要依賴外部類對(duì)象
}
靜態(tài)內(nèi)部類方法里能否訪問外部類的對(duì)象?

由上圖可得到:在靜態(tài)內(nèi)部類中,只能訪問外部類中的靜態(tài)成員變量和靜態(tài)成員方法
注意事項(xiàng):
- 在內(nèi)部類中只能訪問外部類中的靜態(tài)成員
- 在同一文件中創(chuàng)建內(nèi)部類對(duì)象時(shí),可以直接創(chuàng)建,不需要借助外部類對(duì)象
- 在不同文件中創(chuàng)建內(nèi)部類對(duì)象時(shí),也可直接創(chuàng)建:所在文件名稱.內(nèi)部類名稱.對(duì)象名
- 成員內(nèi)部類,經(jīng)過編譯之后會(huì)生成獨(dú)立的字節(jié)碼文件,命名格式為:外部類名稱$內(nèi)部類名稱

局部?jī)?nèi)部類
定義在外部類的方法體或者 { } 中,該種內(nèi)部類只能在其定義的位置使用,一般很少使用
//外部類
public class OutClass {
public void method(){
//局部?jī)?nèi)部類
class InnerClass3{
}
}
{ //局部?jī)?nèi)部類
class InnerClass4{
}
}
}
不能被訪問修飾限定符修飾:

不能再局部?jī)?nèi)部類中定義靜態(tài)成員

不能再局部?jī)?nèi)部類中定義靜態(tài)方法

注意事項(xiàng):
局部?jī)?nèi)部類只能在所定義的方法體內(nèi)部使用不能被public、static等修飾符修飾編譯器也有自己獨(dú)立的字節(jié)碼文件,命名格式:外部類名字$x內(nèi)部類名字.class,x是一個(gè)整數(shù) 匿名內(nèi)部類(這里不做講解)
總結(jié)
到此這篇關(guān)于Java中內(nèi)部類的概念與分類的文章就介紹到這了,更多相關(guān)Java內(nèi)部類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot整合mybatis-plus快速入門超詳細(xì)教程
mybatis-plus 是一個(gè) Mybatis 的增強(qiáng)工具,在 Mybatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開發(fā)、提高效率而生,本文給大家分享SpringBoot整合mybatis-plus快速入門超詳細(xì)教程,一起看看吧2021-09-09
SpringBoot項(xiàng)目部署到服務(wù)器上的方法(Jar包)
這篇文章主要介紹了SpringBoot項(xiàng)目部署到服務(wù)器上的方法(Jar包),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
Mybatis 中的一對(duì)一,一對(duì)多,多對(duì)多的配置原則示例代碼
這篇文章主要介紹了 Mybatis 中的一對(duì)一,一對(duì)多,多對(duì)多的配置原則示例代碼,需要的朋友可以參考下2017-03-03
Mybatis-Plus使用saveOrUpdate及問題解決方法
本文主要介紹了Mybatis-Plus使用saveOrUpdate及問題解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
Java導(dǎo)出多個(gè)excel表打包到zip文件中供客戶端另存為窗口下載實(shí)現(xiàn)方法
最近的項(xiàng)目有一個(gè)導(dǎo)出匯總數(shù)據(jù)的要求,考慮到用戶軟件的差異,所以要分別導(dǎo)出xls以及xlsx并且打包提供下載,下面這篇文章主要給大家介紹了關(guān)于Java導(dǎo)出多個(gè)excel表打包到zip文件中供客戶端另存為窗口下載的實(shí)現(xiàn)方法,需要的朋友可以參考下2023-12-12
SpringBoot開發(fā)中的數(shù)據(jù)源詳解
這篇文章主要介紹了SpringBoot開發(fā)中的數(shù)據(jù)源詳解,數(shù)據(jù)源(Data Source)顧名思義,數(shù)據(jù)的來源,是提供某種所需要數(shù)據(jù)的器件或原始媒體,在數(shù)據(jù)源中存儲(chǔ)了所有建立數(shù)據(jù)庫(kù)連接的信息,需要的朋友可以參考下2023-09-09

