1흰오리와 2청둥오리가 있다.
각각의 오리는 날 수 있다.
공통적인 특징으로 3오리라는 부모클래스를 만들어 날 수 있다 라는 기능을 넣고 흰오리와 청둥오리를 자식클래스로 만든다.
4고무오리가 추가되었다.
고무오리는 날 수 없다.
이때 공통적인 특징에서 약간 다른 버전이 나오는 것이다.
새로운 매서드로 만들어서 쓸 수 도 있지만
부모로 받은 기능을 재정의 해서 쓸 수도 있다.
부모에게 받은 기능, 매서드를 같은 이름의 매서드로 재정의 하는 것을 오버라이딩이라고 한다
public class inheritance{
public static void main(String[] args){
//1. 흰오리 객체를 새로 만들어서 매서드 실행
WhiteDuck whiteDuck = new WhiteDuck();
whiteDuck.fly();
// 결과 : 날 수 있어요
//2. 청둥오리 객체를 새로 만들어서 메서드 실행
Mallard mallard = new Mallard();
mallard.fly();
// 결과 : 날 수 있어요
//4. 고무오리 객체를 새로 만들어서 메서드 실행
RubberDuck rubberDuck = new RubberDuck();
rubberDuck.fly();
// 결과 : 날 수 없어요..
}
}
// 3. 오리들에게 날다라는 기능을 물려줄 부모클래스 Duck
class Duck {
void fly(){System.out.println("날 수 있어요")}
}
//1. 흰오리 자식클래스에 부모클래스 Duck의 기능을 물려줌
class WhiteDuck extends Duck{
}
//2. 청둥오리 자식클래스에 부모클래스 Duck의 기능을 물려줌
class Mallard extends Duck{
}
//4. 고무오리 자식클래스에 부모클래스 Duck의 기능을 물려줌
class RubberDuck extends Duck{
void fly(){System.out.println("날 수 없어요..")}
// > 오버라이드
// 부모에게 물려받은 기능을 재 정의함
}
public class ConsturcterChain {
public static void main(String[] args) {
WhiteDuck d1 = new WhiteDuck();
d1.fly();
// 실행 순서
// 부모클래스 고유기능 > 자식클래스 기능
// 부모 : Duck이 생성됩니다.
// 자식 : WhiteDuck이 생성됩니다.
// 자식 : 오리가 안 납니다.(오버라이드)
}
}
// 1. Duck 부모 클래스 생성
class Duck{
public Duck(){
System.out.println("Duck이 생성됩니다.");
}
public void fly(){
System.out.println("오리가 납니다.");
}
}
// 2. WhiteDuck 자식 클래스 생성 후 부모 클래스 연결
class WhiteDuck extends Duck {
public WhiteDuck(){
System.out.println("WhiteDuck이 생성됩니다.");
}
public void fly(){
System.out.println("오리가 안 납니다.");
}
// 부모 클래스 기능의 오버라이드
}

- 객체는 자기 자신이 가지고 있는 것을 우선적으로 사용한다.
- 상속은 부모에게서 자식은 능력을 확장시키디만 동일한 이름은 자기자신을 우선적으료 사용한다.