在下面的代码片段中,内部类继承自己的外部类.
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()方法.@H_404_7@
callShowValue()方法导致另一个字符串 – 在调用扩展TestInnerClass的InnerClass的showValue()方法之前,将另一个值设置为TestInnerClass类的私有字段值.@H_404_7@
因此,showValue()方法中的以下两个语句,@H_404_7@
System.out.println(getValue()); System.out.println(value);
Another value
Another value@H_404_7@
Initial value
Initial value@H_404_7@
为什么会这样呢?@H_404_7@
解决方法
方法getValue()和字段值都是私有的.因此,它们不可用于任何其他类,包括子类,即.它们不是继承的.
在InnerClass#showValue()@H_404_7@
public void showValue() { System.out.println(getValue()); System.out.println(value); }
因为这些是私有的,所以getValue()和value指的是外部类的成员,可以访问它们,因为你在同一个类中,即.内部类可以访问外部类的私有成员.以上调用相当于@H_404_7@
public void showValue() { System.out.println(TestInnerClass.this.getValue()); System.out.println(TestInnerClass.this.value); }
既然你已经设定了价值@H_404_7@
new TestInnerClass("Initial value")
您会看到“初始值”被打印两次.没有办法访问子类中的私人成员.@H_404_7@
要点是:不要让子类内部类.@H_404_7@