Lý lịch
Tất cả các đối tượng Java có một toString()
phương thức, được gọi khi bạn thử và in đối tượng.
System.out.println(myObject); // invokes myObject.toString()
Phương thức này được định nghĩa trong Object
lớp (siêu lớp của tất cả các đối tượng Java). Các Object.toString()
phương thức trả về một chuỗi tìm kiếm khá xấu xí, bao gồm các tên của lớp, một @
biểu tượng và hashcode của đối tượng trong hệ thập lục phân. Mã cho điều này trông giống như:
// Code of Object.toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Do đó, một kết quả như com.foo.MyType@2f92e0f4
có thể được giải thích là:
com.foo.MyType
- tên của lớp, tức là lớp nằm MyType
trong gói com.foo
.
@
- nối chuỗi với nhau
2f92e0f4
mã băm của đối tượng.
Tên của các lớp mảng trông hơi khác nhau, được giải thích tốt trong Javadocs cho Class.getName()
. Chẳng hạn, [Ljava.lang.String
có nghĩa là:
[
- một mảng một chiều (trái ngược với [[
hoặc [[[
v.v.)
L
- mảng chứa một lớp hoặc giao diện
java.lang.String
- loại đối tượng trong mảng
Tùy chỉnh đầu ra
Để in một cái gì đó khác nhau khi bạn gọi System.out.println(myObject)
, bạn phải ghi đè các toString()
phương thức trong lớp của riêng bạn. Đây là một ví dụ đơn giản:
public class Person {
private String name;
// constructors and other methods omitted
@Override
public String toString() {
return name;
}
}
Bây giờ nếu chúng ta in một Person
, chúng ta thấy tên của họ chứ không phải com.foo.Person@12345678
.
Hãy nhớ rằng đó toString()
chỉ là một cách để một đối tượng được chuyển đổi thành một chuỗi. Thông thường, đầu ra này sẽ mô tả đầy đủ đối tượng của bạn một cách rõ ràng và súc tích. Một tốt hơn toString()
cho chúng ta Person
lớp có thể là:
@Override
public String toString() {
return getClass().getSimpleName() + "[name=" + name + "]";
}
Mà sẽ in, ví dụ , Person[name=Henry]
. Đó là một phần dữ liệu thực sự hữu ích để gỡ lỗi / kiểm tra.
Nếu bạn muốn tập trung vào chỉ một khía cạnh của đối tượng của bạn hoặc bao gồm nhiều định dạng vui nhộn, bạn có thể tốt hơn để xác định một phương thức riêng thay vào đó, ví dụ String toElegantReport() {...}
.
Tự động tạo đầu ra
Nhiều IDE cung cấp hỗ trợ cho việc tự động tạo một toString()
phương thức, dựa trên các trường trong lớp. Xem tài liệu cho Eclipse và IntelliJ , ví dụ.
Một số thư viện Java phổ biến cũng cung cấp tính năng này. Một số ví dụ bao gồm:
Nhóm in đối tượng
Vì vậy, bạn đã tạo ra một tốt đẹp toString()
cho lớp học của bạn. Điều gì xảy ra nếu lớp đó được đặt vào một mảng hoặc một bộ sưu tập?
Mảng
Nếu bạn có một mảng các đối tượng, bạn có thể gọi Arrays.toString()
để tạo ra một biểu diễn đơn giản về nội dung của mảng. Ví dụ, hãy xem xét mảng Person
đối tượng này:
Person[] people = { new Person("Fred"), new Person("Mike") };
System.out.println(Arrays.toString(people));
// Prints: [Fred, Mike]
Lưu ý: đây là một cuộc gọi đến một phương thức tĩnh được gọi toString()
trong lớp Mảng, khác với những gì chúng ta đã thảo luận ở trên.
Nếu bạn có một mảng nhiều chiều , bạn có thể sử dụng Arrays.deepToString()
để đạt được cùng loại đầu ra.
Bộ sưu tập
Hầu hết các bộ sưu tập sẽ tạo ra một đầu ra đẹp dựa trên việc gọi .toString()
trên mọi phần tử.
List<Person> people = new ArrayList<>();
people.add(new Person("Alice"));
people.add(new Person("Bob"));
System.out.println(people);
// Prints [Alice, Bob]
Vì vậy, bạn chỉ cần đảm bảo các yếu tố danh sách của bạn xác định một tốt đẹp toString()
như được thảo luận ở trên.