Như đã đề cập trước khi giải quyết quá tải được thực hiện tại thời điểm biên dịch.
Java Puzzlers có một ví dụ hay cho điều đó:
Câu đố 46: Trường hợp của nhà xây dựng khó hiểu
Câu đố này giới thiệu cho bạn hai hàm tạo khó hiểu. Phương thức main gọi một phương thức khởi tạo, nhưng phương thức nào? Đầu ra của chương trình phụ thuộc vào câu trả lời. Chương trình in cái gì, hoặc nó có hợp pháp không?
public class Confusing {
private Confusing(Object o) {
System.out.println("Object");
}
private Confusing(double[] dArray) {
System.out.println("double array");
}
public static void main(String[] args) {
new Confusing(null);
}
}
Giải pháp 46: Trường hợp của trình tạo khó hiểu
... Quá trình giải quyết quá tải của Java hoạt động theo hai giai đoạn. Giai đoạn đầu tiên chọn tất cả các phương thức hoặc hàm tạo có thể truy cập và áp dụng được. Giai đoạn thứ hai chọn phương pháp hoặc hàm tạo cụ thể nhất được chọn trong giai đoạn đầu. Một phương thức hoặc phương thức khởi tạo ít cụ thể hơn phương thức khác nếu nó có thể chấp nhận bất kỳ tham số nào được truyền cho phương thức khác [JLS 15.12.2.5].
Trong chương trình của chúng tôi, cả hai hàm tạo đều có thể truy cập và áp dụng được. Phương thức khởi tạo
Gây nhầm lẫn (Đối tượng) chấp nhận bất kỳ tham số nào được truyền cho Gây nhầm lẫn (double []) , vì vậy
Gây nhầm lẫn (Đối tượng) ít cụ thể hơn. (Mọi mảng kép là một Đối tượng , nhưng không phải mọi Đối tượng đều là một mảng kép .) Do đó, hàm tạo cụ thể nhất là Khó hiểu (double []) , giải thích kết quả đầu ra của chương trình.
Hành vi này có ý nghĩa nếu bạn truyền một giá trị kiểu double [] ; nó là phản trực giác nếu bạn vượt qua null . Chìa khóa để hiểu câu đố này là việc kiểm tra phương thức hoặc hàm tạo nào cụ thể nhất không sử dụng các tham số thực tế : các tham số xuất hiện trong lời gọi. Chúng chỉ được sử dụng để xác định mức quá tải nào được áp dụng. Khi trình biên dịch xác định được cách nạp chồng nào có thể áp dụng và có thể truy cập được, nó sẽ chọn cách nạp chồng cụ thể nhất, chỉ sử dụng các tham số chính thức: các tham số xuất hiện trong khai báo.
Để gọi phương thức khởi tạo Gây nhầm lẫn (Đối tượng) với một tham số null , hãy viết mới Gây nhầm lẫn ((Đối tượng) null) . Điều này đảm bảo rằng chỉ có thể áp dụng được (Đối tượng) gây nhầm lẫn . Nói một cách tổng quát hơn, để buộc trình biên dịch chọn một quá trình nạp chồng cụ thể, hãy ép các tham số thực tế thành các kiểu đã khai báo của các tham số chính thức.