>Java >java지도 시간 >왜 `this()`와 `super()`가 Java 생성자의 첫 번째 명령문이어야 합니까?

왜 `this()`와 `super()`가 Java 생성자의 첫 번째 명령문이어야 합니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-19 14:17:09880검색

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

생성자에서 this() 및 super()를 다른 모든 문보다 먼저 호출해야 하는 이유는 무엇입니까?

Java에서는 this() 및 super()라는 엄격한 규칙을 적용합니다. 호출은 생성자 내의 첫 번째 명령문이어야 합니다. 이 제한은 하위 클래스 생성자를 실행하기 전에 상위 클래스의 적절한 초기화를 보장하기 위해 존재합니다.

예를 들어 다음 코드는 super(c)가 MySubClass의 첫 번째 문이 아니기 때문에 컴파일 시간 오류를 발생시킵니다. constructor:

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

그러나 코드를 수정하면 이 문제를 피할 수 있습니다. to:

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

순서가 중요한 이유

하위 클래스 생성자 내의 super() 호출은 상위 클래스의 인스턴스 변수를 초기화하고 상위 생성자를 호출합니다. 이렇게 하면 하위 클래스의 생성자가 진행되기 전에 상위 클래스가 완전히 초기화됩니다.

super()가 첫 번째 문이 될 필요가 없다면 이전에 초기화되는 상위 클래스에 의존하는 작업을 수행하는 것이 가능할 것입니다. 실제로 초기화되었으므로 정의되지 않은 동작이 발생할 가능성이 있습니다.

예외 및 해결 방법

컴파일러에서는 this() 및 super()를 먼저 호출해야 하지만 생성자 내에서 논리 실행을 제한하지는 않습니다. 논리는 단일 표현식에 배치되거나 super() 또는 this() 호출에 전달될 수 있습니다.

예:

public class MySubClass extends MyClass {
    public MySubClass(int a, int b) {
        super(Arrays.asList(new Object[] { a, b }));  // OK
    }
}

결론

this() 및 super()가 생성자 내의 첫 번째 문이어야 한다는 제한은 적절한 객체 초기화를 보장하고 부모 클래스에 대한 조기 액세스로 인해 발생할 수 있는 오류를 방지하는 데 도움이 됩니다. 멤버가 제대로 초기화되기 전에. 이는 클래스에 대해 예측 가능한 생성자 실행 순서를 적용하여 개체 무결성과 일관성을 보장합니다.

위 내용은 왜 `this()`와 `super()`가 Java 생성자의 첫 번째 명령문이어야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.