java-內部類
阿新 • • 發佈:2020-10-26
概念:在一個類的內部再定義一個完整的類。
1.特點:
編譯之後可分別生成獨立的位元組碼檔案
內部類可以直接訪問外部類的私有成員,而不破壞封裝。
2.內部類在java中的型別:
成員內部類,靜態內部類,區域性內部類,匿名內部類。
3.成員內部類:(在類的內部定義和成員變數、成員方法同級別的類,
package day13; public class TestStaticClass { public static void main(String[] args) { // Outer2.StaticInner in3 =new Outer2.StaticInner(); // in3.method(); } } class Outer2 { private int a = 10;// 成員屬性 private static int b = 20; public Outer2(int a) { this.a = a; } public void m() { final int x = 20; class LocalInner { private int o = 30; // private static int p = 40;error! public void method() { System.out.println(o);// 30 // System.out.println(p); System.out.println(a);// 0 System.out.println(b);// 20 System.out.println(x);// 50 } }// 內部類的定義不算是該Outer2類的程式碼,因為他在編譯時,單獨形成一個.class檔案 LocalInner in = new LocalInner(); in.method(); } static class StaticInner { private int x = 10; public void method() { System.out.println(x); // System.out.println(a); System.out.println(b); } } }
即是成員內部類)
建立物件:先建立外部類物件,再通過外部類物件.new內部類類名() 建立內部類物件
成員內部類依託於外部類而存在的。如Outer1.MemberInner in1=o1.new MemberInner();
內部類可以直接訪問外部類的私有屬性,從而不破壞類的封裝性。
內部類訪問私有屬性例子:
package day13; public class demo { public static void main(String[] args) { Outer1 o1 = new Outer1(10); Outer1.MemberInner in1 = o1.new MemberInner(); in1.method();//30 Outer1 o2 = new Outer1(20); Outer1.MemberInner in2 = o2.new MemberInner(); in2.method();//30 } } class Outer1 { private int a; public Outer1(int a) { this.a = a; } public void m() { } class MemberInner { private int a=30; public void method() { int a=40; System.out.println(a);//40 System.out.println(this.a);//30 System.out.println(Outer1.this.a);//10 20 } } }
4.靜態內部類
靜態內部類只能訪問外部類的靜態成員。它不依賴與外部類(更獨立),用的時候比較方便。
程式碼例子:
package day13; public class TestStaticClass { public static void main(String[] args) { Outer2.StaticInner in3 =new Outer2.StaticInner(); in3.method(); } } class Outer2 { private int a = 10;// 成員屬性 private static int b=20; public Outer2(int a) { this.a = a; } public void m() { int x = 20; } static class StaticInner{ private int x=10; public void method() { System.out.println(x); // System.out.println(a); System.out.println(b); } } }
5.區域性內部類:定義在方法的內部(出了生命期就無法使用)
區域性變數:在方法範圍之內定義的變數。
區域性類:在方法裡定義的類。在方法裡定義後才能使用,出了該方法就無法使用。
作用範圍:從定義開始。到程式碼塊結束。
區域性內部類不能定義靜態成員
區域性內部類可以訪問外部類的私有成員,還能訪問外部類的區域性變數,但是要加上final
程式碼例子
package day13; public class TestTeacher { public static void main(String[] args) { Student1 t = new Student1(); t.study(); } } class School { public static Teacher getTeacher(int n) { class TeacherA implements Teacher { public void teach() { System.out.println("TeacherA 講課"); } } class TeacherB implements Teacher { public void teach() { System.out.println("TeacherB 講課"); } } if (n % 2 == 0) return new TeacherA(); else return new TeacherB(); } } class Student1 { public void study() { // TeacherA t = new TeacherA(); // Teacher t =School.getTeacher(); // t.teach(); // Teacher t =new TeacherA(); Teacher t = School.getTeacher(1); // Teacher t =new TeacherA(); t.teach(); } } interface Teacher { void teach(); }
6.區域性內部類訪問外部類區域性變數
package day13; public class TestLocalInnerClass { public static void main(String[] args) { } } class A{ public void method() { final int x=10; class B{ public void print() { System.out.println(x); } } } }
虛擬機器記憶體:
堆空間(存的是物件)
棧空間(存放的是區域性變數)
方法區:常量池,全域性性的屬性(如靜態屬性,全類公有)...