생성자 호출 순서

C가 B를 상속하고 B가 A를 상속하고 있다

public class A {
     public A(){
           System.out.println("A 생성자 호출");
     }
}

public class B extends A{
      public B() {
            System.out.println("B 생성자 호출");
      }
}

public class C extends B{
     public C(){
           System.out.println("C 생성자 호출");
     }
}

결과

A 생성자 호출
B 생성자 호출
C 생성자 호출

this, this(), super, super()

  • this : 현재 클래스를 가르킴. this.멤버변수 사용 시 현재 클래스의 멤버변수를 사용
  • super : 부모 클래스를 가르킴. super.멤버변수 사용 시 부모클래스의 멤버변수를 사용 만약 B클래스가 a 멤버변수가 없다면 C클래스가 super.a 하면 A의 멤버변수 a가 호출됨
public class A {
     protected int a = 1;
     public A(){
           System.out.println("A 생성자 호출");
     }
}
public class B extends A{
     int a = 2;
      public B() {
            System.out.println("B class super.a:"+super.a+"  this.a:"+this.a+" a:"+a);
      }
}

public class C extends B{
     int a = 3;
     public C(){
            System.out.println("C class super.a:"+super.a+"  this.a:"+this.a+" a:"+a);
     }
}

출력결과

A 생성자 호출
B class super.a:1 this.a:2 a:2
C class super.a:2 this.a:3 a:3
  • this() : 자신의 생성자를 불러온다
  • super() : 자신의 부모클래스의 생성자를 불러온다
    • 둘 다 { 다음에 바로 써야한다. 그렇지 않으면 ‘Constructor call must be the first statement in a constructor’ 에러가 난다
    • { 다음에 바로 써야 하기 때문에 this(), super() 동시에 사용하진 못한다
public class A {
     protected int a;
     public A(){
           this(2);
           System.out.println("A() 생성자 호출");
           //this(2);      // error must be first!
           //A(1);               // error
           //this.A(1);    // error
     }
     
     public A(int a){
           System.out.println("A(int a) 생성자 호출");
           this.a = a;
     }
}

출력결과

A(int a) 생성자 호출
A() 생성자 호출
  • 자식 클래스에서 super 호출
    public class B extends A{
       protected int a;
        public B() {
              System.out.println("B()");
        }
        public B(int a){
             super(1);
             System.out.println("B(int a)");
             this.a = a;
        }
    }
    

출력결과

A(int a) 생성자 호출
B(int a)