编译器在java中的子类的有争议的构造函数中调用no-arg super()

时间:2013-07-07 03:41:43

标签: java constructor

我们走了:

public class Parent {

    public Parent(String name) {
        this.name = name;
    }

    public String name = null;

}

public class Child extends Parent {

    public Child(String name) {
        super(name); // If I comment this : Implicit super constructor Parent() is undefined. Must explicitly invoke another constructor
    }

}

据说“如果你不自己调用超级构造函数,编译器会为你插入一个no-arg调用super(),作为构造函数中的第一个语句。”

  • 这对于参数化的构造函数也是如此吗?
  • 编译器是否必须使用子构造函数的相同签名调用参数-ed超级构造函数?
  • 为什么这样设计?

2 个答案:

答案 0 :(得分:1)

  

对于参数化的构造函数是否也是如此?

  

编译器是否必须使用子构造函数的相同签名调用参数-ed超级构造函数?

没有。如果要调用不同的基类构造函数,则必须自己调用它,并根据需要传递参数。

  

为什么它的设计是这样的?

因为您提议的替代方案(自动转发所有参数)通常不会非常有用。

答案 1 :(得分:0)

表示声明不准确。子类的构造函数,不以其超类的一个构造函数的调用开始,或者与类本身的另一个构造函数的链式调用一起隐式地插入了超类的无参数构造函数。

调用具有不同签名的超类构造函数是非常可能的并且通常非常有用。考虑这个假设的一个:

public class SquareRootException extends IllegalArgumentException {
    public SquareRootException(double negativeValue) {
        super(String.format("Attempt to take the square root of the negative number %f",
              negativeValue);
        }
    }
    ...
}

程序员为什么要编写不必要的代码?