內部類可以存取其所有範例成員,範例欄位和其封閉類的範例方法。
參考如下範例 -
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
以下程式碼顯示如何存取內部類的內部變數。
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
以下程式碼顯示如何在內部類中使用關鍵字 - 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;
}
}