2015-03-28 12 views
8

Kết nối giữa System.out.println()toString() bằng Java là gì? ví dụ:Kết nối giữa 'System.out.println()' và 'toString()' trong Java

public class A { 
    String x = "abc"; 

    public String toString() { 
     return x; 
    } 
} 

public class ADemo { 
    public static void main(String[] args) { 
     A obj = new A(); 
     System.out.println(obj); 
    } 
} 

Nếu lớp chính chạy, nó cho đầu ra là "abc". Khi tôi xóa mã ghi đè toString(), mã sẽ xuất ra dưới dạng "[email protected]". Vì vậy, bất cứ ai có thể giải thích nguyên tắc làm việc của System.out.println() là gì khi tôi sử dụng tham số như một đối tượng? Nó có được kết nối hoàn toàn với phương thức toString() không?

+0

abcd efgh. ABCD. –

Trả lời

11

System.out là một PrintStream. Printstream định nghĩa một số phiên bản của hàm println() để xử lý số, chuỗi, v.v. Khi bạn gọi PrintStream.println() với một đối tượng tùy ý làm thông số, bạn nhận được the version of the function that acts on an Object. Phiên bản này của hàm

... gọi lúc đầu String.valueOf (x) để có được giá trị chuỗi các đối tượng in của ...

Nhìn vào String.valueOf(Object), chúng ta thấy rằng nó trả

nếu đối số là null, sau đó một chuỗi bằng "null"; nếu không, giá trị của obj.toString() được trả về.

Vì vậy, dài câu chuyện ngắn, System.out.println(someObject) gọi đối tượng là toString() chức năng để chuyển đổi đối tượng thành biểu diễn chuỗi.

Nếu đối tượng của bạn xác định hàm toString() riêng, thì đó là những gì sẽ được gọi. Nếu bạn không cung cấp một hàm như vậy, thì đối tượng của bạn sẽ kế thừa toString() từ một trong các lớp cha của nó. Trong trường hợp xấu nhất, nó sẽ kế thừa Object.toString(). Phiên bản của toString() được xác định để trả lại

một chuỗi bao gồm tên của lớp mà đối tượng là một cá thể, ký tự at-dấu `@ 'và biểu diễn thập lục phân chưa dấu của băm mã của đối tượng.

Hoặc, nói cách khác:

getClass().getName() + '@' + Integer.toHexString(hashCode()) 

Vì vậy, khi bạn gọi System.out.println() trên một đối tượng mà không xác định phiên bản riêng của mình toString(), bạn có thể nhận được phiên bản Object trông giống như "classname @ someHexNumber".

3

toString() là một phương thức tồn tại trong lớp Object (Gốc của cây kế thừa) cho tất cả các lớp.

System.out.print() (SOP) sẽ gọi phương thức toString khi được cấp một đối tượng.

Nếu bạn không ghi đè lên các phương pháp toString(), SOP sẽ gọi phụ huynh toString() đó, nếu cha mẹ là lớp Object, nó sẽ in hashCode của đối tượng

Nếu bạn ghi đè lên phương pháp, SOP sẽ gọi Phương thức toString()

0

System.out.println (obj) sẽ in chuỗi trả về từ obj.toString() nếu bạn không ghi đè nó, nó sẽ gọi phương thức object.toString() cơ sở theo mặc định phương thức toString cho lớp Đối tượng trả về một chuỗi bao gồm tên của lớp mà đối tượng là một cá thể, ký tự at-sign `@ 'và biểu diễn thập lục phân chưa dấu o f mã băm của đối tượng. Nói cách khác, phương pháp này trả về một chuỗi tương đương với giá trị của:

getClass().getName() + '@' + Integer.toHexString(hashCode()) 
Các vấn đề liên quan