Mục lục
Method overloading là một tính năng cho phép một class có nhiều method cùng tên nhưng khác danh sách các tham số đầu vào.
Chúng ta có 3 cách để implement method overloading
- Thay đổi số lượng tham số lượng tham số đầu vào
- Thay đổi kiểu dữ liệu của các tham số đầu vào
- Thay đổi trình tự kiểu dữ liệu của các tham số đầu vào
Method overloading – Thay đổi số lượng tham số
Nếu các method có cùng tên, cùng kiểu dữ liệu của các tham số đầu vào nhưng khác nhau về số lượng thì có thể xem là method overloading.
Ví dụ method overloading – thay đổi số lượng tham số đầu vào
// File MethodOverload.java public class MethodOverload { int sum(int a, int b) { return a + b; } int sum(int a, int b, int c) { return a + b + c; } }
// File Main.java public class Main { public static void main(String[] args) { MethodOverload methodOverload = new MethodOverload(); System.out.println("a + b = " + methodOverload.sum(1, 2)); System.out.println("a + b + c = " + methodOverload.sum(1,2,3)); } }
Output:
a + b = 3
a + b + c = 6
Chúng ta có 2 method đều có tên là sum, chúng đều có các tham số kiểu số nguyên int, nhưng là khác nhau về số lượng, cho nên vẫn được tính là 2 method khác nhau, mà chúng ta gọi là method overload.
Method overloading – Thay đổi kiểu dữ liệu
Nếu các method cùng tên cùng các tham số đầu nhưng khác kiểu dữ liệu thì vẫn được xem là method overloading.
Ví dụ method overloading – thay đổi kiểu dữ liệu
// File MethodOverload.java public class MethodOverload { void display(int n) { System.out.println("So nguyen: " + n); } void display(String str) { System.out.println("Chuoi: " + str); } }
// File Main.java public class Main { public static void main(String[] args) { MethodOverload methodOverload = new MethodOverload(); methodOverload.display(10); methodOverload.display("shareprogramming.net"); } }
Output
So nguyen: 10
Chuoi: shareprogramming.net
Chúng ta có 2 method display(), cả 2 đều có một tham số đầu vào thế nhưng lại khác kiểu dữ liệu.
Method overloading – Thay đổi trình tự kiểu dữ liệu của các tham số đầu vào
Các method có cùng tên, số lượng và kiểu dữ liệu nhưng khác nhau về trình tự sắp xếp cũng được xem là method overload.
Ví dụ method overloading – thay đổi trình tự kiểu dữ liệu của các tham số đầu vào
// File MethodOverload.java public class MethodOverload { void display(int n, String str) { System.out.println("So nguyen: " + n); System.out.println("Chuoi: " + str); } void display(String str, int n) { System.out.println("So nguyen: " + n); System.out.println("Chuoi: " + str); } }
// Main.java public class Main { public static void main(String[] args) { MethodOverload methodOverload = new MethodOverload(); methodOverload.display(10, "java oop"); methodOverload.display("shareprogramming.net", 12); } }
Output
So nguyen: 10
Chuoi: java oop
So nguyen: 12
Chuoi: shareprogramming.net
Ở trên là 3 cách để chúng ta có thể implement method overloading. Trong thực tế chúng ta thường kết hợp 3 cách trên lại để implement method over load.
Tóm tắt: Method cùng tên nhưng khác tham số đầu vào gọi là method overloading
Ví du kết hợp cả 3 cách method overloading
public class MethodOverload { void display(int n, String str, char ch) { System.out.println("So nguyen: " + n); System.out.println("Chuoi: " + str); System.out.println("Ky Tu: " +ch); } void display(String str, int n) { System.out.println("So nguyen: " + n); System.out.println("Chuoi: " + str); } }
Chúng ta thấy 2 method display() vừa khác số lượng tham số đầu vào, khác kiểu dữ liệu và trình tự.
Method overloading – Type Promotion
Type promotion là tính năng cho phép chuyển kiểu dữ liệu của tham số đầu vào từ loại nhỏ sang loại lớn hơn. Ví dụ chuyển từ byte sang short, short sang int, int sang long etc.
Trong method overloading, type promotion sẽ làm việc như sau, dể làm rõ mình sẽ làm một ví dụ cụ thể
// File MethodOverload.java public class MethodOverload { void display(double b) { System.out.println("Method display"); } }
// File Main.java public class Main { public static void main(String[] args) { MethodOverload methodOverload = new MethodOverload(); // Truyền vào một số kiểu float methodOverload.display(10.4f); } }
Output: Method display
Rõ ràng là method display(double b), để gọi display() chúng ta cần truyền vào một số double, thế nhưng chúng ta truyền float vào vẫn được chấp nhận. Đó là do type promotion đã chuyển float sang double đấy các bạn.
Chúng ta đến ví dụ thứ 2
// File MethodOverload.java public class MethodOverload { void display(double b) { System.out.println("Method display 1"); } void display(float b) { System.out.println("Method display 2"); } }
// File Main.java public class Main { public static void main(String[] args) { MethodOverload methodOverload = new MethodOverload(); // Truyền vào một số kiểu float methodOverload.display(10.4f); } }
Output: Method display 2
Note: Type promotion chỉ thực hiện khi method chúng ta gọi không có kiểu dữ liệu tương ứng.
Chúng ta có method display(float b) cho nên khi chúng ta gọi display() truyền số float vào thì nó sẽ thực hiện đúng method display() có tham số là float.
Chúng ta có bản chuyển của type promotion sau
byte -> short -> int -> long short -> int -> long int -> long -> float -> double float -> double long -> float -> double |
Method overloading không hợp lệ
Nảy giờ chúng ta bàn luận, các bạn có tự hỏi liệu nếu các method cùng tên, khác tham số là method overloadig. Còn nếu nó khác kiểu trả về thì sao?
public class MethodOverload { void display(int b) { System.out.println("Method one"); } int display(int b) { System.out.println("Method two"); return 1; } }
Cách viết trên sẽ báo lỗi compile, vì 2 method trên theo chúng ta thấy là chúng cũng có khác đó chứ, khác nhau kiểu trả về. Thế nhưng đây không phải là method overloading nhé các bạn. Nó sẽ gây lỗi và các bạn sẽ không compile được đâu.
Note: 2 method giống nhau(tên, tham số) nhưng khác kiểu trả về là không hợp lệ.
Nguồn tham khảo
https://beginnersbook.com/2013/05/method-overloading/
https://www.programiz.com/java-programming/method-overloading