1. Phương thức toString() trong Java

Phương thức toString trong Java giúp ta biểu diễn trạng thái của một Object dưới dạng String. Nó sẽ trả về chuỗi đại diện của đối tượng. Khi chúng ta muốn in hoặc ghi một đối tượng, trình biên dịch Compiler trong Java sẽ ngầm gọi phương thức toString() trong Object class. Lưu ý rằng tất cả các class trong Java đều là con của Object class.

Phương thức toString() thuộc class Object trong Java và có thể sử dụng nó mà không cần import thư viện nào cả.

Chúng ta thường sử dụng phương thức toString() để lấy biểu diễn chuỗi của một đối tượng. Điều rất quan trọng và bạn nên biết rằng bất cứ khi nào chúng ta cố gắng in tham chiếu đối tượng thì phương thức toString() bên trong được gọi ra. Nếu chúng ta không xác định phương thức toString() trong lớp của ta thì phương thức toString() của lớp Object sẽ được gọi. Nếu không phương thức toString() được triển khai hoặc ghi đè của chúng ta sẽ được gọi.

2. Cú pháp của phương thức toString()

toString() là một phương thức của lớp Object, có cú pháp như sau:

public String toString() {
    return getClass().getName()+"@"+Integer.toHexString(hashCode());
}

Hành vi mặc định của toString() là in tên lớp, sau đó là @ , sau đó là biểu diễn thập lục phân không dấu của mã băm của đối tượng.

Cú pháp đơn giản của toString() :

object.toString()

Trong đó : object là tên đối tượng của class được trả về.

Phương thức trả về chuỗi sau khi đã chuyển đổi bao gồm: tên class + @ + hashcode của object

Ví dụ 1: giả sử chúng ta có một obj thuộc class Object, bây giờ sử dụng phương thức toString() để chuyển đổi obj dưới dạng string.

Object obj1 = new Object();
System.out.println(obj1.toString());

Kết quả

//Kết quả ->> java.lang.Object@76ed5528

Như vậy chuỗi trả về sẽ có dạng như mình đã nói ở trên: java.lang.Object (tên class) + @ + 76ed5528 (hashcode của object)

Ví dụ 2:

public class Main { 

   public static void main(String args[]) {
      Integer x = 5;

      System.out.println(x.toString());  
      System.out.println(Integer.toString(12)); 
   }
}

Kết quả

5
12

Ví dụ 3:

class Main{
    int rollno;
    String name;
    String city;

    Main(int rollno, String name, String city){
        this.rollno=rollno;
        this.name=name;
        this.city=city;
    }

    public static void main(String args[]){
        Main s1=new Main(101,"A","Ha Noi");
        Main s2=new Main(102,"B","Da Nang");

        System.out.println(s1);
        System.out.println(s1.toString());
        System.out.println(s2);
        System.out.println(s2.toString());
    }
}

Kết quả

Main@2ff4acd0
Main@2ff4acd0
Main@54bedef2
Main@54bedef2

3. Override toString() trong Java

Kết quả ví dụ 3 ở trên làm ta khá khó hiểu. Lý do đơn giản vì implement mặc định của Object như vậy.

Để biễu diễn object có ý nghĩa hơn, chúng ta có thể override toString() (ghi đè) và xuất các thông tin có ý nghĩa hơn như là xuất giá trị của tất cả các thuộc tính etc.

Ví dụ:

class Main{
    int rollno;
    String name;
    String city;

    Main(int rollno, String name, String city){
        this.rollno=rollno;
        this.name=name;
        this.city=city;
    }

    @Override
    public String toString() {
        return "Main{" +
                "rollno=" + rollno +
                ", name='" + name + '\'' +
                ", city='" + city + '\'' +
                '}';
    }

    public static void main(String args[]){
        Main s1=new Main(101,"A","Ha Noi");
        Main s2=new Main(102,"B","Da Nang");

        System.out.println(s1);
        System.out.println(s1.toString());
        System.out.println(s2);
        System.out.println(s2.toString());
    }
}

Kết quả

Main{rollno=101, name='A', city='Ha Noi'}
Main{rollno=101, name='A', city='Ha Noi'}
Main{rollno=102, name='B', city='Da Nang'}
Main{rollno=102, name='B', city='Da Nang'}

Bằng việc ghi đề phương thức toString() của lớp Object, chúng ta có thể trả về giá trị của đối tượng.

Khi không ghi đè phương thức toString() thì phương thức toString() của lớp Object sẽ được gọi khi ta in đối tượng ra màn hình. Điều này làm ta khá khó hiểu. Kết quả trả về của phương thức toString() mặc định của lớp Object có vẻ như cũng không có ý nghĩa gì với chúng ta. Vì vậy ta nên ghi đè phương thức toString() để ghi ra những gì có ý nghĩa