Lớp Object
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 24 trên 87.
Trong Java, mọi lớp bạn tạo đều tự động kế thừa từ một lớp đặc biệt có tên là Object. Ngay cả khi bạn không viết extends ở bất cứ đâu, lớp của bạn vẫn là lớp con của Object. Vì vậy, Object là gốc của toàn bộ hệ phân cấp lớp.
public class Person {
// Lớp này ngầm kế thừa Object
}
// Tương đương với:
public class Person extends Object {
}Vì mọi lớp đều kế thừa từ Object, mọi đối tượng trong Java đều có thể dùng một số phương thức dựng sẵn. Những phương thức được dùng phổ biến nhất gồm:
| Phương thức | Mục đích |
|---|---|
toString() | Trả về biểu diễn chuỗi của đối tượng |
equals(Object obj) | So sánh xem hai đối tượng có bằng nhau không |
hashCode() | Trả về giá trị mã băm của đối tượng |
getClass() | Trả về lớp của đối tượng khi chạy chương trình |
Theo mặc định, các phương thức này có cách triển khai chung. Ví dụ, toString() trả về tên lớp, theo sau là @ và mã băm của đối tượng ở dạng thập lục phân, điều này không hữu ích lắm:
Person p = new Person();
System.out.println(p.toString()); // Đầu ra: Person@1a2b3c4dĐó là lý do bạn thường ghi đè các phương thức này trong lớp của mình để chúng hoạt động có ý nghĩa. Hiểu rằng Object là lớp cha chung giúp bạn hiểu vì sao có thể lưu bất kỳ đối tượng nào vào một biến kiểu Object và vì sao một số phương thức có sẵn trên mọi đối tượng bạn tạo.
Thử thách
DễHãy khám phá cách lớp Object làm lớp cha chung của mọi lớp Java bằng cách xây dựng một hệ thống quản lý thiết bị điện tử đơn giản, qua đó minh họa các phương thức (method) được kế thừa (inheritance) từ Object.
Bạn sẽ tạo ba tệp để sắp xếp code:
Gadget.java: Tạo một lớp đại diện cho thiết bị điện tử. Lớp của bạn cần có:- Các trường riêng tư cho
name(String) vàyear(int) - Một hàm khởi tạo khởi tạo cả hai trường
- Các phương thức getter
getName()vàgetYear()
- Các trường riêng tư cho
Smartphone.java: Tạo một lớp con kế thừa Gadget và bổ sung các tính năng dành riêng cho điện thoại thông minh:- Một trường riêng tư cho
brand(String) - Một hàm khởi tạo nhận name, year và brand. Dùng
super(name, year)cho phần của lớp cha - Một phương thức
getBrand()trả về brand - Ghi đè phương thức
toString()để trả về:Smartphone: [brand] [name] ([year])
- Một trường riêng tư cho
Main.java: Minh họa sự khác biệt giữa các phương thứcObjectmặc định và được ghi đè. Bạn sẽ nhận ba đầu vào: tên thiết bị, năm và brand. Tạo cảGadgetvàSmartphonebằng cùng name và year, cùng với brand cho smartphone, sau đó:- In tên lớp của gadget bằng
getClass().getSimpleName() - In kết quả cho biết
toString()mặc định của gadget có chứa ký hiệu "@" hay không (intruehoặcfalse) - In smartphone bằng
toString()đã ghi đè
- In tên lớp của gadget bằng
Bạn sẽ nhận ba đầu vào: tên gadget/smartphone (String), năm (int) và brand (String).
Thử thách này cho thấy vì sao việc ghi đè các phương thức của Object lại quan trọng. toString() mặc định cho bạn kết quả như Gadget@1a2b3c, còn phiên bản tùy chỉnh cung cấp thông tin có ý nghĩa!
Tự làm thử
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Đọc dữ liệu đầu vào
String name = scanner.nextLine();
int year = scanner.nextInt();
scanner.nextLine(); // đọc bỏ ký tự xuống dòng
String brand = scanner.nextLine();
// TODO: Tạo đối tượng Gadget với name và year
// TODO: Tạo đối tượng Smartphone với name, year và brand
// TODO: In ra tên lớp của gadget bằng getClass().getSimpleName()
// TODO: In ra liệu toString() của gadget có chứa "@" hay không (true hoặc false)
// TODO: In ra smartphone (sử dụng toString() đã ghi đè)
}
}
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