1. Ghi đè phương thức trong Java là gì?

Ghi đè phương thức là việc chúng ta khai báo lại một phương thức đã được khai báo trong class cha với điều kiện kiểu dữ liệu trả về và các tham số là giống nhau.
Khi một phương thức đã được ghi đè thì Java sẽ ưu tiên thực thi phương thức đã được ghi đè khi chúng ta khởi tạo object từ class con. Việc ghi đè này giúp một lớp con kế thừa hành vi của lớp cha và có thể thay đổi nó khi cần.

Khi chúng ta thực hiện ghi đè phương thức thì nên thêm annotation @Override vào trước method cần ghi đè để báo cho trình biên dịch biết và thực hiện bắn ra error nếu như phương thức bị ghi đè không tồn tại.

Ví dụ:

class LopCha{
    public void xuat(){
        System.out.println("Lop cha.");
    }
}
class LopCon extends LopCha{
    @Override
    public void xuat(){
        System.out.println("Lop con.");
    }
}
class Main{
    public static void main(String[] args) {
        LopCon aaa = new LopCon();
        aaa.xuat();
    }
}

Kết quả

Lop con.

Quy tắc khi ghi đè phương thức trong Java:

  • Khi ghi đè phương thức lớp con và lớp cha phải có phương thức giống nhau: giống tên phương thức, kiểu dữ liệu trả về và danh sách tham số.
  • Chúng ta không thể ghi đè (overriding) những phương thức finalstatic . Cùng đó là lớp con phải luôn luôn ghi đè (overriding) phương thức abstract của lớp cha.

2. Sử dụng từ khóa super với overriding trong Java

Chúng ta có thể gọi phương thức của lớp cha trong lớp con sau khi đã ghi đè (overriding) phương thức đó bằng cách sử dụng từ khóa super

Ví dụ:

class LopCha{
    public void xuat(){
        System.out.println("Lop cha.");
    }
}
class LopCon extends LopCha{
    @Override
    public void xuat(){
        super.xuat();//gọi hàm xuat() của lớp cha
        System.out.println("Lop con.");
    }
}
public class Main{
    public static void main(String[] args) {
        LopCon aaa = new LopCon();
        aaa.xuat();
    }
}

Kết quả

Lop cha.
Lop con.

3. Access modifier với ghi đè phương thức trong Java

Phương thức được ghi đè ở lớp con có thể có access modifier khác với lớp cha. Nhưng access modifier này phải có phạm truy truy cập lớn hơn của lớp cha.

Ví dụ như một phương thức myClass() trong lớp cha khai báo là protected. Phương thức myClass() trong lớp con chỉ có thể là public hoặc protected chứ không thể khai báo là private.

Ví dụ:

class LopCha{
    protected void xuat(){//hàm protected
        System.out.println("Lop cha.");
    }
}
class LopCon extends LopCha{
    @Override
    public void xuat(){//hàm ghi đè public
        System.out.println("Lop con.");
    }
}
public class Main{
    public static void main(String[] args) {
        LopCon aaa = new LopCon();
        aaa.xuat();
    }
}

Kết quả

Lop con.

Trong ví dụ trên, lớp cha LopCha có phương thức xuat()protected. Lớp con LopCon ghi đè phương thức xuat() khai báo là public.

4. Che giấu phương thức trong Java

Che giấu phương thức là việc khai báo lại phương thức static trong hai class kế thừa nhau với kiểu dữ liệu trả về và tham số truyền vào tương tự nhau.

Ví dụ:

class Xe {
  public static void printClassStatic() {
    System.out.println("Static. Day la class Xe");
  }
}
class XeDap extends Xe {
  public static void printClassStatic() {
    System.out.println("Static. Day la class XeDap");
  }
}
class Main {
  public static void main(String[] args) {
    Xe.printClassStatic();
    XeDap.printClassStatic();
  }
}

Kết quả

Static. Day la class Xe
Static. Day la class XeDap

5. So sánh giữa ghi đè và nạp chồng phương thức trong Java

Có nhiều điểm khác nhau giữa nạp chồng phương thức và ghi đè phương thức trong Java. Ta có thể thao khảo bảng so sánh dưới đây

Nạp chồng phương thức

Ghi đè phương thức

Nạp chồng phương thức được sử dụng để tăng tính có thể đọc của chương trình Ghi đè phương thức được sử dụng để cung cấp trình triển khai cụ thể của phương thức mà đã được cung cấp bởi lớp cha của nó
Nạp chồng phương thức được thực hiện bên trong lớp Ghi đè phương thức xuất hiện trong hai lớp mà có mối quan hệ IS-A (kế thừa)
Trong Nạp chồng phương thức, tham số phải khác nhau Trong Ghi đè phương thức, tham số phải là giống nhau
Nạp chồng phương thức là ví dụ của đa hình tại compile time Ghi đè phương thức là ví dụ của đa hình tại runtime
Trong Java, Nạp chồng phương thức không thể được thực hiện bởi thay đổi kiểu trả về của phương thức. Kiểu trả về có thể là giống hoặc khác trong Nạp chồng phương thức. Nhưng bạn phải thay đổi tham số Kiểu trả về phải là giống hoặc covariant trong Ghi đè phương thức