在调用它的基类构造函数之前,编译器是否在子类构造函数中查找** super **关键字?

时间:2014-12-03 07:33:32

标签: java constructor

我在同一个包中有以下类:

class Moo
{
    Moo()
    {
        System.out.println("No-Arguments Base Constructor!");
    }

    Moo(int a)
    {
        System.out.println("Parameterized Base Constructor!");
    }

    public String coolMethod()
    {
        return "Wow!";
    }
}

class Zoo extends Moo
{
    Zoo()
    {
        super(10);
        System.out.println("SubClass Constructor!");
    }

    public String coolMethod()
    {
        return "Zoo Wow!";
    }

    public static void main(String[] args)
    {
        Zoo m = new Zoo();
        System.out.println(m.coolMethod());
    }
}

输出如下所示:

Parameterized Base Constructor!
SubClass Constructor!
Zoo Wow!

我所知道的是,“每当我们运行程序时,编译器将在执行子构造函数之前执行基类默认构造函数”。 但在这种情况下,首先调用参数化构造函数(而不是默认构造函数)。

所以我的问题是,编译器在执行基类构造函数之前是否在子类构造函数中查找 super 关键字?

5 个答案:

答案 0 :(得分:2)

  

编译器在执行基类构造函数之前是否在子类构造函数中查找超级关键字?

是。

如果您没有提及任何 super 相关构造函数,则默认将调用。否则提到的构造函数会调用。

答案 1 :(得分:0)

在你的情况下(如下所示),你明确地用参数调用super,因此调用了超级构造函数。

Zoo()
{
    super(10);
    System.out.println("SubClass Constructor!");
}

如果省略super(10);,默认情况下会调用super();,即没有任何参数的父类的构造函数,尽管您不会在代码中看到该调用。

答案 2 :(得分:0)

当你放置super()它将调用父类的构造函数w / out参数时,当你不在构造函数中声明任何super()时,它也被称为父类的构造函数w / out参数

所以基本上当你调用super(10);时,其中10是一个int值,所以它会用一个接受int的参数调用你的Moo构造函数。

答案 3 :(得分:0)

由于您在子类构造函数中使用参数指定了一个super关键字,因此它将转到基类中的参数化构造函数。

否则将执行默认构造函数。

答案 4 :(得分:0)

这是错误的:“[...]编译器将在执行子构造函数之前执行基类默认构造函数”

更好地解释:除了类型java.lang.Object之外,每个构造函数必须在其第一个语句处调用另一个构造函数。这可能是同一个类中的构造函数 - 使用this(...) - 或超类中的构造函数 - 使用super(...)

如果你兴奋地指定另一个构造函数,那么将完全执行该构造函数。如果你没有指定它,编译器将自动调用super()(没有arg)。

在你的例子中

Zoo() {
    super(10);
    System.out.println("SubClass Constructor!");
}

你用一个参数明确地调用了超类构造函数。因此,不会调用no-arg构造函数。

如果 - 另一方面 - 你写过

Zoo() {
    System.out.println("SubClass Constructor!");
}

那么输出就是

  

No-Arguments Base Constructor!

     

SubClass构造函数!

     

动物园哇!

请记住,编译器然后生成了类似于

的字节代码
Zoo() {
    super()
    System.out.println("SubClass Constructor!");
}