empl의 타입이 Employee인데도 Manager.getSalary 메서드가 호출된다. 메서드를 호출할 때 가상 머신은 객체의 실제 클래스를 살펴보고, 해당 클래스에 맞는 메서드 버전을 찾아서 실행한다. 이 과정을 동적 메서드 조회(dynamic method lookup)라고 한다.
그렇다면 Manager 객체를 왜 Employee 변수에 할당할까? 이렇게 하면 직원이 관리자든 문지기든, 또 다른 Employee 서브클래스의 인스턴스든 상관없이 모든 직원 객체로 작동하는 코드를 작성할 수 있다.
Employee[ ] staff = new Employee[...];
staff[0] = new Employee(...);
staff[1] = new Manager(...); // 슈퍼클래스 변수에 할당해도 된다.
staff[2] = new Janitor(...);
...
double sum = 0;
for (Employee empl : staff)
sum += empl.getSalary();