package com.devin;
public class MyMain{
private static String name = "woobo";
private String num = "X001";
// 靜態內部類可以用public,protected,private修飾
static class Person {
// 靜態內部類中可以定義靜態或者非靜態的成員
private String address = "China";
private static String x = "as";
public String mail = "[email protected]";// 內部類公有成員
public void display() {
// System.out.println(num);//不能直接訪問外部類的非靜態成員
// 靜態內部類不能訪問外部類的非靜態成員(包括非靜態變量和非靜態方法)
System.out.println(name);// 只能直接訪問外部類的靜態成員
// 靜態內部類只能訪問外部類的靜態成員(包括靜態變量和靜態方法)
System.out.println("Inner " + address);// 訪問本內部類成員。
}
}
public void printInfo() {
Person person = new Person();
// 外部類訪問內部類的非靜態成員:實例化內部類即可
person.display();
// System.out.println(mail);//不可訪問
// System.out.println(address);//不可訪問
System.out.println(person.address);// 可以訪問內部類的私有成員
System.out.println(Person.x);// 外部類訪問內部類的靜態成員:內部類.靜態成員
System.out.println(person.mail);// 可以訪問內部類的公有成員
}
public static void main(String[] args) {
MyMain staticTest = new MyMain();
staticTest.printInfo();
}
}
說明:“靜態內部類”與“嵌套類”概念上等價;“非靜態內部類”與“內部類”概念上等價。
1. 嵌套類的對象,並不需要其外圍類的對象。 即它可以不依賴於外部類實例被實例化。
2. 不能從嵌套類的對象中訪問非靜態的外圍類對象。 這是由Java語法中"靜態方法不能直接訪問非靜態成員"所限定
3. 外部類訪問內部類的的成員有些特別, 不能直接訪問, 但可以通過內部類實例來訪問, 這是因爲靜態嵌套內的所有成員和方法默認爲靜態的了.同時注意, 內部靜態類Person只在類StaticTest 範圍內可見, 若在其它類中引用或初始化, 均是錯誤的.
4 . 靜態內部類可以有靜態成員,而非靜態內部類則不能有靜態成員。
5. 靜態內部類的非靜態成員可以訪問外部類的靜態變量,而不可訪問外部類的非靜態變量;
6 . 非靜態內部類的非靜態成員可以訪問外部類的非靜態變量。
生成一個靜態內部類不需要外部類成員:這是靜態內部類和成員內部類的區別。靜態內部類的對象可以直接生成:Outer.Inner in = new Outer.Inner();而不需要通過生成外部類對象來生成。這樣實際上使靜態內部類成爲了一個頂級類(正常情況下,你不能在接口內部放置任何代碼,但嵌套類可以作爲接口的一部分,因爲它是static 的。只是將嵌套類置於接口的命名空間內,這並不違反接口的規則)