Chúng ta đã nói trong phần trớc rằng một đối tợng PreciseTime là một đối tợng
Time. Thực ra điều này không hoàn toàn đúng song có thể nói là sự thực cũng gần nh vậy: một đôí tợng PreciseTime có thể đợc sử dụng ở hầu nh là tât cả mọi nơi mà một đối tợng Time có thể đợc sử dụng. Chẳng hạn, mô tả và lời gán sau là hoản toàn hợp lệ:
Time dawn;
Dawn = new PreciseTime(3, 23, 34);
Một biến Time có thể chứa một tham chiếu tới một đối tợng PreciseTime. Nói tổng quát, một biến C có thể chứa một tham chiếu tới bất kỳ một đôí tợng của bất kỳ một lớp nào trong kiến trúc lớp của C.
Bây giờ hãy xem xét lời gọi phơng thức:
dawn.printTime();
Có hai định nghĩa của phơng thức printTime, một cho các đối tợng Time và một cho các đối tợng PreciseTime. Định nghĩa của dawn lại dờng nh là dành cho cả hai: nó đợc mô tả là kiểu Time, song trên thực tế lại chứa tham chiếu tới một đối tợng kiểu
PreciseTime. Nh vậy trong trờng hợp này phiên bản nào của phơng thức printTime
sẽ đợc kích hoạt ? Câu trả lời là: phơng thức đợc định nghĩa trong PreciseTime. Đó là phơng thức gắn với đối tợng thực sự đợc chứa trong biến dawn.
Chúng ta đã biết rằng, mỗi khi một thông điệp đợc gửi trong một chơng trình Java, nó có khả năng xác định phơng thức nào sẽ đợc kích hoạt mà không cần chạy ch- ơng trình. Kể cả khi một phơng thức bị nạp chồng, nguyên lý này vẫn đợc bảo tồn. Chuyện này nghe có vẻ rất phức tạp và đòi hỏi những hiểu biết sâu sắc về trình biên dịch Java.