2013-04-10 42 views
7
public class OverloadingTest extends Format{ 

    public int add(String s1){ 
     System.out.println("With String"); 
     return 1; 
    } 
    public int add(Object a){ 
     System.out.println("With Object"); 
     return 1; 
    } 


    public static void main(String[] args) { 
     OverloadingTest overloadingTest = new OverloadingTest(); 
     overloadingTest.add(null); 
    } 

} 

Tại sao là sản phẩm của chương trình With String ?Tại sao đây là đầu ra của chương trình?

Tôi đã cố gắng đọc JLS cho phiên bản thứ 6, nhưng tôi vẫn không thể tìm thấy câu trả lời.

Lý do duy nhất tôi có thể đoán là đối sánh gần nhất trong phân cấp Inheritance được chọn.

Vì vậy, trong trường hợp này, nó sẽ nhận String là Object là siêu lớp của nó.

+5

Bạn đã trả lời câu hỏi của riêng bạn :) –

+0

Lớp phụ Subber luôn chọn .... – Thihara

+1

@Deepak Bala Oh tuyệt vời. Nhưng bạn có bất kỳ tài liệu tham khảo hoặc tài liệu nào có thể chỉ ra điều này không? – Sam

Trả lời

3

Câu trả lời này có sẵn trong câu hỏi Method Overloading for NULL parameter:

Java sẽ luôn luôn cố gắng sử dụng các phiên bản được áp dụng cụ thể nhất của một phương pháp đó là có sẵn (xem JLS §15.12.2).

Do đó, String được sử dụng vì đó là loại cụ thể nhất hiện có. Nếu có nhiều hơn một loại phụ, thì bạn sẽ phải bỏ null vào loại thích hợp để chỉ định chức năng nào bạn muốn chạy.

1

này được nêu ra trong §15.12.2.5. Choosing the Most Specific Method:

Nếu có nhiều hơn một phương pháp thành viên vừa tiếp cận và áp dụng đối với một invocation phương pháp, nó là cần thiết để lựa chọn một để cung cấp các mô tả cho thời gian chạy phương pháp công văn . Ngôn ngữ lập trình Java sử dụng quy tắc mà phương pháp cụ thể nhất được chọn.

Trực giác không chính thức là một phương pháp cụ thể hơn phương pháp khác nếu bất kỳ lời gọi nào được xử lý bằng phương pháp đầu tiên có thể được truyền sang phương thức khác mà không có lỗi loại biên dịch.

Trong ví dụ của bạn, add(Object) có thể xử lý mọi thứ mà add(String) có thể. Điều này làm cho số sau cụ thể hơn. Do đó, nó được chọn để xử lý null.

0

Nếu có thể truy cập nhiều hơn một phương pháp thành viên và áp dụng cho lời gọi phương thức ... Ngôn ngữ lập trình Java sử dụng quy tắc là phương pháp cụ thể nhất được chọn.

Xem T he Java Language Specification

Các vấn đề liên quan