[질문사항]
package myClass;
class Parent2{
int a;
Parent2(){ //기본생성자 안쓰면 자동생성
a = 10;
}
Parent2(int n){
a = n;
}
}
class Child2 extends Parent2{
int b;
Child2() {
b=20;
super(40); //이 부분입니다.
}
public void display() {
System.out.println(a);
System.out.println(b);
}
}
public class Inheritance02 {
public static void main(String[] args) {
Child2 ch = new Child2();
ch.display();
}
}
궁금한점이 class Child2 extends Parent2 이부분에서 왜 super(40)이 b=20; 밑에 적으면 오류가 날까요?
[답변]
super(40);가 b = 20; 아래에 위치할 경우 오류가 발생하는 이유는 자바의 생성자 호출 규칙 때문입니다.
자바에서 하위 클래스의 생성자가 상위 클래스의 생성자를 호출하는 경우 (super()를 사용하는 경우), 이 호출은 하위 클래스 생성자의 첫 번째 명령문이어야 합니다.
자바에서 클래스의 인스턴스가 생성될 때, 상위 클래스의 생성자가 먼저 호출되어야 객체의 상위 부분이 먼저 초기화됩니다. 그 후에 하위 클래스의 나머지 부분이 초기화됩니다. 이러한 순서를 보장하기 위해, 자바는 상위 클래스 생성자 호출 (super())을 하위 클래스 생성자의 첫 번째 명령문으로 요구합니다.
Child2 클래스의 생성자에서 super(40);가 b = 20; 이후에 오면, 상위 클래스 Parent2의 생성자 호출이 이미 필드 초기화 이후에 이루어지게 되어 규칙을 위반하게 됩니다. 이로 인해 컴파일러는 오류를 발생시키게 됩니다.
올바르게 구현하려면, super(40);를 b = 20;보다 먼저 호출해야 합니다. 이렇게 하면 상위 클래스 Parent2의 인스턴스가 먼저 올바르게 초기화되고, 그 다음에 Child2의 필드 b가 초기화됩니다.
'무근본 IT 지식 공유 > 무근본 자바(JAVA)' 카테고리의 다른 글
[무근본자바] java 소스의 흐름을 분석하는 툴 만들기 (0) | 2024.03.02 |
---|---|
[무근본자바] Elk 스택에(엘라스틱서치) 쌓인 로그활용해서 내용 분석하기- 자바 코드 (0) | 2024.03.02 |
‘Call by Value’와 ‘Call by Reference’에 대하여 -왕초보도 이해하는 자바 (0) | 2023.09.16 |
프로그래밍에서 추상화가 대체 뭐야?-왕초보도 이해하는 자바 (0) | 2023.09.16 |
오버로딩, 오버라이딩 차이가 대체 뭔데?-왕초보도 이해하는 자바 (0) | 2023.09.16 |
댓글