Java 類中不僅可以定義變量和方法,還可以定義類,這樣定義在類內部的類就被稱為內部類。根據定義的方式不同,內部類分為靜態內部類,成員內部類,局部內部類,匿名內部類四種。
一、靜態內部類
定義在類內部的靜態類,就是靜態內部類。
public class Out {
private static int a;
private int b;
public static class Inner {
public void print() {
System.out.println(a);
}
}
}
靜態內部類可以訪問外部類所有的靜態變量和方法,即使是 private 的也一樣。
靜態內部類和一般類一致,可以定義靜態變量、方法,構造方法等。
其它類使用靜態內部類需要使用“外部類.靜態內部類”方式,如下所示:Out.Inner inner =
new Out.Inner();inner.print();
- Java集合類HashMap內部就有一個靜態內部類Entry。Entry是HashMap存放元素的抽象,
HashMap 內部維護 Entry 數組用了存放元素,但是 Entry 對使用者是透明的。像這種和外部
類關系密切的,且不依賴外部類實例的,都可以使用靜態內部類。
二、成員內部類
定義在類內部的非靜態類,就是成員內部類。成員內部類不能定義靜態方法和變量(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 void test(final int c) {
final int d = 1;
class Inner {
public void print() {
System.out.println(c);
}
}
}
}
四、匿名內部類
匿名內部類我們必須要繼承一個父類或者實現一個接口,當然也僅能只繼承一個父類或者實現一個接口。同時它也是沒有 class 關鍵字,這是因為匿名內部類是直接使用 new 來生成一個對象的引用。
public class OuterClass {
public void someMethod() {
// 創建一個匿名內部類
Thread thread = new Thread() {
@Override
public void run() {
System.out.println("Hello from the anonymous class!");
}
};
thread.start();
}
public static void main(String[] args) {
OuterClass outer = new OuterClass();
outer.someMethod(); // 運行上述匿名內部類
}
}