【问题标题】:Why a subclass of a nested class cannot access the nesting class's private field here?为什么嵌套类的子类在这里不能访问嵌套类的私有字段?
【发布时间】:2012-11-25 01:26:33
【问题描述】:

Java 代码如下:

public class A {
        private static int a;

        public static class B {
                static void funcc() {
                        a = 3;
                }
        }
}


public class C extends A.B {
        public void func() {
                a = 1;
        }
}

当我尝试编译时,出现错误:

C.java:3: error: cannot find symbol
                a = 1;
                ^
  symbol:   variable a
  location: class C
1 error

为什么会这样?

【问题讨论】:

  • 您已经有了很多答案,但是您可以通过编译代码然后运行命令javap Ajavap A$Bjavap C 来了解更多信息。还可以通过将B 设为非静态并重试来进行试验。

标签: java nested-class private-members


【解决方案1】:

Bstatic。这使得它等同于在顶层声明它。它不是一个嵌套类,并且无法访问其词法包含类中的任何私有内容。

【讨论】:

  • 我改了代码,那为什么class B中的funcc()可以直接访问a,而class A可以编译成功?
  • 成为static 与此无关。即使B 不是静态的,C 类也无法访问 A.a
  • @UniMouS 因为它允许在 A 的变量处“达到峰值”;这是赋予内部阶级的权力。但是,在这种情况下,这只是A.a 的语法糖; java编译器很聪明,可以实现它,所以它可以让你做到。
【解决方案2】:

嵌套类B 可以访问它所包含的所有字段和方法,因为它是A 的成员。 B 的子类(不是 A 的成员)没有该访问权限。

【讨论】:

  • 我想我现在可以用你的方法理解这个问题。但是想一想:子类代表is-a关系,所以class C是-aclass B,而class Bclass A的成员,所以class cclass A的成员,什么我的推理错了吗?
  • @UniMouS - 您将词法作用域与类层次结构混为一谈。这些是不同的东西。类 C 不是类 A 的成员,因为它没有在 A 中定义。包范围也有类似的问题。考虑带有类a.Ab.B 的包ab。现在假设b.B extends a.A;这不会使b.B 成为包a 的成员。 b.B 类将无权访问 a.A 的包私有成员(或包 a 中的任何其他包私有项)。
【解决方案3】:

内部类不扩展其包含类;他们本身就是一个班级。

在您的示例中,B 是一个没有方法和字段的类。它没有变量a

但是,您可以在 B 类中访问变量 a,但这仅仅是因为 a 在其闭包中;它可以在A 的变量处达到峰值,这是内部类的力量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 2017-02-10
    • 2016-09-08
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多