Java內部類成員


內部類可以存取其所有範例成員,範例欄位和其封閉類的範例方法。
參考如下範例 -

class Outer {
  private int value = 2017;
  public class Inner {
    public void printValue() {
      System.out.println("Inner: Value  = " + value);
    }
  } // Inner class ends here

  public void printValue() {
    System.out.println("Outer: Value  = " + value);
  }
  public void setValue(int newValue) {
    this.value = newValue;
  }
}

public class Main {
  public static void main(String[] args) {
    Outer out = new Outer();
    Outer.Inner in = out.new Inner();

    out.printValue();
    in.printValue();

    out.setValue(2018);

    out.printValue();
    in.printValue();
  }
}

上面的程式碼生成以下結果。

Outer: Value  = 2017
Inner: Value  = 2017
Outer: Value  = 2018
Inner: Value  = 2018

範例-1

以下程式碼顯示如何存取內部類的內部變數。

public class Main {
  public static void main(String[] args) {
    Outer out = new Outer();
    Outer.Inner in = out.new Inner();

    out.printValue();
    in.printValue();

    out.setValue(3);

    out.printValue();
    in.printValue();
  }
}
class Outer {
  private int value = 1;
  public class Inner {
    private int value = 2;
    public void printValue() {
      System.out.println("Inner: Value  = " + value);
    }
  } // Inner class ends here
  public void printValue() {
    System.out.println("Outer: Value  = " + value);
  }
  public void setValue(int newValue) {
    this.value = newValue;
  }
}

上面的程式碼生成以下結果。

Outer: Value  = 1
Inner: Value  = 2
Outer: Value  = 3
Inner: Value  = 2

Inner類中的this關鍵字

以下程式碼顯示如何在內部類中使用關鍵字 - this

class Outer {
  private int value = 1;
  class QualifiedThis {
    private int value = 2;

    public void printValue() {
      System.out.println("value=" + value);
      System.out.println("this.value=" + this.value);
      System.out.println("QualifiedThis.this.value=" + QualifiedThis.this.value);
    }

    public void printHiddenValue() {
      int value = 2;
      System.out.println("value=" + value);
      System.out.println("this.value=" + this.value);

      System.out.println("QualifiedThis.this.value=" + QualifiedThis.this.value);
    }
  }
  public void printValue() {
    System.out.println("value=" + value);
    System.out.println("this.value=" + this.value);
  }  
}

public class Main {
  public static void main(String[] args) {
    Outer outer = new Outer();
    Outer.QualifiedThis qt = outer.new QualifiedThis();
    System.out.println("printValue():");
    qt.printValue();

    System.out.println("printHiddenValue():");
    qt.printHiddenValue();
    outer.printValue();
  }
}

上面的程式碼生成以下結果。

printValue():
value=2
this.value=2
QualifiedThis.this.value=2
printHiddenValue():
value=2
this.value=2
QualifiedThis.this.value=2
value=1
this.value=1

隱藏變數

如果範例變數名稱被隱藏,必須使用關鍵字this或類名稱以及關鍵字this限定其名稱。

class TopLevelOuter {
  private int v1 = 100;

  // Here, only v1 is in scope
  public class InnerLevelOne {
    private int v2 = 200;

    // Here, only v1 and v2 are in scope
    public class InnerLevelTwo {
      private int v3 = 300;

      // Here, only v1, v2, and v3 are in scope
      public class InnerLevelThree {
        private int v4 = 400;

        // Here, all v1, v2, v3, and v4 are in scope

      }
    }
  }
}

從外部類

以下程式碼顯示如何從外部類參照變數。

public class Test{
  private int value = 1;
  public class Inner {
    private int value = 2;

    public void printValue() {
      System.out.println("Inner: Value  = " + value);
      System.out.println("Outer: Value  = " + Test.this.value);
    }
  } // Inner class ends here

  public void printValue() {
    System.out.println("\nOuter - printValue()...");
    System.out.println("Outer: Value  = " + value);
  }

  public void setValue(int newValue) {
    System.out.println("\nSetting  Outer's value to " + newValue);
    this.value = newValue;
  }

}