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.
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)
- Một phương thức
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ứcformat, 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ả
}
}
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