当前位置: 首页 > 面试题库 >

从内部类内部访问外部类成员,从而扩展外部类本身

华昕
2023-03-14
问题内容

在下面显示的代码片段中,内部类本身继承了外部类。

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()(最后一个片段)将值分配给类Initial value的私有字段valueTestInnerClass然后调用该callShowValue()方法。

callShowValue()方法会导致另一个字符串- Another value要设置的私人领域value中的TestInnerClass类调用之前showValue()的方法InnerClass延长TestInnerClass

因此,方法中的以下两个语句showValue()

System.out.println(getValue());
System.out.println(value);

应该显示

另一个价值
另一个价值

但是他们显示

初始值
初始值

为什么会这样?


问题答案:

方法getValue()和领域value都是private。因此,其他子类(包括子类)均无法访问它们。它们不是继承的。

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);
}

既然你已经设置value

new TestInnerClass("Initial value")

您会看到"Initial value"两次打印。 无法访问private子类中的那些成员。

关键是:不要使子类成为内部类。



 类似资料:
  • 问题内容: 如何从内部类访问外部类? 我正在重写一种使它在不同线程上运行的方法。从内联线程中,我需要调用原始方法,但是当然只要调用就会变成无限递归。 具体来说,我在扩展BufferedReader: 这个地方给了我我找不到的NullPointerException。 谢谢。 问题答案: 像这样: 上面的测试在执行时显示:

  • 这是我正在研究的一个更大问题的一个简短的子问题。 为什么我不能通过第8行outer class中的inner class的实例访问outer类字段? 字段在内部类中可见。 外部类中的非静态方法仍然存在此问题。 字段的可见性并不重要。无论从哪种方式,它都可以从内部类中看到。 可以通过内部类中的(私有)getter访问该字段,但我出现问题的原因之一是,我希望避免这些。 它应该成为不可变的构建器模式的一

  • 问题内容: 是否可以从Java内部类中获取对它的引用? 即 问题答案: 您可以像这样访问外部类的实例:

  • 但是,如果我在内部类中声明了一个同名的variabe呢?有什么方法可以显式引用外部变量吗? 顺便说一句,这和这个问题不同,因为它考虑的是局部堆栈变量。

  • 我认为内部类的成员,即使被声明为私有的,也可以从它的封闭类中访问。但是我遇到了以下代码结构的编译时错误。我的顶级类实现了Iterable接口。Iterator在内部类中实现。当内部类的一个实例通过iterator()方法获得时,我无法使用该实例访问数据栏。 有什么建议吗?

  • 问题内容: 因此,我们大多数人都知道 如何 从内部类访问外部类。用这些词进行搜索会给出关于该主题的大量回答问题。但是我想知道的是为什么语法是这样。 例: 为什么呢?看起来是A类的静态字段,但是… 感到困惑 如果这是重复的话,请原谅我。就像我说的那样,用这些词进行搜索会给出操作答案。 问题答案: 为什么这样做呢?真的,只是因为它的方式。它行之有效,从某种意义上讲,并且不需要花哨的语法来完成这项工作。