首页 >Java >java教程 >为什么 `this()` 和 `super()` 必须是 Java 构造函数中的第一个语句?

为什么 `this()` 和 `super()` 必须是 Java 构造函数中的第一个语句?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-29 11:31:161013浏览

Why Must `this()` and `super()` Be the First Statement in a Java Constructor?

强制构造函数执行顺序:为什么 this() 和 super() 必须是第一个语句

Java 严格强制如果 this()或 super() 在构造函数中调用,它们必须是第一个语句。此限制确保父类和子类的构造函数初始化顺序以正确的顺序发生。

考虑以下示例:

public class MyClass {
    public MyClass(int x) {}
}

public class MySubClass extends MyClass {
    public MySubClass(int a, int b) {
        super(c); // Compile error
        int c = a + b;
    }
}

MySubClass 构造函数中对 super(c) 的调用将导致编译时错误,因为它不是第一个语句。编译器要求先调用父类的构造函数,在子类构造函数执行之前初始化父类的状态。

解决此错误的一种方法是重新排列代码:

public class MySubClass extends MyClass {
    public MySubClass(int a, int b) {
        super(a + b); // OK
    }
}

这里,c的计算是在super()的参数内进行的,允许先调用父类的构造函数。

另一个例子演示了该限制如何防止错误代码执行:

public class MyClass {
    public MyClass(List list) {}
}

public class MySubClassA extends MyClass {
    public MySubClassA(Object item) {
        List list = new ArrayList();
        list.add(item);
        super(list); // Compile error
    }
}

代码尝试创建一个列表并将其传递给父类的构造函数,这是不允许的。如果限制没有到位,则在初始化之前调用父类上的方法时,代码可能会失败并出现错误。

强制将 this() 和 super() 作为第一个语句可确保构造函数调用顺序正确,保证Java中父类和子类的正确初始化。

以上是为什么 `this()` 和 `super()` 必须是 Java 构造函数中的第一个语句?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn