12.3.4 靜態內部類
在上一小節我們討論了內部類,即在一個類中包含有另外一個或者多個類(見本書12.3.3小節)。與 內部類相似,靜態內部類指在一個類的內部包含有另外一個或者多個靜態類。例如:
public class OuterClass {
...
static class StaticInnerClass1 { //內部靜態類
//只可以訪問OuterClass的靜態成員
...
} //StaticInnerClass結束
...
static class StaticInnerClassN { // 更多靜態內部類
//只可以訪問OuterClass的靜態成員
...
} //StaticInnerClassN結束
} //OuterClass結束
與一般內部類不同,在靜態代碼中不能夠使用this操作,所以在靜態內部類中只可以訪問外部類的靜 態變量和靜態方法。使用靜態內部類的目的和使用內部類相同。如果一個內部類不依賴於其外部類的實例 變量,或與實例變量無關,則選擇應用靜態內部類。
如下例子演示怎樣使用靜態內部類:
///完整程序存在本書配套資源目錄Ch12名為StaticInnerClassTest.java
public class StaticInnerClassTest {
public static void main( String args[] ) {
OuterClass2 outer = new OuterClass2();
OuterClass2.StaticInnerClass.innerMethod();
//調用靜態內部類的靜態方法
OuterClass2.outerMethod();
//創建靜態內部類對象
OuterClass2.StaticInnerClass staticInner = new OuterClass2.StaticInnerClass();
int num = staticInner.innerMethod2(); //調用靜態內部類實例方法
}
}
class OuterClass2 { //外部類
private double x = 0.0; //內部靜態類不可以訪問 外部類實 例變量
static private int n = 10; //外部類 靜態變量
static void outerMethod() { //外部類靜態 方法
System.out.println("from OuterClass...");
}
void outerMethod2() {
System.out.println("from OuterClass’ instance method2 ()...");
}
static class StaticInnerClass { //靜 態內部類
static private int m = 5; //靜態內部類靜 態變量
static void innerMethod() { //靜態內部類靜態 方法
int sum;
n = 20; //只可以訪問外部類靜態變量
sum = n + m;
System.out.println("from InnerClass sum = " + sum);
outerMethod(); //只可以調用外部類靜態 方法
}
int innerMethod2() {
n = 100;
outerMethod();
System.out.println("from InnerMethod2() n = " + n);
return n;
}
} //靜態內部類結束
} //外部類結束
如同不用創建對象就可調用靜態方法一樣,上例靜態內部類中的靜態方法利用:
OuterClass2.StaticInnerClass.innerMethod(); //靜態內部類調用其靜態方法
來調用。注意,可以在靜態內部類的方法中,直接訪問外部類的靜態變量n和調用靜態方法 outerMethod()。但不允許訪問外部類的實例變量x以及實例方法outerMethod2()。
靜態內部類中也可以提供實例方法,如:
static class StaticInnerClass {
int innerMethod2() {
n = 100; //只可訪問外部類靜態變量
outerMethod(); //只可調用外部類 靜態方法
System.out.println("from InnerMethod2() n = " + n);
return n;
}
} //靜態內部類結束
靜態內部類的實例方法中亦只允許訪問外部類的靜態成員。
可以使用下列語法格式創建一個靜態內部類對象並且調用其實例方法,以及靜態方法:
OuterClass2.StaticInnerClass staticInner = new OuterClass2.StaticInner Class(); //創建靜態內部類對象
int num = staticInner.innerMethod2(); //調用實例方法
staticInner.innerMethod(); //調用其靜態方法
出處: http://yqgao.blog.51cto.com/773490/165373