Java允許在類的內部聲明一個嵌套類,要么是非靜態內部類,要么是靜態內部類
嵌套類是其所在的外部類的一個成員屬性,非靜態嵌套類(inner class)可以訪問其所在外部類的所有成員,包括private修飾的,靜態嵌套類無法訪問其外部類實例的成員
內部類
內部類只能存在于外部類的實例中,它可以訪問外部類實例的所有私有變量。靜態內部類只能訪問外部類的靜態成員
class Test {
public static void main(String[] args) {
/* 非靜態內部類只能存在于外部類的實例中 - 所以要先實例化一個外部類實例 */
Test test = new Test();
Test.innerClass inner = test.new innerClass();
inner.setName("world");
System.out.println(inner.getName());
/* 靜態內部類可以直接訪問(如果訪問修飾符合適的話) */
Test.StaticInnerClass staticInner = new Test.StaticInnerClass();
System.out.println(staticInner.getName());
}
private String name = "hello";
private static String sName = "hello";
public class innerClass {
public String getName() {
/* 非靜態內部類中使用 外部類名.this 來引用外部類實例 */
return Test.this.name;
}
public void setName(String name) {
Test.this.name = name;
}
}
public static class StaticInnerClass {
public String getName() {
return Test.sName;
}
}
}
本地類或匿名類
除了在類內部定義嵌套類外,甚至還可以在塊(如方法體)內聲明嵌套類,這種嵌套類叫做本地類或匿名類(如果沒有類名的話)。
本地類可以訪問其所在外部類的成員。本地類還能訪問塊內的本地變量,但是這個本地變量必須是final或者effectively final
effectively final是指“某個變量雖然沒有使用final修飾符,但它的值自初始化后就再也沒有被更改過”
本地類的使用和內部類是類似的
匿名類其實就是表達式,即通過表達式來創建了類并實例化了對象。它的使用同構造函數類似,只是它包含了類的實現
class AnonymouseClass {
interface HelloWorld {
public void sayHi();
}
public void sayHello() {
HelloWorld chineseSay = new HelloWorld() {
public void sayHi() {
System.out.println("你好");
}
};
chineseSay.sayHi();
}
}