Menu
CoddyTech

Ghi đè phương thức (@Override)

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 22 trên 87.

Ghi đè phương thức (method overriding) cho phép lớp con tự triển khai một phương thức đã được định nghĩa trong lớp cha. Đây là cách các lớp con tùy chỉnh hành vi được kế thừa để phù hợp với nhu cầu cụ thể của mình.

Khi ghi đè một phương thức, phiên bản trong lớp con sẽ thay thế hoàn toàn phiên bản của lớp cha đối với các đối tượng thuộc lớp con đó. Phương thức phải có cùng tên và tham số với phương thức của lớp cha, đồng thời có kiểu trả về giống với kiểu của lớp cha hoặc là kiểu con của kiểu đó:

public class Animal {
    public void makeSound() {
        System.out.println("Some generic sound");
    }
}

public class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Woof!");
    }
}

public class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Meow!");
    }
}

Chú thích @Override cho trình biên dịch biết bạn định ghi đè một phương thức của lớp cha. Dù không bắt buộc, bạn vẫn nên dùng vì trình biên dịch sẽ phát hiện lỗi nếu bạn vô tình viết sai tên phương thức hoặc dùng sai tham số:

@Override
public void makeSound() { }  // Chính xác, trình biên dịch kiểm tra điều này

public void makesound() { }  // Lỗi gõ chữ! Tạo phương thức (method) mới thay vì ghi đè phương thức cũ

Khi bạn gọi một phương thức đã được ghi đè, Java sẽ chạy phiên bản thuộc về kiểu thực tế của đối tượng:

Dog dog = new Dog();
dog.makeSound();  // Đầu ra: Woof!

Cat cat = new Cat();
cat.makeSound();  // Đầu ra: Meow!

Ở bài học trước, bạn đã biết có thể dùng super.methodName() bên trong một phương thức được ghi đè nếu bạn vẫn muốn giữ lại cách hoạt động của lớp cha cùng với đoạn code mới.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống thông báo để tìm hiểu cách lớp con có thể ghi đè phương thức của lớp cha và cung cấp hành vi chuyên biệt riêng. Bạn sẽ thấy chú thích @Override giúp phát hiện lỗi như thế nào và cách mỗi lớp con tùy chỉnh các phương thức được kế thừa.

Bạn sẽ tạo ba tệp để sắp xếp code:

  • Notification.java: Tạo lớp cha đại diện cho một thông báo chung. Lớp này cần có:
    • Một trường private chứa message (String)
    • Một hàm khởi tạo nhận message
    • Một phương thức getMessage() trả về message
    • Một phương thức send() in ra: Sending notification: [message]
  • EmailNotification.java: Tạo một lớp con kế thừa từ Notification và tùy chỉnh cách gửi thông báo qua email:
    • Một trường private chứa địa chỉ email recipient (String)
    • Một hàm khởi tạo nhận cả message và recipient, dùng super(message) cho phần thuộc lớp cha
    • Ghi đè phương thức send() bằng chú thích @Override để in ra: Emailing [recipient]: [message]
  • Main.java: Minh họa cách cùng một tên phương thức tạo ra hành vi khác nhau tùy vào kiểu đối tượng. Bạn sẽ nhận hai đầu vào: một message và một địa chỉ email. Tạo cả một Notification thông thường và một EmailNotification với cùng message, sau đó gọi send() trên từng đối tượng để xem đầu ra khác nhau.

Bạn sẽ nhận hai đầu vào: message (String) và địa chỉ email của recipient (String).

Đầu ra cần có hai dòng, dòng đầu tiên từ phương thức send() của lớp cha, sau đó là dòng từ phiên bản được ghi đè trong EmailNotification. Điều này minh họa cách ghi đè phương thức cho phép lớp con thay thế hành vi được kế thừa bằng cách triển khai riêng.

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 message = scanner.nextLine();
        String recipient = scanner.nextLine();
        
        // TODO: Tạo đối tượng Notification với message
        
        // TODO: Tạo đối tượng EmailNotification với message và recipient
        
        // TODO: Gọi send() trên đối tượng Notification
        
        // TODO: Gọi send() trên đối tượng EmailNotification
    }
}
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