JAVA

상속시 호출순서에 따른 실행결과 변화

jojelly 2020. 8. 30. 19:39
반응형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package PM;
//+하위 객체가 만들어 질때 먼저 상위 객체의 필드와 메소드가 메모리에 올라가고 생성자 호출후
//하위 객체의 필드와 메소드가 따라 올라가고 생성자가 호출된다.
 
class Dypar{
    int a = initA();                    //애는 일반이라 공간먼저 받고 이후에 값을 가져온다. 
    
    static int sa = initSA();            //static은 공간과 값을 처음에 다 가져온다.
    
    Dypar(int a , String c) {
        System.out.println("부모생성자 "+a+","+c);
    }
    
    int initA() {
        System.out.println("부모 initA()");
        return 10;
    }
    
    static int initSA() {
        System.out.println("static 부모 initSA()");
        return 100;
    }
}
 
 
class DyChild extends Dypar{
    
    int b = initB();
    
    static int sb = initSB();
    
    int d = 400;
    
    public DyChild(int a , String c, int b) {        //아래 super 3개는 정적으로 부모 생성자에 자식 생성자가 값을 정해 넣어준것
                                            //근데 자식도 그 값을 외부에서 받아와서 부모생성자에 넣어주고자 하면 
//                                            DyChild()안에 int a , String c를 넣어 받아오게 일치시켜주고 
//                                            (super a, c )로 해준다)
//        super(123, "아기상어");
//        super(b, "아기상어");            //불가능 
//        super(sb, "아기상어");        //가능 sb가 static 이기때문에 부모의 생성자에 들어갈 수 있다ㅣ .
        super(a,c);
        this.b = b;
        System.out.println("자식생성자");
    }
    
    int initA() { ///오버라이딩
        System.out.println("자식 initA() 오버라이딩:"+d);
        return d;
    }
    
    int initB() {
        System.out.println("자식 initB()");
        
        return 20;
        
    }
    
    static int initSB() {
        System.out.println("static 자식 initSB");
        return 200;
    }
}
 
public class DyLifeCycleMain {
 
    public static void main(String[] args) {
        DyChild cc = new DyChild(999,"엄마상어",888);
        System.out.println(cc.a);
        
        cc.initA();
    }
 
}
 
cs

결과 

 

static 부모 initSA()
static 자식 initSB
자식 initA() 오버라이딩:0
부모생성자 999,엄마상어
자식 initB()
자식생성자
0
자식 initA() 오버라이딩:400

 

==============================

 

cc.a 의 호출결과는 d에 값이 들어가기전 호출이며, cc. initA()는 d에 값이 들어간 후의 호출되어 다른값이 나왔다.

cc.a는 0이지 null이 아니다 .(차이점 인지하기)

반응형