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

我有两个课

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);的调用又怎么了?

谢谢:-)

iCMS 回答:子类中的Java静态构造函数访问

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

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

正如@Amongalen指出的那样,第二条语句

C c2 = new C(0){};

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

本文链接:https://www.f2er.com/1992668.html

大家都在问