Sự khác nhau giữa Overloading và Overriding trong Java là gì?

Overloading trong Java: hay nói chính xác hơn là Method Overloading (có thể hiểu là nạp chồng phương thức) là một tính năng giúp một lớp trong Java có thể có nhiều phương thức cùng tên nhưng khác các giá trị tham số đầu vào.

Ví dụ lớp MayTinh có phương thức PhepCong như sau:

PhepCong(int soA, int soB);
PhepCong(int soC, int soD, int soE);

Hai phương thức trên được gọi là Overloading bởi vì chúng có cùng tên là PhepCong và phương thức thứ nhất chỉ có 2 tham số đầu vào là soA và soB, trong khi phương thức thứ hai có 3 tham số đầu vào là soC, soD và soE.

Ví dụ đoạn chương trình Java về Overloading:

class MayTinh {
    public int PhepCong(int soA, int soB) {
        return soA + soB;
    }

    public int PhepCong(int soA, int soB, int soC){
        return soA + soB + soC;
    }
}

public class JavaDemo {
    public static void main(String[] args) {
        MayTinh A = new MayTinh();

        int cong2So = A.PhepCong(2, 3);
        int cong3So = A.PhepCong(4, 5, 6);

        System.out.println(cong2So); // = 5
        System.out.println(cong3So); // = 15
    } 
}

Overriding trong Java: được sử dụng trong trường hợp kế thừa lớp, khi bạn muốn định nghĩa lại một phương thức nào đó ở lớp con mà bản thân phương thức đó đã có mặt ở lớp cha thì phương thức bạn định nghĩa lại ở lớp con gọi là Method Overriding (có thể hiểu là ghi đè phương thức).

Mục đích của Overriding là gì? Một lớp cha thông thường sẽ được nhiều lớp con kế thừa, do đó phương thức trong lớp cha có thể phù hợp với lớp con này mà không phù hợp với lớp con kia.

Ví dụ lớp cha là lớp ConNguoi thì lớp con sẽ có nhiều lớp là NguoiA, NguoiB, NguoiC, … cho nên phương thức DiChuyen ở lớp cha chẳng hạn, không thể dùng chung cho tất cả các lớp con được, mà ở mỗi lớp con, bạn sẽ phải định nghĩa một phương thức riêng như người A đi bộ, người B chạy, …

Ví dụ đoạn chương trình Java về Overriding:

// Lớp cha ConNguoi
class ConNguoi {
    public void DiChuyen() {
        System.out.println("Con nguoi di chuyen");
    }
}

// Lớp con Người A
class NguoiA extends ConNguoi {  
    @Override
    public void DiChuyen(){
        System.out.println("Nguoi A di bo");
    }
}

// Lớp con Người B
class NguoiB extends ConNguoi {  
    @Override
    public void DiChuyen(){
        System.out.println("Nguoi B dang chay");
    }
}

public class JavaDemo {
    public static void main(String[] args) {
        NguoiA A = new NguoiA();
        A.DiChuyen(); // Xuất ra màn hình người A đi bộ

        NguoiB B = new NguoiB();
        B.DiChuyen(); // Xuất ra màn hình người B đang chạy
    } 
}