Method Overloading trong java với ví dụ cụ thể

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

5 1 vote
Article Rating
Subscribe
Notify of
guest
2 Comments
Newest
Oldest Most Voted
Inline Feedbacks
View all comments
2
0
Would love your thoughts, please comment.x
()
x