Bỏ qua để đến nội dung

Nạp chồng phương thức (Method Overloading)

Nạp chồng phương thức (method overloading) là khi một lớp có nhiều phương thức cùng tên nhưng khác nhau về danh sách tham số (số lượng, kiểu, hoặc thứ tự tham số):

public class Calculator {
static int add(int a, int b) {
return a + b;
}
static double add(double a, double b) { // khác KIỂU tham số
return a + b;
}
static int add(int a, int b, int c) { // khác SỐ LƯỢNG tham số
return a + b + c;
}
}
System.out.println(Calculator.add(2, 3)); // gọi add(int, int) -> 5
System.out.println(Calculator.add(2.5, 3.5)); // gọi add(double, double) -> 6.0
System.out.println(Calculator.add(1, 2, 3)); // gọi add(int, int, int) -> 6

Trình biên dịch quyết định gọi overload nào dựa trên kiểu và số lượng đối số tại lời gọi, ngay lúc biên dịch (không phải lúc chạy chương trình):

static void print(int x) { System.out.println("int: " + x); }
static void print(String x) { System.out.println("String: " + x); }
print(5); // gọi print(int)
print("5"); // gọi print(String)

Nếu không có overload nào khớp chính xác, trình biên dịch sẽ thử áp dụng widening conversion (ví dụ intlong) trước khi báo lỗi.

⚠️ Chỉ khác kiểu trả về, giống hệt tham số thì không được coi là overloading hợp lệ - trình biên dịch sẽ báo lỗi vì không thể phân biệt hai phương thức chỉ dựa vào kiểu trả về:

static int getValue() { return 1; }
// static double getValue() { return 1.0; } // LỖI BIÊN DỊCH! Trùng tên và tham số, chỉ khác kiểu trả về

Dễ nhầm lẫn giữa hai khái niệm nghe giống nhau:

Overloading Overriding
Xảy ra ở đâu Cùng một lớp Lớp con định nghĩa lại phương thức của lớp cha
Danh sách tham số Phải khác nhau Phải giống hệt nhau
Quyết định khi nào Lúc biên dịch (compile-time) Lúc chạy chương trình (runtime)

Chi tiết về overriding sẽ được học ở phần Kế thừa (Inheritance) trong mục Hướng đối tượng. Xem thêm ví dụ minh họa sự nhầm lẫn thường gặp giữa hai khái niệm này ở trang “Overriding vs Overloading” trong mục What the Java!.

  • Method overloading: nhiều phương thức cùng tên, khác danh sách tham số, trong cùng một lớp
  • Trình biên dịch chọn overload phù hợp dựa trên kiểu/số lượng đối số tại lời gọi, ngay lúc biên dịch
  • Chỉ khác kiểu trả về (tham số giống hệt) không phải overloading hợp lệ
  • Overloading (cùng lớp, tham số khác) khác với Overriding (lớp con, tham số giống hệt)