Phương thức toString()
Thuộc phần Lập trình hướng đối tượng trong hành trình Java của Coddy. Bài học 41 trên 87.
Mọi lớp (class) trong Java đều kế thừa từ lớp Object, lớp này cung cấp một số phương thức hữu ích. Một trong những phương thức thường được ghi đè nhất là toString(), phương thức này trả về biểu diễn dạng chuỗi của một đối tượng.
Theo mặc định, toString() trả về tên lớp theo sau là mã băm của đối tượng, thông tin này không hữu ích lắm:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
Person p = new Person("Alice", 25);
System.out.println(p); // Person@15db9742Bằng cách ghi đè toString(), bạn có thể cung cấp đầu ra có ý nghĩa để mô tả trạng thái của đối tượng:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person[name=" + name + ", age=" + age + "]";
}
}
Person p = new Person("Alice", 25);
System.out.println(p); // Person[name=Alice, age=25]Phương thức toString() được tự động gọi khi bạn in ra một đối tượng hoặc nối đối tượng đó với một chuỗi. Nhờ vậy, việc gỡ lỗi trở nên dễ dàng hơn nhiều vì bạn có thể nhanh chóng xem nội dung của đối tượng mà không cần viết thêm code.
Thử thách
DễHãy xây dựng một hệ thống quản lý hàng tồn kho hiển thị thông tin có ý nghĩa về các mặt hàng bằng cách triển khai toString() tùy chỉnh. Bạn sẽ tạo lớp Product ghi đè phương thức toString() mặc định để cung cấp cách biểu diễn rõ ràng, dễ đọc cho từng sản phẩm.
Bạn sẽ sắp xếp code trong hai tệp:
Product.java: Tạo một lớp đại diện cho một mặt hàng trong kho. Mỗi Product có ba trường riêng tư:name(String),price(double) vàquantity(int). Thêm hàm khởi tạo để khởi tạo cả ba trường. Ghi đè phương thứctoString()để trả về một chuỗi được định dạng chính xác như sau:Product[name=X, price=Y, quantity=Z], trong đó X, Y và Z là giá trị thực tế của các trường. Giá hiển thị dưới dạng số thông thường, không cần định dạng đặc biệt.Main.java: Tạo và hiển thị sản phẩm để đưa lớp Product vào hoạt động. Bạn sẽ nhận ba đầu vào: tên sản phẩm (String), giá (double) và số lượng (int). Tạo một Product với các giá trị này, sau đó in trực tiếp đối tượng sản phẩm bằngSystem.out.println(). Nhờ phương thứctoString()bạn đã ghi đè, chương trình sẽ tự động hiển thị thông tin sản phẩm đã định dạng thay vì kết quả mặc định khó hiểu!
Bạn sẽ nhận ba đầu vào: tên sản phẩm (String), giá (double) và số lượng (int).
Hãy chú ý cách in trực tiếp đối tượng sẽ tự động gọi phương thức toString(). Điều này giúp việc gỡ lỗi và ghi nhật ký trong các ứng dụng thực tế dễ dàng hơn rất nhiều!
Tự làm thử
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Đọc các giá trị đầu vào
String name = scanner.nextLine();
double price = scanner.nextDouble();
int quantity = scanner.nextInt();
// TODO: Tạo đối tượng Product bằng các giá trị đầu vào
// TODO: In trực tiếp đối tượng Product
// (Thao tác này sẽ tự động gọi phương thức toString()!)
}
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Kiến thức cơ bản về lập trình hướng đối tượng
Tệp bên ngoàiGiới thiệu về lập trình hướng đối tượngLớp và đối tượngTừ khóa thisPhương thứcTrường (thuộc tính)Phương thức khởi tạoNạp chồng phương thức khởi tạoÔn tập: Máy tính đơn giản4Kế thừa
Kế thừa cơ bản (extends)Từ khóa superGhi đè phương thức (@Override)Chuỗi gọi hàm khởi tạoLớp ObjectKế thừa đơn và đa cấpVì sao không hỗ trợ kế thừa nhiều lớpÔn tập: Phân cấp lớp Employee7Phương thức đặc biệt và lớp Object
Phương thức toString()equals() và hashCode()Phương thức clone()compareTo() và ComparableGiao diện ComparatorÔn tập: sắp xếp tùy chỉnh2Bộ điều chỉnh quyền truy cập và đóng gói
Tổng quan về các mức truy cậpPhương thức getter và setterẨn thông tinTừ khóa finalÔn tập: Trình quản lý tài khoản ngân hàng5Tính đa hình
Kiến thức cơ bản về nạp chồng phương thứcGhi đè phương thức (thời gian chạy)Chuyển kiểu lên và chuyển kiểu xuốngToán tử instanceofLớp và phương thức trừu tượngÔn tập: máy tính hình học8Khái niệm OOP nâng cao
Kết hợp và kế thừaKết tập và hợp thànhLớp bên trong, lớp lồng nhau và lớp ẩn danhKiểu enum và phương thức enumBản ghi (Java 16+)Lớp sealed (Java 17+)3Thuộc tính lớp và thành viên tĩnh
Biến của instance và biến tĩnhPhương thức tĩnhKhối tĩnhHằng số (static final)Ôn tập: bộ đếm và tiện ích6Giao diện và lớp trừu tượng
Giới thiệu về giao diệnTriển khai giao diệnTriển khai nhiều giao diệnPhương thức mặc định và tĩnh trong giao diệnLớp trừu tượng và giao diệnGiao diện hàmÔn tập: hệ thống thanh toán9Kiểu tổng quát
Giới thiệu về kiểu tổng quátLớp tổng quátPhương thức tổng quátTham số kiểu có giới hạnKý tự đại diện (?, extends, super)Ôn tập: vùng chứa tổng quát12Mẫu thiết kế, phần 2
Mẫu CommandMẫu AdapterMẫu DecoratorMẫu Template MethodMẫu StateMẫu CompositeMẫu IteratorTự luyện tập: Trình biên dịch Java online