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 중국어 웹사이트의 기타 관련 기사를 참조하세요!