1. 程式人生 > >Java中靜態內部類與外部類關係說明

Java中靜態內部類與外部類關係說明

    先貼程式碼:

public class AccessStaticInnerClass {

private int prop1=1;
private static int prop2=2;

static class StaticInnerClass{
private static int prop3=3;
private int prop4=4;
public void accessOuterPorp(){
//System.out.println(prop1);程式碼錯誤
//靜態內部類無法直接訪問外部類的例項成員(靜態成員不能訪問非靜態成員規則);
//但可以通過外部類物件來訪問;
System.out.println(new AccessStaticInnerClass().prop1);
System.out.println(prop2);
//靜態內部類可以訪問外部類的靜態成員;
}
}

public void accessInnerProp(){
//System.out.println(prop1);程式碼錯誤
//外部類是無法直接訪問靜態內部類的靜態成員;下面才是正確訪問方式:
System.out.println(StaticInnerClass.prop3);
//System.out.println(prop2);程式碼錯誤
//外部類是無法直接訪問靜態內部類的例項成員;下面才是正確訪問方式:
System.out.println(new StaticInnerClass().prop4);
}

public void getIn(){
StaticInnerClass sic=new StaticInnerClass();
sic.accessOuterPorp();
}

public static void main(String[] args){
new AccessStaticInnerClass().getIn();
new AccessStaticInnerClass().accessInnerProp();
}

}

輸出結果:

1

2

3

4

為什麼靜態內部類的例項方法不能訪問外部類的例項屬性呢?

因為靜態內部類是外部類的類相關,而不是外部類的物件相關的。就是說,靜態內部類物件不是寄存在外部類物件中的,而是寄存在外部類的類本身中。當靜態內部類物件存在時,並不存在一個被它寄存的外部類物件,靜態內部類物件裡只有對外部類的類引用,沒有對外部類物件的引用。如果要使靜態內部類的例項方法訪問外部類的例項屬性(例如上例中訪問prop1),則需要使用外部類物件來呼叫訪問。

ps:靜態只能訪問靜態的,因為他們在物件沒存在前就存在了;如果想訪問非靜態的則需要初始化該物件,因為只有初始化後物件在記憶體中才存在(靜態除外)

問答來源於《瘋狂java講義》內容;