Inner Class 即嵌套類,也即C++和C#中的Nested Class。但Java 的Inner Class 與 C++和C#最大的不同之處在於,嵌套類包含一個指向其容器類的引用,可以訪問容器類的成員。以下代碼演示了這一點:
public class Container {
String Name;
class InnerClass
{
InnerClass(){};
public void func()
{
System.out.println(Name);
}
}
public Container(String name){
Name=name;
InnerClass a=new InnerClass();
}
public static void main(String [] arg)
{
Container a=new Container(“ContainerA");
InnerClass b=a.new InnerClass(); //注意此處
InnerClass c=(new Container(“ContainerB")).new InnerClass(); //本質上等價於上一句
a.func();
c.func();
}
}
注意其中獨特的new語法,在靜態函數要創建一個Inner Class,必須有一個其容器類的實例。如果直接創建
InnerClass b=new InnerClass();
則會導致編譯出錯。
而在Container的構造函數中,創建InnerClass時,自動將this作為InnerClass的引用。
在Inner Class 中使用容器類的成員,不需指定實例,自動指向創建它的容器類。
這是一個很有用的語法特征,編譯器替我們省了許多事。
本例的輸出是:
ContainerA
ContainerB
還可以看到,Inner Class 可以訪問容器類的任何成員,不管是public、private或protected的成員全是透明的。反之則不然,容器類只能訪問Inner Class的public成員。