内部类可以访问其所有实例成员,实例字段和其封闭类的实例方法。
参考如下实例 -
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; } }