子类中的Java静态构造函数访问

use*_*767 2 java inheritance static constructor protected

我有两节课

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
  }
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢 :-)

小智 7

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

现在,C类的构造函数是受保护的,因此a只能由C. 但B不是C...的子类

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

C c2 = new C(0){};
Run Code Online (Sandbox Code Playgroud)

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

  • `C c2 = new C(0){};` - 这是有效的,因为它创建了一个实现 `C` 的匿名类,对吗? (4认同)