在Java中使用super()[重复]

问题描述 投票:-1回答:2

我正在使用super()关键字来调用父类的构造函数。

class Animal {
    Animal() {
        System.out.println("Animal is created.");
    }
}

class Dog extends Animal {
    Dog() {
        super();
        System.out.println("Dog is created.");
    }
}

public class Test {
    public static void main(String[] args) {
        Dog d1 = new Dog();
    }
}

输出与我预测的相同。

Animal is created.
Dog is created.

但是当我从Dog类的构造函数中删除super()关键字时,输出将保持不变。

class Animal {
    Animal() {
        System.out.println("Animal is created.");
    }
}

class Dog extends Animal {
    Dog() {
        System.out.println("Dog is created.");
    }
}

public class Test {
    public static void main(String[] args) {
        Dog d1 = new Dog();
    }
}

输出是

Animal is created.
Dog is created.

动物类的构造函数如何在不使用super()关键字的情况下被调用

java inheritance super
2个回答
3
投票

动物类的构造函数如何在不使用super()关键字的情况下被调用

由于构造函数不是以this(...)super(...)开头,所以等效于显式指定super

基本上每个构造函数需要链接到同一类或超类中的另一个构造函数-一个例外是Object本身中的构造函数。

如果不指定任何内容,则默认为super()

JLS 8.8.7中有记录:

[如果构造函数主体不是以显式构造函数调用开始的,并且要声明的构造函数不是原始类Object的一部分,则构造函数主体将以超类构造函数调用“ super();”(隐式构造函数的调用)隐式开始不带参数的直接超类的实例。

(反过来,这意味着如果您的超类only具有参数化的构造函数,则every子类构造函数需要包括显式的构造方法调用。]


0
投票
class Animal {
Animal() {
    System.out.println("Animal is created.");
}

Animal(int legs) {
   System.out.println("Animal is created with legs:" + legs);
}

现在您可以调用super(4);来调用第二个构造函数,否则第一个构造函数将自动运行。

如果构造函数未显式调用超类构造函数,则Java编译器会自动将调用插入到超类的无参数构造函数中。如果超类没有无参数构造函数,则将出现编译时错误。对象确实具有这样的构造函数,因此如果对象是唯一的超类,就没有问题。

参考:https://docs.oracle.com/javase/tutorial/java/IandI/super.html

© www.soinside.com 2019 - 2024. All rights reserved.