Java中內部類的概念與分類詳解
只能使用修飾限定符:public 和 默認 來修飾類
內部類概念
在 Java 中,將一個類定義在另一個類的內部,稱為內部類
就是在一個類內部進行其他類結構的嵌套操作
內部類也是封裝的一種體現(xiàn)
舉例:
//外部類 public class OutClass { //內部類 class InnerClass{ } }
注意:內部類和外部類共享一個 java源文件,但是經過編譯之后,會形成各自單獨的字節(jié)碼文件
內部類的分類:
成員內部類
在外部類中,內部類定義位置與外部類成員所處的位置相同,因此稱為成員內部類
成員內部類有:普通內部類和靜態(tài)內部類
普通內部類
未被 static 修飾的成員內部類
//外部類 public class OutClass { public void method(){ } //普通內部類 class InnerClass1{ } }
如何使用普通內部類??
先看普通類的使用:
package Date20210917; public class Test1 { int a; public void method1(){ } //普通內部類 class InnerClass{ int b; void method2() { } } public static void main(String[] args) { Test1 test1 = new Test1(); test1.method1(); }
普通類:先構造對象—通過對象訪問類內部的成員
那么,我們可以試著 new 一個 InnerClass 的對象:
我們發(fā)現(xiàn)并不可行,因為 InnerClass 也是 外部類的成員,所以我們在使用內部類時,需借助外部類的對象來創(chuàng)建內部類的對象
則正確操作:
public static void main(String[] args) { //普通類:先構造對象—通過對象訪問類 內部的成員 Test1 test1 = new Test1(); test1.method1(); //普通內部類 InnerClass innerClass = test1.new InnerClass(); innerClass.method2(); }
不同文件下 普通內部類的使用:
package Date20210917; //外部類 public class OutClass { //測試Test1 中的內部類的使用: void test(){ Test1 test1 = new Test1(); //要實例化 Test1 中內部類的對象 //InnerClass; 編譯器不能識別,因為該類沒在此文件中 Test1.InnerClass t = test1.new InnerClass(); } public static void main(String[] args) { } }
當內外部類出現(xiàn)同名變量時,使用就近原則~ 即:優(yōu)先訪問內部類的
public class Test1 { int a; int b; public void method1(){ } //普通內部類 class InnerClass{ int b; void method2() { a = 10; method1(); b = 66; //給內部類自己的 成員變量 b 賦值 } } }
內部類中給同名外部類成員變量賦值:
Test1.this.b = 88;
調試驗證:
即:編譯后,對 method2 進行以下修改
修改前:
void method2() { a = 10; method1(); b = 66; //給內部類自己的 成員變量 b 賦值 Test1.this.b = 88; }
修改后:
void method2(InnerClass this){ this$0.a = 10; method1(this$0); this.b = 66; Test1.this.b = 88; }
總結:
- 普通內部類對象必須在先有外部類對象前提下才能創(chuàng)建
- 外部類中,不能直接訪問內部類中的成員,如果要訪問必須先要創(chuàng)建內部類的對象
- 外部類中的任何成員都可以被在普通內部類方法中直接訪問
- 在內部類方法中訪問同名的成員時,優(yōu)先訪問自己的(就近原則),如果要訪問外部類同名的成員,必須:外部類名稱.this.同名成員 來訪問
靜態(tài)內部類
被 static 修飾的內部成員類稱為靜態(tà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)內部類對象的創(chuàng)建
1.同文件中創(chuàng)建:
//靜態(tài)成員變量的訪問 System.out.println(Test2.c); //不需要借助外部類對象來創(chuàng)建 InnerClass innerClass = new InnerClass();
2.不同文件里 創(chuàng)建:
void test2(){ //靜態(tài)成員變量的訪問: System.out.println(Test2.c); //靜態(tài)內部類對象 (類比靜態(tài)成員變量的訪問) Test2.InnerClass t = new Test2.InnerClass(); //靜態(tài)內部類對象可以直接創(chuàng)建,不需要依賴外部類對象 }
靜態(tài)內部類方法里能否訪問外部類的對象?
由上圖可得到:在靜態(tài)內部類中,只能訪問外部類中的靜態(tài)成員變量和靜態(tài)成員方法
注意事項:
- 在內部類中只能訪問外部類中的靜態(tài)成員
- 在同一文件中創(chuàng)建內部類對象時,可以直接創(chuàng)建,不需要借助外部類對象
- 在不同文件中創(chuàng)建內部類對象時,也可直接創(chuàng)建:所在文件名稱.內部類名稱.對象名
- 成員內部類,經過編譯之后會生成獨立的字節(jié)碼文件,命名格式為:外部類名稱$內部類名稱
局部內部類
定義在外部類的方法體或者 { } 中,該種內部類只能在其定義的位置使用,一般很少使用
//外部類 public class OutClass { public void method(){ //局部內部類 class InnerClass3{ } } { //局部內部類 class InnerClass4{ } } }
不能被訪問修飾限定符修飾:
不能再局部內部類中定義靜態(tài)成員
不能再局部內部類中定義靜態(tài)方法
注意事項:
局部內部類只能在所定義的方法體內部使用不能被public、static等修飾符修飾編譯器也有自己獨立的字節(jié)碼文件,命名格式:外部類名字$x內部類名字.class,x是一個整數(shù) 匿名內部類(這里不做講解)
總結
到此這篇關于Java中內部類的概念與分類的文章就介紹到這了,更多相關Java內部類內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springboot實現(xiàn)FastJson解析json數(shù)據的方法
本篇文章主要介紹了springboot實現(xiàn)FastJson解析json數(shù)據的方法,非常具有實用價值,需要的朋友可以參考下2017-04-04Springboot自動配置原理及DataSource的應用方式
這篇文章主要介紹了Springboot自動配置原理及DataSource的應用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07logback高效狀態(tài)管理器StatusManager源碼解析
這篇文章主要為大家介紹了logback高效狀態(tài)管理器StatusManager源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11