Java內部類概述
阿新 • • 發佈:2021-08-02
Java內部類概述
成員內部類
-
就像外部類總的一個成員,可以訪問外部類中的所有引數和方法,但是外部類不能直接訪問內部類的引數和方法
-
成員內部類也可以設定訪問許可權修飾符,private、public、protected,預設
-
在成員內部類中不能有靜態引數和靜態方法
-
成員內部類的例項化需要藉助外部類的例項來例項,即
Outer.Inner inner=new Outer().new Inner();
區域性內部類
- 顧名思義,這是在方法或者作用域中的類,所以不能有public、private等訪問控制符修飾
匿名內部類
-
匿名內部類是一種沒有具體類名的類,但是是一種用的較多的內部類
-
匿名內部類可以用於實現介面,繼承類,並且實現其中的方法,例如
public class Outter3 { public static void main(String[] args) { Animal animal = new Animal() { //實現了介面Animal的匿名內部類 @Override public String xiaoLaoFu() { return "dai"; } }; System.out.println(animal.xiaoLaoFu()); Temp2 temp2 = new Temp2() { //匿名內部類繼承Temp2 @Override public String method3() { return "被重寫了的方法"; } }; System.out.println(temp2.method3()); } } interface Animal { String xiaoLaoFu(); } class Temp2 { public String method3() { return "temp2中的方法"; } }
- 匿名內部類是唯一一種沒有構造器的類。正因為其沒有構造器,所以匿名內部類的使用範圍非常有限,大部分匿名內部類用於介面回撥。匿名內部類在編譯的時候由系統自動起名為 Outter$1.class。一般來說,匿名內部類用於繼承其他類或是實現介面,並不需要增加額外的方法,只是對繼承類和實現的介面中的方法重寫。
靜態內部類
-
靜態內部類與成員內部類類似,但是其是static修飾的,所以同樣的,靜態內部類類似於外部類中的靜態變數一樣,可以直接訪問外類類中的靜態屬性
-
靜態內部類的例項化不需要藉助於外部類例項:
class Outter4 { static String dabenxiang = "快跑呀"; String dazhuzhu = "白花花"; //靜態內部類 static class Inner4 { public void method() { System.out.println("靜態內部類可以直接訪問外部類中的靜態變數:" + dabenxiang); // System.out.println(dazhuzhu); // 訪問不到 System.out.println("靜態內部類中的方法!"); } } public static void main(String[] args) { //靜態內部類的例項化 Inner4 inner4 = new Inner4(); inner4.method(); Outter4.Inner4 inner41 = new Outter4.Inner4(); } } // 在其他類中例項化靜態內部類 class Temp { public static void main(String[] args) { Outter4.Inner4 inner4 = new Outter4.Inner4(); inner4.method(); } }
內部類的使用場景和好處
- 使得多繼承的解決方案變得完整,每個內部類都能獨立的繼承和實現介面,並且無論外部類是否已經繼承或實現介面
- 可以將存在一定邏輯關係的類組織在一起,同時可以對外界隱藏,例如事件驅動程式,執行緒執行
成員內部類也可以被繼承,當成員內部類被繼承的時候,其引用方式必須為 Outter.Inner,並且構造器中必須有指向外部類物件的引用,並通過這個引用呼叫super() :
class WithInner {
class Inner{
}
}
class InheritInner extends WithInner.Inner {
// InheritInner() 是不能通過編譯的,一定要加上形參
InheritInner(WithInner wi) {
wi.super(); //必須有這句呼叫
}
public static void main(String[] args) {
WithInner wi = new WithInner();
InheritInner obj = new InheritInner(wi);
}
}