본문 바로가기
언어/JAVA

상속 & 생성자

by 새벽물망초 2022. 10. 14.
class X{
	int i;
    X(){
    	i = 10;
        }
    void print(){
    	print(i + ",");
        }
}

class Y extends X{
	int i = 15;
    int j = 10;
    Y(){
    	j = 20;
        }
    void print(){
    	print(j+",");
        }
    void superprint(){
    	super.print();
        }
}

class Z extends Y{
	int k;
    Z(){
    	super();
        k = 30;
        }
    void print(){
    	print(k+",");
        }
    void test(){
    	print();
        super.superprint();
        print(super.j+",");
        println(i);
        }
}

Z z = new Z();
z.test();

z()를 실행하기전, z는 상속관계이므로 명시적으로 부모를 부르는지 확인해야 함,

super()가 있으므로 아버지인 y의 디폴트생성자로 이동

 

y클래스의 디폴트생성자로 왔는데 여기서도 명시적으로 아버지의 부모를 부르는지 확인해야 함

명시적인 사항이 없으므로 묵시적으로 부모의 디폴트 생성자 출력해야 함

아버지의 부모인 할아버지 x로 이동, x에서 i = 10

다시 y클래스의 y()로 돌아와서 j=20인걸 확인, 그럼 y클래스의 j=20으로 바꿔줘야함

정리하자면 객체 z 이렇게 들어가 있음

클래스 변수
x i 10
y i 15
y j 10 20
z k 30

 

그다음 z.test() 실행해야 함

     print(); 

print함수로 이동해서 30, 출력


        super.superprint();

아버지  y에서 superprint함수 실행, super.print() 이므로 할아버지 x에서 print()실행하면 10, 출력


        print(super.j+",");

아버지 y에서 j실행하면 20,


        println(i);

i로 출력하라 했는데, 나랑 가까운 i를 출력하면 됨, 아버지 y가 가장 나(z)랑 가까움 따라서 15출력

 

답은 30,10,20,15

 

댓글