상속없이는 다형성도 존재할 수 없다!
상속 대상 : 부모의 필드와 메소드
(생성자, 정적멤버 등 X.
부모 클래스의 private 필드, 메소드는 제외.
부모 클래스가 다른 패키지에 있을 경우, default 필드, 메소드 제외.)
정적멤버는 클래스에 소속되어있으므로 => 이미 공유된다는 개념. 상속의 개념이 아니다.
상속되는것은 인스턴스 멤버(객체 없이는 존재할 수 X => 부모객체 먼저 생성되어야 자식 객체에 물려줄 수 있다)
public Student(String name, String ssn, int StudentNo) {
super(name, ssn); //부모객체의 생성자 호출 (>> 부모필드의 초기화 수행)
this.studentNo = studentNo; //자식객체의 필드 초기화 수행
부모 타입(상위 객체. LValue)에는 모든 자식 객체(하위 객체. RValue)가 대입될 수 있다. (다형성 1 규칙)
(cat == animal //true)
->> 자식객체가 부모객체로 완전히 흡수되는것이 아니다. 레퍼런스 주소는 그대로임.
->> 부모가 자식을 품으면 자식이 보이지 않는다.
(부모타입에 선언되어있는 필드, 메소드밖에 쓸 수 없음)
부모클래스의 상속 메소드를 수정해 자식 클래스에서 재정의 하는 것.
다형성 1 규칙의 예외 상황.
@Override
public void fly() throws RuntimeException{ // 상속받은 메소드 재정의(다형성 2)
log.debug("fly() invoked.");
if(flyMode == SUPERSONIC) {
log.info("초음속 비행합니다.");
} else {
//Airplane 객체의 fly() 메소드 호출
super.fly(); // 부모객체의 메소드 호출(다형성 2를 우회)
} //if-else
} //fly
같은 타입이지만 실행결과가 다양한 개체 대입(이용)가능한 성질.
부모 타입에는 모든 자식 객체가 대입 가능 ( 자식은 부모 타입으로 자동 타입 변환)
->> OOP의 핵심인 객체조립이 가능해진다