有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我在同一个包中有以下课程:

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关键字


共 (2) 个答案

  1. # 1 楼答案

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

    更好地解释:除了类型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 Constructor!

    Zoo Wow!

    请记住,编译器随后生成的字节码如下所示:

    Zoo() {
        super()
        System.out.println("SubClass Constructor!");
    }
    
  2. # 2 楼答案

    由于在子类构造函数中指定了带有参数的super关键字,因此它将转到基类中的参数化构造函数

    否则将执行默认构造函数