0

我们来了:

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
    }

}

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

  • 这对于带参数的构造函数也是如此吗?
  • 编译器是否不能使用与子构造函数相同的签名调用参数化的超级构造函数?
  • 为什么它被设计成这样?
4

2 回答 2

1

这对于带参数的构造函数也是如此吗?

是的。

编译器是否不能使用与子构造函数相同的签名调用参数化的超级构造函数?

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

为什么它被设计成这样?

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

于 2013-07-07T03:43:35.133 回答
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);
        }
    }
    ...
}

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

于 2013-07-07T03:54:46.680 回答