我正在阅读java文档并阅读有关构造函数的内容我对以下段落感到困惑。
你不必为你的班级提供任何建设者,但是你 这样做时一定要小心。编译器自动提供 无参数,没有构造函数的任何类的默认构造函数。 这个默认构造函数将调用的无参数构造函数 超类。在这种情况下,编译器会抱怨如果 超类没有无参数构造函数,所以你必须验证 它确实如此。如果你的类没有明确的超类,那么它有一个 Object的隐式超类,它有一个无参数 构造
the compiler will complain if the superclass doesn't have a no-argument constructor
参考:Java Docs https://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html
答案 0 :(得分:1)
让我们设想一个基类,如
public class Base {
public Base(String s) {
}
}
现在让我们创建一个子类:
public class Sub extends Base {
}
那将无法编译,因为上面的代码相当于
public class Sub extends Base {
// added by compiler because there is no explicitely defined constructor in Sub
public Sub() {
}
}
相当于
public class Sub extends Base {
// added by compiler because there is no explicitely defined constructor in Sub
public Sub() {
// added by compiler if there is no explicit call to super()
super();
}
}
行super()
尝试调用Base的no-arg构造函数,但是没有这样的构造函数。
因此,使用Sub编译的唯一方法是明确定义构造函数,例如
public class Sub extends Base {
public Sub() {
super("some string");
}
}
答案 1 :(得分:1)
默认情况下,每个类都有一个无参构造函数。如果使用带参数的构造函数创建类A,则当类B扩展A时,您需要显式创建一个构造函数,该构造函数将使用参数调用超类构造函数。基本上,当您创建构造函数时,您将失去对no-arg构造函数的默认调用(除非您创建的构造函数仍然是无参数构造函数。