부모와 자식의 필드명이 같거나 메서드가 오버라이딩 되어 있으면, 자식에서 부모의 필드나 메서드를 호출할 수 없다.
이 때 super 키워드를 사용하면 부모를 참조할 수 있다.
super는 이름 그대로 부모 클래스에 대한 참조를 나타낸다.
코드로 봐보자
public class Parent{
public String value = "parent.value";
public void hello() {
System.out.println("상위 타입 메소드");
}
}
public class Child extends Parent{
public String value = "child.value";
public void hello() {
System.out.println(“하위 타입 메소드");
}
public void call() {
System.out.println(“하위타입value: " + this.value);
System.out.println(“상위타입value: " + super.value);
hello();
super.hello(); // 상위 타입 메소드 호출
}
}
필드 이름과 메서드 이름이 같지만 super를 사용해서 부모 클래스에 있는 기능을 사용할 수 있다.
super 생성자
상속 관계의 인스턴스를 생성하면 결국 메모리 내부에는 자식과 부모 클래스가 각각 다 만들어진다. 하위타입을 만들면 상위타입까지 함께 만들어지는 것이다.
하위타입내에서 this로 자신을 호출하더라도 언젠가는 반드시 super를 호출해야한다.