一、內部類的概念
在 Java 中,可以將一個類定義在另一個類或者一個方法的內部,前者稱為內部類,后者稱為外部類。內部類也是封裝的一種體現。
public class OutClass {//外部類 class InnerClass{//內部類 } }
注意事項:
1、內部類一定是定義在class 類名{}之中的類,定義在class 類名{}之外的,哪怕是在一份文件中,也并不能稱為內部類。例如:
public class A{ } class B{ } //A和B兩個類是獨立的,無內外部類一說
2、內部類和外部類共用同一個java源文件,但是經過編譯之后,內部類會形成單獨的字節碼文件。
二、內部類的分類
public class OutClass { //普通內部類 class InnerClass1{ } //靜態內部類 static class InnerClass2{ } { //定義在實例代碼塊中的 局部內部類 class InnerClass3{ } } static{ //定義在靜態代碼塊中的 局部內部類 class InnerClass4{ } } public void method(){ //定義在方法中的 局部內部類 class InnerClass5{ } { //方法中的普通代碼塊中也可以定義局部內部類 class InnerClass6{ } } } }
根據內部類定義的位置不同,可以分為:
成員內部類:普通內部類和靜態內部類。
局部內部類和匿名內部類。
三、成員內部類
1、普通內部類
未被static修飾的成員內部類。
public class OutClass {//外部類 private int a; private int b; private int c; public void method1(){ a=100; System.out.println(a); } public void method2(){ System.out.println(b); } class InnerClass{ //普通內部類 private int c; //與外部類成員變量名稱相同的內部成員變量 public void methodInner() { //在內部類中可以直接訪問外部類任意限定符的成員變量和方法 b = 150; method1(); method2(); //在訪問與外部類成員名稱相同的成員時,優先訪問內部類自己的成員 c = 300; System.out.println(c); //要訪問外部類中的同名成員必須使用――― 外部類名.this.成員名 來訪問 OutClass.this.c = 400; System.out.println(OutClass.this.c); } } public static void main(String[] args) { //創建內部類對象 OutClass.InnerClass innerclass1=new OutClass().new InnerClass(); //也可以先創建外部類對象,再創建內部類對象 OutClass outclass=new OutClass(); //注意當在不同文件中創建其內部類對象一定需要加上該內部類的外部類名,同一文件下可加可不加 OutClass.InnerClass innerclass2=outclass.new InnerClass(); innerclass2.methodInner(); } }
/*
100
150
300
400
*/
注意事項:
1、普通內部類中可以直接訪問外部類中的所有方法。
2、普通內部類成員的位置與外部類成員位置相同,都受public,private等限定符的限制。
3、在普通內部類方法中訪問同名的成員時,優先訪問自己的,如果要訪問外部類同名的成員,必須:外部類名稱.this.同名成員 來訪問。
4、要創建普通內部類對象,要先創建外部類的對象。在創建內部類對象時,如果該內部類在當前文件,則在創建對象語句最前面不需要外部類名,如果在不同文件,那么一定要指明該內部類的外部類名。
5、 普通內部類中包含了一個指向外部類對象的引用。
6、外部類中,不能直接訪問內部類中的成員,如果要訪問必須先要創建內部類的對象。
public class OutClass1 { private int a; public void method(){ System.out.println(c); //在外部類中直接訪問內部類成員,編譯報錯 } class InnerClass{ private int c; } }
public class OutClass1 { private int a; public void methodOut(){ InnerClass I2=new InnerClass();//在外部類方法中創建內部類對象可以直接創建 System.out.println(I2.c); } class InnerClass{ private int c; } }
從堆和棧的角度來看內部類和外部類:
2、靜態內部類
被static修飾的成員內部類稱為靜態內部類。
public class OutClass {//外部類 private int a; static int b; //靜態變量 public void method1(){ } public static void method2(){ //靜態方法 } static class InnerClass{ //靜態內部類 public void methodInner() { //在靜態內部類中只能訪問外部類的靜態成員和方法 // a=100;編譯失敗,a不是外部類的成員變量 b = 150; // method1();編譯失敗,method1不是外部類的成員方法 method2(); } } public static void main(String[] args) { //靜態內部類的創建 InnerClass innerclass=new InnerClass(); //成員訪問 innerclass.methodInner(); } }
注意事項:
1、在內部類中只能訪問外部類中的靜態成員。
2、創建靜態內部類對象時,不需要先創建外部類對象。
3、成員內部類,經過編譯之后會生成自己獨立的字節碼文件,例如下:
四、局部內部類
定義在外部類的方法體或者{}中,該種內部類只能在其定義的位置使用。
public class OutClass {//外部類 int a=10; public void method(){ //外部類方法 int b=10; class InnerClass{ //局部內部類,只能在該方法體內部使用 public void methodInnerClass(){ System.out.println(a); System.out.println(b); } } InnerClass innerclass=new InnerClass(); innerclass.methodInnerClass(); } public static void main(String[] args) { //InnerClass innerclass=null; 編譯失敗 } }
注意事項:
1、局部內部類只能在所定義的方法體內部使用。
2、局部內部類不能被public、static等限定符修飾。
3、同樣編譯之后局部內部類會生成自己的字節碼文件。
命名格式:外部類名$x內部類名.class, 其中x是一個整數。
五、對象的打印
public class Person { String name; String gender; int age; public Person(String name,String gender,int age){ this.name=name; this.gender=gender; this.age=age; } public static void main(String[] args) { Person person=new Person("luka","man",21); System.out.println(person); } }
打印結果: 并不是對象本身。
如果想要打印對象本身,那么需要重寫toString方法。
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
public String toString() { //重寫了toString方法 return "[" + name + "," + gender + "," + age + "]"; }
public class Person { String name; String gender; int age; public Person(String name,String gender,int age){ this.name=name; this.gender=gender; this.age=age; } public String toString() { //重寫了toString方法 return "[" + name + "," + gender + "," + age + "]"; } public static void main(String[] args) { Person person=new Person("luka","man",21); System.out.println(person); } }
/*
執行結果:
[luka,man,21]
*/
到此這篇關于詳解Java內部類與對象的打印概念和流程的文章就介紹到這了,更多相關Java 內部類內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/m0_58715346/article/details/120498819