2013-01-25 35 views
12

thể trùng lặp:
Which constructor is chosen when passing null?Khi được gửi đến một hàm tạo trong Java, giá trị "null" làm gì?

Gần đây tôi đi qua tò mò này trong khi mã hóa một vài ngày trở lại và dường như không thể tìm ra lý do tại sao những điều sau đây sẽ xảy ra:

Do lớp bên dưới

public class RandomObject{ 
    public RandomObject(Object o){ 
     System.out.println(1); 
    } 
    public RandomObject(String[] s){ 
     System.out.println(2); 
    } 
} 

Khi cuộc gọi new RandomObject(null); được thực hiện, đầu ra luôn là 2 bất kể thứ tự mà các nhà xây dựng đã được tạo ra. Tại sao null tham chiếu đến mảng chuỗi thay vì đối tượng?

+0

@guido câu hỏi khác liên quan đến 2 không '' '' '' '' ở đây với 'Object' là một khác biệt –

Trả lời

14

Mấu chốt ở đây là đối tượng là loại siêu của String []

Java sử dụng các phương pháp có sẵn cụ thể nhất để giải quyết trường hợp này. Null có thể được truyền cho cả hai phương thức mà không có lỗi biên dịch sao cho Java phải tìm phương thức cụ thể nhất ở đây. Phiên bản với String [] cụ thể hơn - do đó nó sẽ được chọn để thực thi.

6

Someone else has had this question earlier, check this post

Nếu có hai trường hợp để lựa chọn, trình biên dịch sẽ lần đầu tiên thử để chọn trường hợp cụ thể hơn. Trong trường hợp này, String sẽ được chọn trên Object.

Trong câu hỏi khác đó là String str thay vì String[] s

Như vậy, kể từ String[] là một kiểu dữ liệu cụ thể hơn siêu kiểu của nó Object, nó được chọn.

+0

sự khác biệt giữa đây và ở đó, không phải là String [] thay vì String, nhưng Object thay vì AnObject –

+1

@guido Bài đăng này và nhận xét của tôi cho bạn nói về 2 liên kết khác nhau. Vui lòng đọc liên kết ở dòng đầu tiên của bài đăng này –

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