为什么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
什么它阻止是不能访问其超类的任何构造子类。这意味着一个私有构造函数不能在另一个类文件中使用,并且一个包本地构造函数不能在另一个包中使用。
在这种情况下,您唯一的选择就是委派。您需要调用工厂方法来创建“超级”类的实例并包装它。
因为一个类必须调用它的超类构造函数总是。如果超类构造函数不能被访问,那么子类就不能被初始化。
更多信息:JLS 8.8.10. Preventing Instantiation of a Class
关于布莱恩·罗奇的评论:
调用[父类的构造函数]只是,如果你不这样做明确的暗示和家长有一个公共或受保护的无参数构造函数(或者没有定义任何情况下有一个默认的无参数)。这是必需的,因为......这就是语言的工作原理。儿童[班级]必须致电父母的建设者。
注意,当你在Java中实例化任何类,总有到Object
构造一个隐式调用,因为它是超类的所有类的。从JLS链接
public Object() {
}
注:这将执行其default constructor
这是一个编译时错误,如果默认的构造函数是隐式声明但超类没有可访问的构造 (第6.6节),不带任何参数,也没有引发子句。
如果一个类的构造函数是私有的,那么子类不能调用超级构造函数。 因此继承会失败。
是的,在Luiggi的答案中增加了一些东西,这个特性在创建Singleton类时使用了,这个类只允许创建一个类的实例。
如果您正确创建单身人士,则不需要。 –
@布赖恩可以请你告诉我如何正确地做到这一点,而不使构造函数是私人的? –
Josh Bloch,'Effective Java second edition' - 使用'enum'。请参阅:http://stackoverflow.com/questions/5759596/the-best-singleton-pattern-since-java-5。如果你没有那本书,就买它。这是一个必须阅读的人认真对待java –
如果你有一个子类,你有2个子类(子类)构造函数的可能性: 1.默认构造函数(无参数构造函数):在这种情况下,默认构造函数会自动尝试调用父类构造函数:因为父类的构造函数是私有的。 2。参数化构造函数:当您尝试为具有参数化构造函数的子类创建对象时,需要通过传递参数或不传递参数,从子类构造函数强制调用父类构造函数:由于父构造函数是私有的,因此也会失败。
由于子类将具有默认构造函数或参数化构造函数,并且它们不能具有其中的任何一个,所以不能为具有私有构造函数的父类使用子类。
- 1. 使用私有构造函数继承一个类
- 2. 私有构造函数和继承(Java)
- 3. 为什么从继承类调用基类构造函数
- 4. 为什么从具有私有构造函数的类继承是不允许的
- 5. 从C++中的私有模板类继承构造函数
- 6. 为什么不继承java类构造函数呢?
- 7. 为什么我不能从私有类/接口继承?
- 8. 为什么有一个私有构造
- 9. 从超类继承构造函数?
- 10. 从基类继承构造函数?
- 11. 为什么一类从结构继承
- 12. 为什么从Base继承的SQLAlchemy类不需要构造函数?
- 13. Object.create而不是构造函数继承
- 14. 具有不一致构造函数的多级别类继承
- 15. 为什么我们需要一个私有构造函数?
- 16. 从类继承的类没有默认的构造函数
- 17. DRY JavaScript的继承顺序是从在一个构造函数
- 18. 为什么一个结构允许接口继承,为什么一个类不能继承
- 19. 为什么具有继承构造函数的类还会获得合成的默认构造函数?
- 20. Scala案例类私有构造函数不是私有的
- 21. 类的继承和构造函数
- 22. 继承类中的构造函数C++
- 23. 继承虚基类的构造函数
- 24. C++继承类的构造函数
- 25. 为什么我不能在一个C++类中声明一个空的构造函数,该类使用一个私有构造函数来扩展
- 26. 为什么不是一个私人的无参数构造函数?
- 27. 使用私有继承时继承基础构造函数的方法?
- 28. 为什么我不能继承虚拟基础的构造函数?
- 29. UML - 类继承,你继承了什么?
- 30. 什么是“可继承的替代构造函数”?
@HovercraftFullOfEels,请参阅Peter Lawrey的答案。 – CodeBlue