Ai có thể giải thích cho tôi khái niệm của toString()phương thức, được định nghĩa trong Objectlớp không? Nó được sử dụng như thế nào, và mục đích của nó là gì?
Ai có thể giải thích cho tôi khái niệm của toString()phương thức, được định nghĩa trong Objectlớp không? Nó được sử dụng như thế nào, và mục đích của nó là gì?
Câu trả lời:
Từ các Object.toStringtài liệu:
Trả về một chuỗi đại diện của các đối tượng. Nói chung,
toStringphương thức trả về một chuỗi "đại diện bằng văn bản" cho đối tượng này. Kết quả phải là một trình bày ngắn gọn nhưng đầy đủ thông tin, dễ đọc cho một người. Khuyến nghị rằng tất cả các lớp con ghi đè phương thức này.Các
toStringphương pháp để lớpObjecttrả về một chuỗi gồm tên của lớp trong đó đối tượng là một thể hiện, nhân vật ở-dấu `@', và các đại diện thập lục phân unsigned của mã băm của đối tượng. Nói cách khác, phương thức này trả về một chuỗi bằng giá trị của:
getClass().getName() + '@' + Integer.toHexString(hashCode())
Thí dụ:
String[] mystr ={"a","b","c"};
System.out.println("mystr.toString: " + mystr.toString());
output:- mystr.toString: [Ljava.lang.String;@13aaa14a
Sử dụng String.toString:
Bất cứ khi nào bạn yêu cầu khám phá hàm tạo được gọi là giá trị trong Stringbiểu mẫu, bạn có thể chỉ cần sử dụng String.toString... cho một ví dụ ...
package pack1;
import java.util.*;
class Bank {
String n;
String add;
int an;
int bal;
int dep;
public Bank(String n, String add, int an, int bal) {
this.add = add;
this.bal = bal;
this.an = an;
this.n = n;
}
public String toString() {
return "Name of the customer.:" + this.n + ",, "
+ "Address of the customer.:" + this.add + ",, " + "A/c no..:"
+ this.an + ",, " + "Balance in A/c..:" + this.bal;
}
}
public class Demo2 {
public static void main(String[] args) {
List<Bank> l = new LinkedList<Bank>();
Bank b1 = new Bank("naseem1", "Darbhanga,bihar", 123, 1000);
Bank b2 = new Bank("naseem2", "patna,bihar", 124, 1500);
Bank b3 = new Bank("naseem3", "madhubani,bihar", 125, 1600);
Bank b4 = new Bank("naseem4", "samastipur,bihar", 126, 1700);
Bank b5 = new Bank("naseem5", "muzafferpur,bihar", 127, 1800);
l.add(b1);
l.add(b2);
l.add(b3);
l.add(b4);
l.add(b5);
Iterator<Bank> i = l.iterator();
while (i.hasNext()) {
System.out.println(i.next());
}
}
}
... sao chép chương trình này vào Eclipse của bạn và chạy nó ... bạn sẽ có những ý tưởng về String.toString...
toStringkhông phải là mục đích và không phù hợp với mục đích giao diện người dùng.
toStringđể hiển thị một đối tượng trong GUI? Nếu tôi có một đối tượng phong phú và tôi muốn hiển thị nó trong GUI, thì không, tôi không tạo thêm một trình kết xuất cho nó cũng như không trích xuất thuộc tính chuỗi ra khỏi đối tượng để sử dụng nó trong GUI, tôi giữ nó đơn giản và dễ thực hiện toStringđể có thể vượt qua tất cả chi phí đó. Nếu bạn muốn làm điều này một cách rõ ràng hơn, hãy tạo một lớp wrapper dành riêng cho mục đích giao diện người dùng và triển khai toStringphương thức của nó để trả về thuộc tính chuỗi của wrappee.
Các toString() phương thức trả về một văn bản đại diện của một đối tượng. Một triển khai cơ bản đã được bao gồm trong java.lang.Objectvà vì vậy tất cả các đối tượng kế thừa từjava.lang.Object nó được đảm bảo rằng mọi đối tượng trong Java đều có phương thức này.
Ghi đè phương thức luôn là một ý tưởng hay, đặc biệt là khi nói đến gỡ lỗi, vì trình gỡ lỗi thường hiển thị các đối tượng theo kết quả của toString()phương thức. Vì vậy, sử dụng một triển khai có ý nghĩa nhưng sử dụng nó cho các mục đích kỹ thuật . Logic ứng dụng nên sử dụng getters:
public class Contact {
private String firstName;
private String lastName;
public Contact (String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {return firstName;}
public String getLastName() {return lastName;}
public String getContact() {
return firstName + " " + lastName;
}
@Override
public String toString() {
return "["+getContact()+"]";
}
}
Nó có thể tùy ý sử dụng trong ngữ cảnh của một ứng dụng nhưng nó được sử dụng cho mục đích gỡ lỗi thường xuyên hơn. Ví dụ: khi bạn đạt đến điểm ngắt trong IDE, việc đọc mộttoString() của các đối tượng hơn nhiều so với việc kiểm tra các thành viên của chúng.
Không có yêu cầu thiết lập cho những gì một toString()phương pháp phải làm. Theo quy ước, thông thường nó sẽ cho bạn biết tên của lớp và giá trị của các thành viên dữ liệu thích hợp. Thông thường, toString()các phương thức được tạo tự động trong IDE.
Dựa vào kết quả cụ thể từ một toString()phương thức hoặc phân tích cú pháp nó trong một chương trình là một ý tưởng tồi. Dù bạn làm gì, đừng đi theo con đường đó.
toString () trả về một biểu diễn chuỗi / văn bản của đối tượng. Thường được sử dụng cho các mục đích chẩn đoán như gỡ lỗi, ghi nhật ký, v.v., phương thức toString () được sử dụng để đọc các chi tiết có ý nghĩa về đối tượng.
Nó tự động được gọi khi đối tượng được chuyển tới println, print, printf, String.format (), khẳng định hoặc toán tử nối chuỗi.
Việc triển khai mặc định của toString () trong lớp Đối tượng trả về một chuỗi bao gồm tên lớp của đối tượng này theo sau là dấu @ và biểu diễn thập lục phân không dấu của mã băm của đối tượng này bằng cách sử dụng logic sau,
getClass().getName() + "@" + Integer.toHexString(hashCode())
Ví dụ như sau
public final class Coordinates {
private final double x;
private final double y;
public Coordinates(double x, double y) {
this.x = x;
this.y = y;
}
public static void main(String[] args) {
Coordinates coordinates = new Coordinates(1, 2);
System.out.println("Bourne's current location - " + coordinates);
}
}
bản in
Bourne's current location - Coordinates@addbf1 //concise, but not really useful to the reader
Bây giờ, ghi đè toString () trong lớp Tọa độ như bên dưới,
@Override
public String toString() {
return "(" + x + ", " + y + ")";
}
kết quả trong
Bourne's current location - (1.0, 2.0) //concise and informative
Tính hữu ích của việc ghi đè toString () trở nên nhiều hơn khi phương thức được gọi trên các tập hợp chứa tham chiếu đến các đối tượng này. Ví dụ như sau
public static void main(String[] args) {
Coordinates bourneLocation = new Coordinates(90, 0);
Coordinates bondLocation = new Coordinates(45, 90);
Map<String, Coordinates> locations = new HashMap<String, Coordinates>();
locations.put("Jason Bourne", bourneLocation);
locations.put("James Bond", bondLocation);
System.out.println(locations);
}
bản in
{James Bond=(45.0, 90.0), Jason Bourne=(90.0, 0.0)}
thay vì điều này,
{James Bond=Coordinates@addbf1, Jason Bourne=Coordinates@42e816}
Vài gợi ý triển khai,
Cung cấp trình truy cập / getters cho tất cả các trường cá thể có trong chuỗi được trả về. Ví dụ, trong lớp Tọa độ,
public double getX() {
return x;
}
public double getY() {
return y;
}Đề cập toàn diện về phương thức toString () có trong Mục 10 của cuốn sách, Java ™ hiệu quả, Ấn bản thứ hai, của Josh Bloch.
Mã hóa:
public class Test {
public static void main(String args[]) {
ArrayList<Student> a = new ArrayList<Student>();
a.add(new Student("Steve", 12, "Daniel"));
a.add(new Student("Sachin", 10, "Tendulkar"));
System.out.println(a);
display(a);
}
static void display(ArrayList<Student> stu) {
stu.add(new Student("Yuvi", 12, "Bhajji"));
System.out.println(stu);
}
}
Student.java:
public class Student {
public String name;
public int id;
public String email;
Student() {
}
Student(String name, int id, String email) {
this.name = name;
this.id = id;
this.email = email;
}
public String toString(){ //using these toString to avoid the output like this [com.steve.test.Student@6e1408, com.steve.test.Student@e53108]
return name+" "+id+" "+email;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public int getId(){
return id;
}
public void setId(int id){
this.id=id;
}
public String getEmail(){
return email;
}
public void setEmail(String email){
this.email=email;
}
}
Đầu ra:
[Steve 12 Daniel, Sachin 10 Tendulkar]
[Steve 12 Daniel, Sachin 10 Tendulkar, Yuvi 12 Bhajji]
Nếu bạn không sử dụng toString () trong lớp Pojo (Student.java), bạn sẽ nhận được đầu ra như [com.steve.test.Student@6e1408, com.steve.test.Student@e53108]. Để tránh những vấn đề này, chúng tôi đang sử dụng phương thức toString ().
Bất cứ khi nào bạn truy cập một Đối tượng (không phải là một Chuỗi) trong ngữ cảnh Chuỗi thì toString () được trình biên dịch gọi dưới các lớp phủ.
Đây là lý do tại sao
Map map = new HashMap();
System.out.println("map=" + map);
hoạt động và bằng cách ghi đè tiêu chuẩn toString () từ Object trong các lớp của riêng bạn, bạn cũng có thể làm cho các đối tượng của mình trở nên hữu ích trong ngữ cảnh Chuỗi.
(và coi đó là một hộp đen! Không bao giờ, không bao giờ sử dụng nội dung cho bất kỳ việc gì khác ngoài việc trình bày với con người)
Mục đích chính của toString là tạo ra một biểu diễn Chuỗi của một đối tượng, có nghĩa là giá trị trả về luôn là Chuỗi. Trong hầu hết các trường hợp, đây chỉ đơn giản là lớp và tên gói của đối tượng, nhưng trong một số trường hợp như StringBuilder, bạn sẽ thực sự nhận được một chuỗi-văn bản.
/**
* This toString-Method works for every Class, where you want to display all the fields and its values
*/
public String toString() {
StringBuffer sb = new StringBuffer();
Field[] fields = getClass().getDeclaredFields(); //Get all fields incl. private ones
for (Field field : fields){
try {
field.setAccessible(true);
String key=field.getName();
String value;
try{
value = (String) field.get(this);
} catch (ClassCastException e){
value="";
}
sb.append(key).append(": ").append(value).append("\n");
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return sb.toString();
}
Nếu bạn học Python trước rồi đến Java. Tôi nghĩ nó đóng vai trò giống như __str__()phương thức trong Python, nó là một phương thức ma thuật giống như __dict__()và __init__()nhưng để tham chiếu đến một chuỗi đại diện cho đối tượng.