在下面的代码片段中,内部类继承自己的外部类.
package test; class TestInnerClass { private String value; public TestInnerClass(String value) { this.value = value; } private String getValue() { return value; } public void callShowValue() { new InnerClass("Another value").showValue(); } private final class InnerClass extends TestInnerClass { public InnerClass(String value) { super(value); } public void showValue() { System.out.println(getValue()); System.out.println(value); } } }
public final class Test { public static void main(String[] args) { new TestInnerClass("Initial value").callShowValue(); } }
main()方法(最后一个片段)中的唯一语句将值初始值分配给TestInnerClass类的专用字段值,然后调用callShowValue()方法.
callShowValue()方法导致另一个字符串 – 在调用扩展TestInnerClass的InnerClass的showValue()方法之前,将另一个值设置为TestInnerClass类的私有字段值.
因此,showValue()方法中的以下两个语句,
System.out.println(getValue()); System.out.println(value);
应该显示,
Another value
Another value
但他们显示,
Initial value
Initial value
为什么会这样呢?
解决方法
方法getValue()和字段值都是私有的.因此,它们不可用于任何其他类,包括子类,即.它们不是继承的.
在InnerClass#showValue()
public void showValue() { System.out.println(getValue()); System.out.println(value); }
因为这些是私有的,所以getValue()和value指的是外部类的成员,可以访问它们,因为你在同一个类中,即.内部类可以访问外部类的私有成员.以上调用相当于
public void showValue() { System.out.println(TestInnerClass.this.getValue()); System.out.println(TestInnerClass.this.value); }
既然你已经设定了价值
new TestInnerClass("Initial value")
您会看到“初始值”被打印两次.没有办法访问子类中的私人成员.
要点是:不要让子类内部类.