Java 为什么不能从构造函数为私有的类继承?

Java 为什么不能从构造函数为私有的类继承?,java,inheritance,Java,Inheritance,为什么Java不允许继承构造函数为私有的类 因为类必须始终调用其超类构造函数。如果无法访问超类构造函数,则无法初始化子类 更多信息: 关于Brian Roach的评论: 只有当您没有显式地调用父类构造函数,并且父类有一个公共或受保护的无参数构造函数(或者没有定义任何构造函数,在这种情况下有一个默认的无参数)时,调用[父类构造函数]才是隐式的。这是必需的,因为。。。这就是语言的工作原理。子类必须调用父类的构造函数 请注意,当您在Java中实例化任何类时,总会隐式调用对象构造函数,因为它是所有类的

为什么Java不允许继承构造函数为私有的类

因为类必须始终调用其超类构造函数。如果无法访问超类构造函数,则无法初始化子类

更多信息:


关于Brian Roach的评论:

只有当您没有显式地调用父类构造函数,并且父类有一个公共或受保护的无参数构造函数(或者没有定义任何构造函数,在这种情况下有一个默认的无参数)时,调用[父类构造函数]才是隐式的。这是必需的,因为。。。这就是语言的工作原理。子类必须调用父类的构造函数

请注意,当您在Java中实例化任何类时,总会隐式调用
对象
构造函数,因为它是所有类的超类。它将执行以下任务:

JLS链接中的注释:

如果默认构造函数隐式声明为,但超类没有可访问的构造函数(§6.6),且该构造函数不带参数且没有throws子句,则这是编译时错误


若类的构造函数是私有的,那个么子类就不能调用超级构造函数。
因此继承将失败。

是的,在Luiggi的回答中添加一些东西。在创建只允许创建该类的一个实例的单例类时,使用java的此功能。

java不会阻止使用私有构造函数对类进行子分类

public class Main {
    static class A {
        private A() {
            System.out.println("Subclassed A in "+getClass().getName());
        }
    }

    static class B extends A {
        public B() {

        }
    }

    public static void main(String... ignored) {
        new B();
    }
}
印刷品

Subclassed A in Main$B
它所阻止的是不能访问其超类的任何构造函数的子类。这意味着私有构造函数不能在另一个类文件中使用,包本地构造函数不能在另一个包中使用


在这种情况下,您唯一的选择是授权。您需要调用工厂方法来创建“super”类的实例并包装它

如果您有一个子类,那么子类(子类)构造函数有两种可能性: 1.默认构造函数(无参数构造函数):在这种情况下,默认构造函数将自动尝试调用父类构造函数:这将失败,因为父类构造函数是私有的。 2.参数化构造函数:当您尝试为具有参数化构造函数的子类创建对象时,您需要通过传递参数或不传递参数强制从子类构造函数调用父类构造函数:这也将失败,因为父类构造函数是私有的


由于子类将有默认构造函数或参数化构造函数,并且不可能有它们中的任何一个,因此不能有具有私有构造函数的父类的子类。

这是因为,当我们进行继承时,编译器的工作是通过在每个类构造函数的第一个语句处编写super()来建立所有类与对象类的直接或间接关系。 当我们将构造函数设置为私有时,这意味着不应从类外部访问它,但当我们设置继承时,编译器将隐式地编写这种类型的语句

class SubClassName extends SuperClassName {
  public SubClassName() {
    super();  // which will indirectly going to call the Parent class constructor from outside its scope
  }
}

为什么这是一个必要条件,即使它是隐式的?如果父类声明了一个私有构造函数,那么它就没有任何隐式。它需要在子构造函数中显式调用,但因为构造函数是私有的,所以不能。除非您自己指定一个构造函数,否则每个构造函数中都有对super()的隐式调用。我指的是对super()的调用是隐式的。为什么一开始就要叫super?这仅仅是他们设计它的方式,还是有很好的理由?只有当您没有显式地执行调用,并且父级有一个public或protected no arg构造函数(或者没有定义任何构造函数,在这种情况下,有一个默认的public no arg)时,调用才是隐式的。这是必需的,因为。。。这就是语言的工作原理。孩子们必须调用父母的构造函数。@Brian你能告诉我如何在不将构造函数设为私有的情况下正确调用吗?Josh Bloch,“有效Java第二版”-使用
枚举
。请参阅:。如果你没有那本书,就买吧。这是任何认真对待这一问题的人必读的书java@HovercraftFullOfEels,见彼得·劳里的答案。有什么不对?实例化一个嵌套的静态类?它是如何工作的?@jaxox对于jvm来说,嵌套类没有什么特别之处。它们与其他任何类一样,具有更多的元信息。因此,您可以创建一个类,该类以与任何其他类相同的方式进行嵌套定义。顺便说一句,静态方法中的匿名类也是静态嵌套类。@PeterLawrey我有点明白你的意思,但我还是有点困惑。您不是说过Java不允许子类无法访问各自的超类构造函数吗。在您的示例中,类B无权访问A的构造函数。那么这是怎么允许的呢?@PeterLawrey好吧,我想对我来说最简单的解释是Java允许访问其他嵌套类的私有构造函数。@PeterLawrey好吧,是的,如果你去掉安全锁销。。。有趣的是,在不破坏环境完整性的情况下,你可以做什么。
class SubClassName extends SuperClassName {
  public SubClassName() {
    super();  // which will indirectly going to call the Parent class constructor from outside its scope
  }
}