如果构造函数不在Java中继承,为什么我会得到编译错误(默认构造函数不能看到隐式超级构造函数A()。必须定义一个显式构造函数)?
class A {
private A() {
}
}
public class B extends A {
}
UPD。我知道在隐式B构造函数中调用super()
。但我不明白为什么它无法使用super()
访问私有构造函数。那么,如果我们只有私有构造函数,那么事实上的类是final
?
答案 0 :(得分:10)
如果Translations
,则B extends A
必须有权访问B
构造函数。
请记住,构造函数始终调用A
。
所以在这里,super()
的隐式无参数构造函数无法调用B
构造函数。
答案 1 :(得分:3)
在Java中,如果您创建Child Class
的实例,则会隐式创建Parent Class
实例。
所以Child Class构造函数应该对Child Class
可见,因为它在第一个语句本身中使用Parent Class
调用super()
构造函数的构造函数。
因此,如果您将Parent Class
的构造函数更改为private
,Child Class
无法访问它并且无法创建自己的任何实例,那么第一手编译器就是根本不允许这样做。
但是,如果您想private
中的Parent Class
默认构造函数,那么您需要在public
&中明确创建一个重载的Parent Class
构造函数。然后在Child class
构造函数中,您需要使用super(param)
Parent Class
的公共重载构造函数来调用。
此外,您可能会认为private
构造函数的用途是什么。 private
构造函数主要用于您不希望任何外部类中的其他人在您的类上调用new()
时。因此,在这种情况下,我们提供了一些getter()
方法来提供类object
。在该方法中,您可以创建/使用您的类的现有对象&从那个方法中返回。
EG。 Calendar cal = Calendar.getInstance();
。这实际上构成了Singleton
设计模式的基础。
答案 2 :(得分:1)
重要的是要理解任何构造函数的第一行是调用超级构造函数。如果您没有自己调用超级构造函数,编译器会通过在封面下插入super()来缩短代码。
现在,如果你将这个构造函数设置为超类私有,那么上面提到的概念就会失败。
答案 3 :(得分:1)
你的B类有一个默认的构造函数B() - 因为你没有明确定义任何其他构造函数。 该构造函数隐式调用其超级构造函数A()。 但是你明确地将那个私有化为A类,所以你已经明确声明没有其他类,包括B,可以访问它。
答案 4 :(得分:0)
可以工作
class A {
private A() {
}
public A(int i){
}
}
public class B extends A {
private A(){
super(10);
}
}
或删除私有A(),默认为public A(), 除非你有另一个构造函数
class A {
}
public class B extends A {
private A(){
super();
}
}
答案 5 :(得分:0)
类B
的实例创建了类A
的实例,因此如果B
实现非默认约束,super(...)
必须调用A
。因此构造函数应为protected
B
能够调用super(...)
答案 6 :(得分:0)
public class B extends A {
/*
* The default constructor B means
* public () B {super();}
*/
public B() {
}
}
因此,您应该定义一个可由类B
B
访问并调用该构造函数。