子类中的 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-初步认识-第九章-继承-子父类中的构造函数-子类的实例化过程-细节

Java Day 09

毕向东Java视频学习笔记Day09 继承+接口+抽象类

java中成员变量代码块构造函数运行顺序

请教一下C#中父类静态构造函数在子类中为啥不会和子类的静态构造函数一起执行

super在构造函数中的运用