为什么子类必须在超类中调用no args构造函数?

时间:2013-01-10 05:19:55

标签: java

在下面的代码中,我理解子类中的super(t)是在其超类(类B)中显式调用no-args构造函数。我似乎遇到了解问题的原因是为什么子类必须在超类中调用no-args构造函数?我似乎无法解决这个问题的目的吗?

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");
    }
}

3 个答案:

答案 0 :(得分:3)

Super必须在像parent must exists before child之类的子实例之前实例化。

  

我理解子类中的super(t)在其>超类(B类)中显式调用no-args构造函数

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

注意:如果类中没有可用的构造函数,编译器提供no-arg构造函数。

答案 1 :(得分:1)

  子类中的

super(t)在其超类(类B)中显式调用no-args构造函数。

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

我相信你在想的是

  

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

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

即如果代码没有super(t),则会调用默认的no-args构造函数,但是

  

如果超类没有无参数构造函数,则会出现编译时错误

答案 2 :(得分:1)

你的班级B没有no-args构造函数(那个没有参数的构造函数)。如果它有一个,它将由A的构造函数自动调用。但是在示例中,您必须使用super(t)手动调用它,以指定应该使用的参数。