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

Cod*_*lue 9 java inheritance

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

Pet*_*rey 23

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

版画

Subclassed A in Main$B
Run Code Online (Sandbox Code Playgroud)

它阻止的是无法访问其超类的任何构造函数的子类.这意味着私有构造函数不能在另一个类文件中使用,并且包本地构造函数不能在另一个包中使用.

在这种情况下,您唯一的选择是委派.您需要调用工厂方法来创建"超级"类的实例并将其包装起来.

  • @PeterLawrey好的,我想我的简单解释是Java允许访问其他嵌套类的私有构造函数. (3认同)

Lui*_*oza 19

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

更多信息:JLS 8.8.10.防止实例化


关于Brian Roach的评论:

对[父类构造函数]的调用仅在您没有显式执行并且父类具有公共或受保护的无参数构造函数(或者没有定义任何在这种情况下存在默认的无参数)时才是隐式的.这是必需的,因为...这就是语言的运作方式.Children [classes]必须调用[他们的]父级的构造函数.

请注意,当您在Java中实例化任何类时,总是会对Object构造函数进行隐式调用,因为它是所有类的超类.它将执行其默认构造函数:

public Object() {
}
Run Code Online (Sandbox Code Playgroud)

请注意JLS链接:

如果隐式声明了默认构造函数但是超类没有不带参数且没有throws子句的可访问构造函数(第6.6节),那么这是一个编译时错误.

  • 如果父类声明了一个私有构造函数,那么它就没有任何隐含的内容。它需要在子级中显式调用,但因为构造函数是私有的,所以不能。 (2认同)