java – 从扩展外部类本身的内部类中访问外部类成员

前端之家收集整理的这篇文章主要介绍了java – 从扩展外部类本身的内部类中访问外部类成员前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在下面的代码片段中,内部类继承自己的外部类.
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")

您会看到“初始值”被打印两次.没有办法访问子类中的私人成员.

要点是:不要让子类内部类.

猜你在找的Java相关文章