文章目錄
- 什么是 Java 中的內部類?有哪些類型的內部類?
- 匿名內部類
- 局部內部類(定義在方法中的類)
- 局部內部類
- 靜態內部類
Java 類中不僅可以定義變量和方法,還可以定義類,這樣定義在類內部的類就被稱為內部類。根
據定義的方式不同,內部類分為靜態內部類,成員內部類,局部內部類,匿名內部類四種。
什么是 Java 中的內部類?有哪些類型的內部類?
內部類是定義在另一個類中的類。Java 中有四種類型的內部類:成員內部類、靜態內部類、局部內部類和匿名內部類。
Java 內部類是定義在另一個類內部的類。與外部類不同,內部類可以訪問定義它們的外部類的成員變量和方法,并且可以被私有化,從而實現了封裝。
Java 內部類可以分為四種類型:成員內部類: 成員內部類是定義在類內部,并且不是靜態的內部類。成員內部類可以訪問外部類中的所有成員變量和方法,并且可以被私有化,從而實現了更好的封裝性。
undefined 靜態內部類: 靜態內部類是定義在類內部,并且被聲明為靜態的內部類。靜態內部類只能訪問外部類中的靜態成員變量和方法,不能訪問非靜態成員變量和方法,因為在外部類實例化時,靜態內部類已經存在于內存中,而非靜態成員變量和方法是需要實例化后才能被訪問的。
undefined 局部內部類: 局部內部類是定義在方法或代碼塊中的內部類。局部內部類只能在定義它的方法或代碼塊中使用,具有更小的作用域。
undefined 匿名內部類: 匿名內部類是沒有類名的內部類,用于定義一次性的、功能簡單的類。通常用于實現接口或繼承父類,并且只會使用一次。
內部類的使用場景包括:
undefined 為某個類提供一些幫助類,這些類只在外部類中使用到。
undefined 實現某個接口或繼承某個類,在最終的類中需要使用到。由于匿名內部類只能使用一次,所以通常用于比較簡單的實現。
undefined 隱藏某個類或接口,只能在外部類中使用。
undefined 將所有的輔助類都放在同一個包中,使得包對外"暴露"的類都是一個類,而不是多個類的組合。
總的來說,Java 內部類提供了更好的封裝和組織代碼的方式,可以使代碼更加清晰、簡潔,并且更加方便實現一些復雜的邏輯。
匿名內部類
要繼承一個父類或者實現一個接口、直接使用new 來生成一個對象的引用
匿名內部類我們必須要繼承一個父類或者實現一個接口,當然也僅能只繼承一個父類或者實現一個接口。同時它也是沒有 class 關鍵字,這是因為匿名內部類是直接使用 new 來生成一個對象的引用
public abstract class Bird {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public abstract int fly();
}
public class Test {public void test(Bird bird){System.out.println(bird.getName() + "能夠飛 " + bird.fly() + "米");}public static void main(String[] args) {Test test = new Test();test.test(new Bird() {public int fly() {return 10000;}public String getName() {return "大雁";}});}
}
匿名內部類是唯一一種沒有構造器的類。正因為其沒有構造器,所以匿名內部類的使用范圍非常有限,大部分匿名內部類用于接口回調。匿名內部類在編譯的時候由系統自動起名為Outter$1.class。一般來說,匿名內部類用于繼承其他類或是實現接口,并不需要增加額外的方法,只是對繼承方法的實現或是重寫。
public class Demo {private Runnable runnable = new Runnable() {@overridepublic void run() {}}
}
局部內部類(定義在方法中的類)
定義在方法中的類,就是局部類。如果一個類只在某個方法中使用,則可以考慮使用局部類。
public class Out {
private static int a;
private int b;
public void test(final int c) {
final int d = 1;
class Inner {
public void print() {
System.out.println?;
}
}
}
}
局部內部類
定義在類內部的非靜態類,就是成員內部類。成員內部類不能定義靜態方法和變量(final 修飾的
除外)。這是因為成員內部類是非靜態的,類初始化的時候先初始化靜態成員,如果允許成員內
部類定義靜態變量,那么成員內部類的靜態變量初始化順序是有歧義的。
public class Out {
private static int a;
private int b;
public class Inner {
public void print() {
System.out.println(a);
System.out.println(b);
}
}
}}
靜態內部類
定義在類內部的靜態類,就是靜態內部類
public class Out {private static int a;private int b;public static class Inner {public void print() {System.out.println(a);}}
}
undefined 靜態內部類可以訪問外部類所有的靜態變量和方法,即使是 private 的也一樣。
undefined 靜態內部類和一般類一致,可以定義靜態變量、方法,構造方法等。
undefined 其它類使用靜態內部類需要使用“外部類.靜態內部類”方式,如下所示:
Out.Inner inner =
new Out.Inner();inner.print();
undefined Java集合類HashMap內部就有一個靜態內部類Entry。Entry是HashMap存放元素的抽象,
HashMap 內部維護 Entry 數組用了存放元素,但是 Entry 對使用者是透明的。像這種和外部
類關系密切的,且不依賴外部類實例的,都可以使用靜態內部類。
參考:
https://blog.csdn.net/liuxiao723846/article/details/108006609