【问题标题】:Java static constructor access in child class子类中的 Java 静态构造函数访问
【发布时间】:2020-10-26 08:58:54
【问题描述】:

我有两节课

package a;

public class A {

  protected void doSomething() {

  }

  protected static class C {
    protected C(int c) {
    }
  }
}

package b;

public class B extends A {

  @Override
  protected void doSomething() {
    C c = new C(0); //compile error
    C c2 = new C(0){}; //legal
  }
}

我已阅读第 6.6.2.2 章。访问受保护的 JLS 构造函数 (https://docs.oracle.com/javase/specs/jls/se11/html/jls-6.html) 但我仍然对解释感到困惑。即使B是A的孩子,调用超级构造函数new C(0);有什么问题?

谢谢你:-)

【问题讨论】:

    标签: java inheritance constructor static protected


    【解决方案1】:

    在超类中声明为protected的变量、方法和构造函数只能由其他包中的子类或受保护成员类的包中的任何类访问。

    现在,C 类的构造函数受到保护,因此只能通过 C 的子类在 a 包之外访问。但是B 不是C 的子类...

    正如@Amongalen 指出的,第二个声明

    C c2 = new C(0){};
    

    是合法的,因为它创建了一个扩展C 的匿名类,因此受保护的构造函数在这里可见。

    【讨论】:

    • C c2 = new C(0){}; - 这是有效的,因为它创建了一个实现C 的匿名类,对吗?
    • @Amongalen 对,实际上它扩展了C
    猜你喜欢
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    相关资源
    最近更新 更多