SubClass Java的SuperClass构造函数行为

时间:2015-09-20 11:26:22

标签: java

我正在阅读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

2 个答案:

答案 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构造函数的默认调用(除非您创建的构造函数仍然是无参数构造函数。