Menu
CoddyTech

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ứcMụ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.

challenge icon

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()
    Đừng ghi đè bất kỳ phương thức nào của Object. Trước tiên, mình muốn xem hành vi mặc định.
  • 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])
  • Main.java: Minh họa sự khác biệt giữa các phương thức Object mặ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ả Gadget và Smartphone bằ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 (in true hoặc false)
    • In smartphone bằng toString() đã ghi đè

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 đè)
        
    }
}
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch Java online