Menu
CoddyTech

Kiến thức cơ bản về nạp chồng phương thức

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

Tính đa hình có nghĩa là “nhiều hình thức”. Trong Java, tính đa hình cho phép các đối tượng hoạt động khác nhau tùy theo ngữ cảnh. Một dạng của tính đa hình là nạp chồng phương thức, còn gọi là tính đa hình tại thời điểm biên dịch vì Java xác định phương thức nào cần gọi trong quá trình biên dịch.

Việc nạp chồng phương thức (method overloading) cho phép bạn định nghĩa nhiều phương thức có cùng tên nhưng có tham số khác nhau. Trình biên dịch phân biệt các phương thức này dựa trên số lượng, kiểu hoặc thứ tự của các tham số:

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
    
    public int add(int a, int b, int c) {
        return a + b + c;
    }
    
    public double add(double a, double b) {
        return a + b;
    }
}

Khi bạn gọi add(5, 3), Java dùng phương thức đầu tiên. Gọi add(5, 3, 2) sẽ kích hoạt phương thức thứ hai, còn add(5.0, 3.0) sẽ gọi phương thức thứ ba. Trình biên dịch chọn phiên bản phù hợp dựa trên các đối số bạn cung cấp.

Lưu ý rằng chỉ thay đổi kiểu trả về thì không được xem là nạp chồng hợp lệ. Danh sách tham số phải khác nhau:

// Không phải nạp chồng hợp lệ, không biên dịch được
public int getValue() { return 1; }
public double getValue() { return 1.0; }  // Lỗi!

Thực ra, bạn đã gặp tình trạng nạp chồng qua việc nạp chồng hàm khởi tạo. Nạp chồng phương thức cũng tuân theo các quy tắc tương tự và mang lại sự linh hoạt bằng cách cho phép một tên phương thức xử lý nhiều trường hợp đầu vào khác nhau.

challenge icon

Thử thách

Dễ

Hãy tạo một bộ định dạng thông điệp để minh họa tính năng nạp chồng phương thức bằng cách cung cấp nhiều cách định dạng thông điệp. Bạn sẽ tạo một lớp tiện ích với một số phương thức format được nạp chồng để xử lý các trường hợp đầu vào khác nhau.

Bạn sẽ sắp xếp code trong hai tệp:

  • MessageFormatter.java: Tạo một lớp hỗ trợ định dạng thông điệp linh hoạt thông qua các phương thức được nạp chồng. Bộ định dạng của bạn cần có:
    • Một phương thức format(String message) trả về thông điệp được đặt trong dấu ngoặc vuông: [message]
    • Một phương thức format(String message, int repeatCount) trả về thông điệp được lặp lại số lần đã chỉ định, cách nhau bằng dấu cách
    • Một phương thức format(String message, String prefix) trả về thông điệp có tiền tố đi kèm: prefix: message
    • Một phương thức format(String message, String prefix, String suffix) trả về: prefix: message (suffix)
    Trình biên dịch sẽ chọn phương thức phù hợp dựa trên các đối số bạn truyền vào. Đây chính là tính đa hình tại thời điểm biên dịch!
  • Main.java: Minh họa cách cả bốn phương thức được nạp chồng hoạt động cùng nhau. Bạn sẽ nhận bốn đầu vào: một thông điệp (String), số lần lặp lại (int), một tiền tố (String) và một hậu tố (String). Tạo một đối tượng MessageFormatter và gọi từng phiên bản của phương thức format, in mỗi kết quả trên một dòng riêng:
    • Đầu tiên, định dạng chỉ với thông điệp
    • Thứ hai, định dạng với thông điệp và số lần lặp lại
    • Thứ ba, định dạng với thông điệp và tiền tố
    • Thứ tư, định dạng với thông điệp, tiền tố và hậu tố

Bạn sẽ nhận bốn đầu vào: nội dung thông điệp, số lần lặp lại, một chuỗi tiền tố và một chuỗi hậu tố.

Ví dụ, nếu thông điệp là "Hello", số lần lặp lại là 3, tiền tố là "INFO" và hậu tố là "done", đầu ra của bạn sẽ hiển thị bốn phiên bản được định dạng khác nhau của cùng một thông điệp, mỗi phiên bản sử dụng một phương thức được nạp chồng khác nhau!

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 message = scanner.nextLine();
        int repeatCount = Integer.parseInt(scanner.nextLine());
        String prefix = scanner.nextLine();
        String suffix = scanner.nextLine();
        
        // TODO: Tạo một đối tượng MessageFormatter
        
        // TODO: Gọi format chỉ với message rồi in kết quả
        
        // TODO: Gọi format với message và repeatCount rồi in kết quả
        
        // TODO: Gọi format với message và prefix rồi in kết quả
        
        // TODO: Gọi format với message, prefix và suffix rồi in kết quả
        
    }
}
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