2013-07-16 21 views
21

Chỉ vì tò mò tôi đã thử ví dụ này.JAVA Object/String overload overload

public class Class1 { 

    public void method(Object obj){ 
     System.out.println("Object"); 
    } 

    public void method(String str){ 
     System.out.println("String"); 
    } 

    public static void main(String... arg){ 
     new Class1().method(null); 
    } 

} 

Đầu ra là "Chuỗi". Tôi muốn biết trên cơ sở những gì JVM quyết định gọi phương thức lấy String làm đối số chứ không phải Object.

+0

Đây không phải là lỗi biên dịch phải không? Một cái gì đó về các thông số mơ hồ? – Thilo

+0

Rõ ràng là không. Tôi ước điều đó. – Thilo

+0

Không có gì mơ hồ về điều này, @Thilo. Nó sẽ là mơ hồ nếu phương thức đầu tiên chấp nhận 'Integer' và' String' thứ hai, vì sau đó cả hai đều không "cụ thể" hơn cái kia. – Joni

Trả lời

14

Bất cứ khi nào nhiều hơn một phương pháp quá tải có thể được áp dụng cho danh sách đối số, phương pháp cụ thể nhất được sử dụng.

Trong trường hợp này, một trong hai phương pháp có thể được gọi khi vượt qua null, vì "loại trống" có thể được gán cho cả ObjectString. Phương pháp mất String cụ thể hơn để nó được chọn.

+0

làm cách nào tôi có thể gọi phương thức cụ thể nhất? –

+0

Sử dụng loại phôi. Ví dụ, 'phương thức ((đối tượng) null) ' – Joni

+0

tôi sử dụng nó ngay bây giờ. nhưng cho phép nói rằng tôi đang sử dụng phương pháp này như là một phương pháp tiếp xúc của một thư viện. vì vậy tôi không muốn người dùng làm tất cả các loại đúc này và tất cả. người dùng sẽ chỉ chuyển giá trị và tôi phải chuyển hướng điều khiển theo chương trình sang phương thức thích hợp. Còn cách nào khác không ? @joni –

10

Bất cứ khi nào có phương pháp quá tải, JVM sẽ tìm kiếm các phương pháp từ loại cụ thể nhất để loại hình cụ thể nhất

+2

Tôi khuyên bạn nên chỉnh sửa trích dẫn của mình từ 'gần nhất nhất' thành' loại cụ thể nhất' sẽ phù hợp hơn về ngôn ngữ lập trình. – exexzian

+0

Đã sửa. Cảm ơn vì điều đó. Tôi có nghĩa là như nhau, tuy nhiên từ ngữ của bạn có ý nghĩa hơn. – Reddy

+3

Đó là trình biên dịch quyết định phương thức nào sẽ được gọi, không phải là JVM. – Joni

0

Becaue bạn đang đi qua rỗng trong phương pháp gọi điện thoại và bạn đã định nghĩa khoảng trống method (String str) Và String luôn bắt đầu bằng null. nó sẽ tìm thấy phương thức kết hợp parametrized. Thats y u có "str" ​​trên console.

2

Java Compiler chọn phương pháp cụ thể nhất.

Chuỗi là một loại cụ thể hơn so với Object.

0

Khi bạn đang thực hiện quá tải phương thức, jvm sẽ cố gắng tiếp theo trong phân cấp. Ví dụ: nếu bạn quá tải phương thức với dài và int, nhưng gọi phương thức bằng cách đi qua byte, nó đầu tiên sẽ đi đến int như nó là tiếp theo trong hệ thống phân cấp để byte.

0

Đó là do phương pháp Quá tải

Phương pháp cụ thể nhất được chọn lúc biên dịch.

Vì 'java.lang.String' là một loại cụ thể hơn 'java.lang.Object'. Trong trường hợp của bạn, nó trả về String.

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