1. Nạp chồng phương thức trong Java là gì?

Nạp chồng phương thức trong Java – Method Overloading là một khái niệm trong OOP. Nó cho phép một lớp có khả năng định nghĩa ra nhiều phương thức có cùng tên nhưng khác nhau về tham số truyền vào hoặc kiểu dữ liệu.

Ví dụ:

int myMethod(int x)
float myMethod(float x)
double myMethod(double x, double y)

Sử dụng nạp chồng phương thức là ta dễ hiểu  cũng như đọc chương trình cũng dễ dàng hơn. Và có 2 cách nạp chồng phương thức trong Java là:

  • Thay đổi số lượng các tham số
  • Thay đổi kiểu dữ liệu của tham số

Chú ý

Java không thể nạp chồng phương thức bằng cách chỉ thay đổi kiểu trả về của phương thức.

2. Thay đổi số lượng các tham số

Chúng ta sẽ tạo 2 phương thức. Phương thức add() đầu tiên thực hiện việc tính tổng của 2 số, phương thức thứ hai thực hiện việc tính tổng của 3 số. Sử dụng phương thức static để gọi hàm thông qua tên class thay vì phải tạo thể hiên của lớp.

class Calculation{  
  void sum(int a,int b){
    System.out.println(a+b);
  }  
  void sum(int a,int b,int c){
    System.out.println(a+b+c);
  }  
  public static void main(String args[]){  
    Calculation obj=new Calculation();  
    obj.sum(10,10,10);  
    obj.sum(20,20);  
  }  
}

Kết quả

30
40

3. Thay đổi kiểu dữ liệu của tham số

Chúng ta sẽ tạo ra 2 phương thức có kiểu dữ liệu khác nhau. Phương thức add() đầu tiên nhận 2 đối số có kiểu giá trị là integer . Phương thức thứ hai nhận 2 đối số có kiểu giá trị là double .

class Calculation2{  
  void sum(int a,int b){
    System.out.println(a+b);
  }  
  void sum(double a,double b){
    System.out.println(a+b);
  }  
  public static void main(String args[]){  
    Calculation2 obj=new Calculation2();  
    obj.sum(10.5,10.5);  
    obj.sum(20,20);  
  }  
}

Kết quả

21.0
40

4. Nạp chồng phương thức với main() trong Java

Trong Java, chúng ta có thể hoàn toàn nạp chồng phương thức main() , tức là trong một lớp chúng ta có thể có nhiều hàm main() bằng cách nạp chồng phương thức. Nhưng khi biên dịch thì trình biên dịch sẽ chỉ gọi phương thức main() có đối số truyền vào là một mảng các chuỗi ký tự.

Ví dụ:

public class Main {
 
    public static void main(String[] args) {
        System.out.println("Đây là phương thức main có đối số truyền vào là 1 chuỗi các ký tự.");
    }
 
    public static void main(String args) {
        System.out.println("Đây là phương thức main có đối số truyền vào là 1 chuỗi ký tự.");
    }
     
    public static void main() {
        System.out.println("Đây là phương thức main không có đối số.");
    }
}

Két quả

Đây là phương thức main có đối số truyền vào là 1 chuỗi các ký tự.

5. Nạp chồng phương thức và sự thay đổi kiểu giá trị

Kiểu dữ liệu của đối số truyền vào được thay đổi sang kiểu dữ liệu khác (tự động ép kiểu) nếu giá trị của đối số đó không phù hợp với kiểu dữ liệu của tham số đã được đinh nghĩa.

Ví dụ như kiểu byte có thể được ép sang các kiểu short , int , long , float hoặc double. Kiểu dữ liệu short có thể được ép sang các kiểu int, long, float hoặc double. Kiểu dữ liệu char có thể được ép sang các kiểu int, long, float hoặc double

Ví dụ:

class OverloadingCalculation1{  
  void sum(int a,long b){
    System.out.println(a+b);
  }  
  void sum(int a,int b,int c){
    System.out.println(a+b+c);
  }  
  public static void main(String args[]){  
    OverloadingCalculation1 obj=new OverloadingCalculation1();  
    obj.sum(20,20); //Bay gio int literal thu hai se duoc promote thanh long  
    obj.sum(20,20,20);  
  }  
}

Kết quả

40
60

Nếu không có kiểu đối số nào phù hợp, chuyển đổi kiểu sẽ không được thực hiện

class OverloadingCalculation2{  
  void sum(int a,int b){
    System.out.println("phuong thuc int arg duoc trieu hoi");
  }  
  void sum(long a,long b){
    System.out.println("phuong thuc long arg duoc trieu hoi");
  }  
  public static void main(String args[]){  
    OverloadingCalculation2 obj=new OverloadingCalculation2();  
    obj.sum(20,20); //Bay gio phuong thuc int arg sum() duoc trieu hoi  
  }  
}

Kết quả

phuong thuc int arg duoc trieu hoi

Không có kiểu đối số nào phụ hợp trong phương thức và mỗi phương thức thay đổi số đối số tương tự nhau. Trường hợp này sẽ không xác định được phương thức nào được gọi

class OverloadingCalculation3{  
  void sum(int a,long b){
    System.out.println("Phuong thuc a duoc trieu hoi");
  }  
  void sum(long a,int b){
    System.out.println("Phuong thuc b duoc trieu hoi");
  }  

  public static void main(String args[]){  
    OverloadingCalculation3 obj=new OverloadingCalculation3();  
    obj.sum(20,20); //Khong co tinh luong nghia o day  
  }  
}

Kết quả

Main.java:6: error: reference to sum is ambiguous
  obj.sum(20,20); //Khong co tinh luong nghia o day  
     ^
  both method sum(int,long) in OverloadingCalculation3 and method sum(long,int) in OverloadingCalculation3 match
1 error