2009年12月19日 星期六

JAVA筆記-靜態內部類別的存取權限

一般類別+內部類別+static的存取關係真是複雜
難怪當初看JAVA我會不由自主的想先跳過
沒事不要寫這麼複雜關係的程式碼,
如果要用到一本書要放在旁邊就是了

靜態外部類別的內部類別同樣是被放在Global記憶體區塊,
所以內部類別不管有沒有宣告static,都可互相看見而存取
(其實一般使用靜態類別時,本身內部就沒有設定static,
成員變數本來就互相看見,多設定一道static,
它還是放在Global記憶體內,當然還是會可以看見)

靜態類別本身是沒有this指標,也不需要new建立實體
但靜態內部類別的non-static成員會有this指標指向自己,
(這一段話我感到有點含糊,靜態內部類別裡的non-static成員為什麼會有this指標?)
所以靜態內部類別可以同時定義static和non-static成員,
因此,也可用new來建立靜態內部類別的實體

class MyOuter {
  private int x = 7;
  static private int sx = 9;

  static class MyStatic {
    private int x = 77;
    static private int sx = 99;
    public void fooA() { // non-static member
      System.out.println("static inner class A.");
      System.out.println(sx); //
      System.out.println(MyOuter.sx); //
      System.out.println(x); //
      System.out.println(this.x); //
      //static inner class中沒有MyOuter的this指標
      //System.out.println(MyOuter.this.x);
    }

    public static void fooB() { // static member
      System.out.println("static inner class B.");
      System.out.println(sx);
      System.out.println(MyOuter.sx);
    }
  }
}

public class StaticInnerClass {
  public static void main(String[] args) {
    //MyOuter.MyStatic.fooB();
    MyOuter.MyStatic s = new MyOuter.MyStatic();
    s.fooA();
    s.fooB();
  }

執行結果:
99
9
77
77

99
9

0 意見 :

張貼留言