0

在下面的代码中,我了解子类中的 super(t) 明确调用其超类(B 类)中的无参数构造函数。我似乎难以理解的是为什么子类必须调用超类中的无参数构造函数?我似乎无法弄清楚这样做的目的?

public class Test {

    public static void main(String[] args) {

       B b = new B(5);

    }
}
class A extends B {
    public A(int t)  {
        super(t);
        System.out.println("A's constructor is invoked");
    }
}

class B  {



    public B(int k)   {
    System.out.println("B's constructor is invoked");
    }
}
4

3 回答 3

3

Super 必须在 sub 之前实例化parent must exists before child

我了解子类中的 super(t) 在其 >superclass (B 类)中显式调用无参数构造函数

super(t)实际上super(5)会调用public B(int k).
super()尝试调用public B()不存在的。

注意:如果类中没有可用的构造函数,编译器会提供无参数构造函数。

于 2013-01-10T05:22:13.863 回答
1

您的类B没有无参数构造函数(即没有参数的构造函数)。如果它有一个,它会被 的构造函数自动调用A。但是在示例中,您必须手动调用它super(t)以指定应使用的参数。

于 2013-01-10T05:27:38.270 回答
1

子类中的 super(t) 显式调用其超类(B 类)中的无参数构造函数。

不,super(t)可以改写为B(t)。它正在调用您在代码中显示的构造函数。

我相信你在想的是

如果构造函数没有显式调用超类构造函数,Java 编译器会自动插入对超类的无参数构造函数的调用。

来自http://docs.oracle.com/javase/tutorial/java/IandI/super.html

即如果代码没有做super(t)默认的无参数构造函数将被调用,但是

如果超类没有无参数构造函数,你会得到一个编译时错误

于 2013-01-10T05:22:08.943 回答