我知道构造函数不是继承的。
那么在子构造函数中处理异常的原因是什么。在我们创建孩子的对象或什么的时候,在场景后面有些人正在创建父对象吗?
public class Parent {
public Parent() throws Exception{
}
}
class Child extends Parent {
public Child(){ // compile time error "Unhandled Exception Type"
}
}
我不是通过在子构造函数中调用Super()
来尝试初始化父类。我不明白为什么要这样做。
提前致谢。
答案 0 :(得分:4)
如果构造函数体不以显式构造函数调用开始...那么构造函数体隐式地以超类构造函数调用super()开始;
换句话说,以下代码在语义上与您的Child
类相同。定义:
class Child extends Parent {
public Child(){ // compile time error "Unhandled Exception Type"
super(); // This throws Exception.
}
}
这必须发生,因为必须进行初始化Parent
实例所需的初始化。考虑如果没有调用超级构造函数会发生什么:
class Parent {
private final Frobnitz foo;
Parent() throws Exception {
foo = new Frobnitz();
}
void doSomething() {
foo.doYourFrobbing();
}
}
class Child extends Parent { ... }
class Main {
public static void main(String[] args) {
new Child().doSomething(); // Would cause a NPE unless Parent() is called (implicitly or explicitly).
}
}
答案 1 :(得分:3)
如果创建了child类型的对象,则会显式调用超类的构造函数(显式或隐式)。这就是你需要捕捉异常的原因。
答案 2 :(得分:3)
如果您未在子类的构造函数中显式调用super()
,则会隐式调用它,因此您必须捕获异常,或声明您的子类的构造函数抛出异常。