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 đượ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
- Phương thức phải có cùng tên như trong lớp cha
- Phương thức phải có cùng tham số như trong lớp cha.
- 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
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.
Đó 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.
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 Overriding và Method Overloading trong Java. Dưới đây là một số điểm khác biệt giữa chúng:
# | Method Overloading | Method Overriding |
---|---|---|
1) | Method overloading được sử dụng để tăng khả năng đọc của chương trình | Method 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 class | Method 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 nhau | Trong 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:
- Tự Học Lập trình Java tại nhà
- Hoặc tham gia Khóa học Java ở Hà Nội (Offline)
Chúc bạn học tốt!