1. super 클래스 로딩
1) 클래스 검사 2) 클래스변수(static변수) 준비 3) static블럭 수행
2. 인스턴스 생성
3. 생성자 호출
ex>
class A {
int i;
public A() {
super(); // 생략하면 컴파일러가 자동으로 붙인다.
}
}
class B extends A{
int j;
public B() {
super();
}
}
class C extends B{
int k;
public C() {
super();
}
}
public class InheritTest {
public static void main(String[] args) {
C p = new C(); // [i][j][k]
p.i = 10;
p.j = 20;
p.k = 30;
}
}
아래의 그림과 같이 클래스 생성이 된다.
위의 과정에서 생성자 호출에 대해서 좀 더 자세히 알아보자.
상속 시 생성자(Constructor) 호출 순서
: 상속 시에 생성자는 자식클래스에서 super()를 이용해서 부모클래스의 생성자를 호출해 주고 실행은 부모클래스부터 순차적으로 실행 된다.아래의 예제로 좀 더 정확하게 살펴보자.
ex>
class A {
int i;
// 안만들면 다음과 같이 기본 생성자가 만들어 진다.
public A() {
super(); // 생략하면 컴파일러가 자동으로 붙인다.
System.out.println("A() 실행:");
i = 100;
}
}
class B extends A{
int j;
public B(int v) {
super();
System.out.println("B() 실행:");
j = v;
}
}
class C extends B{
int k;
public C() {
super(500);
System.out.println("C() 실행:");
k = 300;
}
}
public class InheritTest {
public static void main(String[] args) {
C p = new C(); // [i][j][k]
System.out.println(p.i);
System.out.println(p.j);
System.out.println(p.k);
}
생성자의 호출은 자식클래스에서 부모클래스로 하지만 실행은 부모클래스에서 자식클래스 순으로 한다는 것을 알수 있다.
* default생성자는 생성자를 만들지 않았으면 자동으로 만들어 지지만, 생성자가 한개 라도만들어져 있다면 default생성자는 만들어 지지 않는다.
* super()를 생략하는 경우에는 자동으로 추가 시킨다.
* super()는 생성자의 먼저 부모클래스의 생성자를 호출해야 하기 때문에 제일 첫줄에 위치해야 한다.
* super()로 부모의 생성자를 호출 할 때 인자값을 같이 넘길수 있다.
댓글 없음:
댓글 쓰기