Cách JVM chọn phương pháp nào để thực thi?Lựa chọn phương pháp có quá tải và ghi đè
Có đúng là quy trình chọn được chia thành 2 phần. Đầu tiên trong khi biên dịch JVM, hãy tìm một phương thức ứng cử viên để thực thi. Nó chọn chữ ký cần thiết vào lớp đối tượng được khai báo (không phải là lớp đối tượng hiệu quả). Khi nó đã chọn chữ ký ứng cử viên, nó bắt đầu tìm kiếm nó trong hệ thống phân cấp bắt đầu từ lớp hiệu quả của đối tượng.
Điều này có đúng không?
Thêm một câu hỏi:
Đây là một hệ thống phân cấp các lớp học và phương pháp liên quan:
- Class A: +f(short x): int; +f(String x): int;
- Class B extends A: +f(int x): int; +f(String x): int;
- Class C extends A: +f(double x): int; +f(byte x): int;
- Class D extends C: +f(byte x): int; +f(short x): int;
- Class E extends C: +f(char x): int; +f(int x): int;
Vì vậy:
- A là lớp cha cho B và C
- B là lớp con của A
- C là phân lớp của A
- C là lớp cha cho D và E
- D và E là C lớp con
Tất cả những lớp học chỉ có một phương pháp gọi là "f" với chữ ký nêu trên.
bây giờ tôi tuyên bố đối tượng sau:
A a = new D();
B b = new B();
C c = new E();
1. Tại sao phương pháp gọi a.f (3) không thể được xử lý và trả về một lỗi?
Nếu những gì tôi đã đề cập trước là chính xác đây là những gì nên xảy ra:
Các JVM nhìn vào Class A cho một phương pháp với f chữ ký (int x) hoặc bất kỳ chữ ký tương thích (với đúc). Nó tìm phương thức f (short x) cần tương thích, đúng không? Sau đó, nó sẽ cho chữ ký này rất chính xác vào lớp D, và nó tìm thấy nó thực hiện các D: f (ngắn x). Theo cuốn sách của tôi, điều này không đúng, tại sao? Nó có thể là vì ngắn không thực sự là một khuyến mãi cho int và do đó JVM không xem xét f (ngắn x) phù hợp cho cuộc gọi? Và do đó sẽ không tìm thấy bất kỳ phương pháp f nào tương thích và sẽ trả về lỗi.
Tôi đã kiểm tra trên Google và trên bất kỳ tài nguyên nào khác mà tôi có thể tìm thấy (cũng trên Stackoverflow) nhưng tất cả đều rất rõ ràng và không đủ câu trả lời chi tiết, do đó tôi nghĩ có thể là một điều tốt để hỏi, tôi hy vọng nó sẽ biến câu trả lời sẽ hữu ích cho các sinh viên tương lai chiến đấu với quá tải và overridding :) Cảm ơn trước.
Toàn bộ quá trình được mô tả trong các kỹ thuật Java Ngôn ngữ: http://docs.oracle.com/javase/specs/ jls/se7/html/jls-15.html # jls-15.12.2 –
Cảm ơn đề xuất. Đây chắc chắn là tài liệu tôi đang tìm kiếm. – jnardiello