Method Overriding trong Java

Nếu subclass (lớp con) có các phương thức tương tự như trong các super class (class cha), nó được gọi là Method Overriding (Ghi đè phương thức) trong Java.

Method Overriding trong Java
Method Overriding trong Java

Method Overriding được sử dụng khi:

  • Method Overriding được sử dụng để cụ thể hóa khai triển phương thức đã được cung cấp bởi lớp cha của nó.
  • Method Overriding được sử dụng để đạt được tính đa hình trong runtime

Quy tắc của Method Overring

  1. Phương thức phải có cùng tên như trong lớp cha
  2. Phương thức phải có cùng tham số như trong lớp cha.
  3. Phải có mối quan hệ IS-A (kế thừa IS-A).

Vấn đề chúng ta gặp phải thi không có method overriding

Hãy cùng thực hiện ví dụ bên dưới đây để hiểu tại sao chúng ta cần đến Method Overriding trong Java.

/* Chương trình mô phỏng tại sao chúng ta lại cần Method Overriding 
 * Chúng ta sẽ gọi phương thức của class cha với đối tượng con
*/

// Tạo một class cha
class Xe{  
  void run(){
    System.out.println("Xe đang chạy");
  }  
}  
// Tạo một class con 
class XeDap extends Xe{ 
  public static void main(String args[]){
  
    // Tạo một đối tượng của class con
    XeDap obj = new XeDap();
    // Gọi đến phương thức run với đối tượng con
    obj.run();
  }
}

Kết quả:

Xe đang chạy

Vấn đề ở đây là:

  • Xe ô tô đang chạy khác xe đạp đang chạy

Vì thế, chúng ta phải cung cấp một khai triển cụ thể của phương thức run() trong lớp con, đó là lý do tại sao chúng ta sử dụng ghi đè phương thức.

Ví dụ về Method Overriding

Trong ví dụ này, chúng ta đã định nghĩa phương thức run trong lớp con như được định nghĩa trong lớp cha nhưng nó có một số triển khai cụ thể.

Tên và tham số của phương thức là như nhau và có mối quan hệ IS-A giữa các lớp, do đó chúng ta có thể thực hiện ghi đè.

// Chương trình ví dụ về Overriding trong Java
// Tạo một class cha
class Xe{  
  void run(){
    System.out.println("Xe đang chạy");
  }  
}  
// Tạo một class con 
class XeDap extends Xe{
  // Định nghĩa lại phương thức run
  void run(){
    System.out.println("Xe đạp đang chạy");
  } 

  public static void main(String args[]){
  
    // Tạo một đối tượng của class con
    Bike obj = new Bike();
    // Gọi đến phương thuwcss run với đối tượng con
    obj.run();
  }
}

Kết quả:

Xe đạp đang chạy

Ví dụ thực tế về Method Overriding

Giả sử Bank là một lớp cung cấp hàm để lấy được tỷ lệ lãi suất.

Tuy nhiên, lãi suất thay đổi theo ngân hàng. Ví dụ, các ngân hàng MSB, VCB và VIB có lãi suất lần lượt là: 8%, 7% và 9%.

Lưu ý: Method Overriding chủ yếu được sử dụng để đạt được tính đa hình trong runtime mà chúng ta sẽ tìm hiểu trong một số bài tiếp theo.

class Bank{  
  int getRateOfInterest(){
    return 0;
  }  
}
 
// Tạo class con
class MSB extends Bank{
  int layLaiSuat(){
    return 8;
  }
}
class VCB extends Bank{  
  int layLaiSuat(){
    return 7;
  }
}
class VIB extends Bank{  
  int layLaiSuat(){
    return 9;
  }
}

// Thử tạo đối tượng và gọi các phương thức
class Test2{
  public static void main(String args[]){
    
    // Tạo đối tượng
    MSB m = new MSB();
    VCB v = new VCB();
    VIB b = new VIB();
    
    // Gọi phương thức
    System.out.println("Lãi suất MSB: "+m.layLaiSuat());
    System.out.println("Lãi suất VCB: "+v.layLaiSuat());
    System.out.println("Lãi suất VIB: "+b.layLaiSuat());
    
  }  
}  

Kết quả:

Lãi suất MSB: 8
Lãi suất MSB: 7
Lãi suất MSB: 9

FAQ: Các câu hỏi thường gặp

Câu 1: Chúng ta có thể ghi đè phương thức static không?

Không, một phương thức static không thể bị ghi đè. Nó có thể được chứng minh bằng đa hình, vì vậy chúng ta sẽ tìm hiểu nó sau.

Câu 2: Tại sao chúng ta không thể ghi đè phương thức static?

Đó là bởi vì phương thức static được liên kết với lớp trong khi phương thức chúng ta vừa thử ở trên bị ràng buộc với một đối tượng. Static thuộc về class area và một thể hiện thuộc về heap area.

Câu 3: Chúng ta có thể ghi đè phương thức main của java không?

Không, phương thức main là phương thức static

Sự khác biệt giữa Method Overloading và Method Overriding trong Java

Có nhiều khác biệt giữa Metho OverridingMethod Overloading trong Java. Dưới đây là một số điểm khác biệt giữa chúng:

#Method OverloadingMethod Overriding
1)Method overloading được sử dụng để tăng khả năng đọc của chương trìnhMethod overriding được sử dụng để
cung cấp việc triển khai cụ thể phương thức đã được cung cấp bởi lớp cha của nó.
2)Method overloading được thực hiện trong classMethod overriding xảy ra trong hai lớp có mối quan hệ IS-A (kế thừa).
3)Trong Method Overloading, tham số phải khác nhauTrong Method Overriding, tham số phải giống nhau
4)Method overloading là ví dụ về tính đa hình trong thời gian biên dịch
Method overloading là ví dụ về tính đa hình trong runtime
5)Trong java, Method Overloading không thể được thực hiện bằng cách chỉ thay đổi kiểu trả về của phương thức. Kiểu trả về có thể giống hoặc khác nhau trong
Method Overloading. Nhưng bạn phải thay đổi tham số.
Kiểu trả về phải giống nhau hoặc covariant trong Method Overriding.

Bạn đã hiểu về Method Overriding chưa?

Chúng ta vẫn sẽ tìm hiểu tiếp về Method Overriding khi học về Đa hình nên về cơ bản trong bài này chỉ giới thiệu sơ qua để bạn nắm bắt khái niệm cơ bản nhất.

Tham khảo ngay:

Chúc bạn học tốt!

JavaDEV


Bài viết gần đây

Hướng dẫn tải và Cài đặt Java cho Windows 10 (Chi tiết)

Bài viết này mình sẽ hướng dẫn bạn cách tải và cài đặt Java cho Windows 10 để học lập trình Java.

Tìm hiểu về instanceof trong JAVA

Một vài ví dụ đơn giản để bạn hiểu hơn về toán tử instanceof trong Java. Cũng như cách sử dụng instanceof trong thực tế như thế nào.

Static Binding và Dynamic Binding trong Java

Bạn đang tìm hiểu về Binding trong Java? Về cơ bản, việc kết nối một cuộc gọi phương thức...

Tìm hiểu về Đa hình trong JAVA

Đa hình (Polymorphism) trong Java là một khái niệm để chỉ những hành động có thể thực hiện theo nhiều cách khác nhau.

Từ khóa FINAL trong JAVA

Từ khóa final có thể được áp dụng với các biến, một biến final không có giá trị, nó được gọi là biến final trống hoặc biến cuối cùng chưa được khởi tạo.

Khối Khởi tạo thể hiện trong JAVA

Khối khởi tạo thể hiện được sử dụng để khởi tạo các biến thể hiện. Nó chạy mỗi lần khi đối tượng của lớp được tạo.

Leave a reply

Please enter your comment!
Please enter your name here