子类中的 Java 静态构造函数访问
Posted
技术标签:
【中文标题】子类中的 Java 静态构造函数访问【英文标题】:Java static constructor access in child class 【发布时间】: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);
有什么问题?
谢谢你:-)
【问题讨论】:
【参考方案1】:在超类中声明为protected的变量、方法和构造函数只能由其他包中的子类或受保护成员类的包中的任何类访问。
现在,C
类的构造函数受到保护,因此只能通过 C
的子类在 a
包之外访问。但是B
不是C
的子类...
正如@Amongalen 指出的,第二个声明
C c2 = new C(0);
是合法的,因为它创建了一个扩展C
的匿名类,因此受保护的构造函数在这里可见。
【讨论】:
C c2 = new C(0);
- 这是有效的,因为它创建了一个实现C
的匿名类,对吗?
@Amongalen 对,实际上它扩展了C
以上是关于子类中的 Java 静态构造函数访问的主要内容,如果未能解决你的问题,请参考以下文章
JAVA-初步认识-第九章-继承-子父类中的构造函数-子类的实例化过程-细节