调用父构造函数

假设你有 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);
    }
}