调用父构造函数
假设你有 Parent 类和 Child 类。要构造 Child 实例,总是需要在 Child 构造函数的 gebinning 上运行一些 Parent 构造函数。我们可以通过使用适当的参数显式调用 super(...)
作为我们的第一个 Child 构造函数语句来选择我们想要的 Parent 构造函数。这样做可以通过重用 Parent 类的构造函数而不是在 Child 类的构造函数中重写相同的代码来节省我们的时间。
没有 super(...)
方法:
(隐含地,no-args 版本 super()
被称为隐形)
class Parent {
private String name;
private int age;
public Parent() {} // necessary because we call super() without arguments
public Parent(String tName, int tAge) {
name = tName;
age = tAge;
}
}
// This does not even compile, because name and age are private,
// making them invisible even to the child class.
class Child extends Parent {
public Child() {
// compiler implicitly calls super() here
name = "John";
age = 42;
}
}
用 super()
方法:
class Parent {
private String name;
private int age;
public Parent(String tName, int tAge) {
name = tName;
age = tAge;
}
}
class Child extends Parent {
public Child() {
super("John", 42); // explicit super-call
}
}
注意: 调用另一个构造函数(链接)或超级构造函数必须是构造函数中的第一个语句。
如果显式调用 super(...)
构造函数,则必须存在匹配的父构造函数(这很简单,不是吗?)。
如果你没有显式地调用任何 super(...)
构造函数,那么你的父类必须有一个 no-args 构造函数 - 如果父类没有提供任何构造函数,那么这可以是显式编写的,也可以由编译器作为缺省值创建。
class Parent{
public Parent(String tName, int tAge) {}
}
class Child extends Parent{
public Child(){}
}
Parent 类没有默认构造函数,因此,编译器无法在 Child 构造函数中添加 super
。此代码将无法编译。你必须更改构造函数以适合双方,或者编写你自己的 super
调用,如下所示:
class Child extends Parent{
public Child(){
super("",0);
}
}