- 부모 타입이 사용될 위치에 자식 타입을 사용하는 것
- 부모 타입 대신 대입된 자식 타입이 재정의(override)한 메서드를 사용함으로써, 어떤 자식 타입이 대입되느냐에 따라서 그 실행 결과가 다양해질 수 있음
public class Foo {
void doSomething() { /*어떤 동작*/ }
}
public class Bar extends Foo {
@Override
void doSomething() { /*다른 동작*/}
}
public class Baz extends Foo {
@Override
void doSomething() { /*또 다른 동작*/}
}
public class Main {
public static void main(String[] args) {
Foo obj1 = new Bar(); // obj1은 Foo 타입으로 선언되었으나, Bar 타입이 대입됨
obj1.doSomething();
Foo obj2 = new Baz(); // obj2는 Foo 타입으로 선언되었으나, Baz 타입이 대입됨
obj2.doSomething();
}
}