2013-09-06 41 views
20

Tôi biết rằng toString được gọi trong Java bất cứ khi nào chúng tôi in một đối tượng và theo mặc định được xác định trong lớp Object là lớp bậc trên của tất cả các lớp.ToString có được gọi cho các kiểu nguyên thủy không?

Nhưng, giáo viên của tôi nói rằng toString cũng được gọi khi chúng tôi in một số primitive type (int, char v.v.).

Điều đó có đúng không?

Trả lời

48

Có, nhưng không theo nghĩa bạn mong đợi.

System.out.println(someInt) 

chỉ là một trình bao bọc cho print cũng thêm dòng.

System.out.print(someInt) 

calls

String.valueOf(someInt) 

mà lần lượt calls

Integer.toString(someInt) 

đó là a static method trong lớp Integer rằng returns a String object representing the specified integer. Phương pháp này là không giống như Integer#toString(), một phương pháp thể hiện chuyển đối tượng Integer thành một chuỗi biểu thị giá trị int của nó.

someInt.toString() sẽ không hoạt động như someInt không mở rộng Object do không phải là đối tượng.

+1

'sẽ gọi (gián tiếp, có thể)' bạn có thể giải thích thêm về phần này một chút. Tại sao có thể? – ppeterka

+0

@ ppeterka66 Nguồn đã xem xét và hoàn thành. – hexafraction

+0

cảm ơn tất cả các bạn ... thực sự đánh giá cao tất cả các bạn, vì đây là câu hỏi đầu tiên của tôi – Gagan93

0

Nguyên thủy là được tự động lưu đối với loại đối tượng tương ứng của chúng. Vì vậy, toString() sẽ gọi.

+2

Điều này không đúng. 'println' bị quá tải để làm việc với các nguyên thủy. – arshajii

+0

Tôi không đồng ý. Xem câu trả lời của Evgeniy Dorofeev để giải thích tại sao. – Kaadzia

+0

Không cho 'println()'. Xem câu trả lời của Evgeniy Dorofeev. – Mauren

24

Cho phép xem cách hoạt động của System.out.print(int).Theo System API System.out là một PrintStream:

public static final PrintStream out 

Trong PrintStream src chúng ta có thể xem như thế nào nó in ints:

public void print(int i) { 
    write(String.valueOf(i)); 
} 

Và đây là String.valueOf(int) từ String src:

public static String valueOf(int i) { 
    return Integer.toString(i); 
} 
+2

Câu trả lời rất hay, giúp hiểu và hướng dẫn cách tìm giải pháp cho riêng mình vào lần sau. – Kaadzia

+0

'PrintStream' không phải là' final', và không phải là 'PrintStream.print (int)'. Có thể thay đổi 'out' (bằng phương thức' setOut') thành một lớp dẫn xuất mới thay đổi hành vi của phương thức này. Trong thực tế, điều này hiếm khi (hầu như không bao giờ) quan trọng. Đặc biệt không dành cho người mới bắt đầu. – luiscubal

1

Nếu bạn xem xét mã sau đây

System.out.println(5); 

điều sau sẽ xảy ra

public void println(int x) { 
    synchronized (this) { 
     print(x); 
     newLine(); 
    } 
} 

chức năng từ PrintStream lớp sẽ được gọi mà trong nội bộ sẽ gọi print(x) chức năng như sau-

public void print(int i) { 
    write(String.valueOf(i)); 
} 

và bây giờ chức năng nếu bạn thấy valueOf() trong chuỗi lớp

public static String valueOf(int i) { 
    return Integer.toString(i); 
} 

Integer.toString(i) là ý nghĩa của giáo viên bằng cách gọi phương thức toString().

+0

'Integer.toString (i)' là _not_ autoboxing ở tất cả. Không có hộp tự động nào đang diễn ra ở đây. _If_ không có phương thức 'println (int)', và chỉ 'println (Object)', sau đó nó sẽ được gọi bởi 'println (5)' và đó sẽ là autoboxing. –

+0

Đồng ý! Đã cập nhật câu trả lời. Không có autoboxing liên quan. –

+0

Giải thích tốt và đầy đủ. Có lẽ việc thêm phiên bản Java chính xác có thể làm cho nó phù hợp hơn, mặc dù đây là những bit không thay đổi thường xuyên. – ppeterka

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