【问题标题】:Subclassing a class with a private default constructor in Java在Java中使用私有默认构造函数子类化一个类
【发布时间】:2019-10-29 21:18:36
【问题描述】:

假设我有一个带有私有构造函数的类 A,以及扩展它的类 B

public class A {
    private A() {}
}

public class B extends A {
    public B(){
        // error - there is no default constructor available in 'A'
    }
}

我知道可以通过 Java 反射调用私有构造函数,但是我该如何B 构造函数中调用?谢谢。

【问题讨论】:

  • 如果B 扩展A(在您的示例中没有)并且A 的构造函数是私有的,这很简单:你不能 .看看spec
  • java(编译器)会承认这一点吗?如果 B 扩展了 A,编译器要求 B 在 B 的构造函数的第一行调用 A 的构造函数
  • @LeoLeontev 使用这个逻辑private 也不是private
  • 另一个好问题是你为什么要这样做.....
  • 换一种说法:如果A的作者知道他们在做什么,他们将其设为私有的原因正是为了阻止你这样做.

标签: java reflection


【解决方案1】:

如果B 类扩展A 并且A 的构造函数是私有的,则子类化是不可能的,除非这两个类都在同一个文件中定义为内部类(参见Preventing Instantiation of a Class)。这是因为子类的构造函数进行了(显式或隐式)super() 调用。 super() 调用基本上只是对匹配构造函数的调用,如果该构造函数声明为 private,则无法从某个外部类(例如在不同文件中定义的类)进行此调用。

【讨论】:

    猜你喜欢
    • 2018-06-13
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多