Override (ghi đè phương thức) và Overload (Nạp chồng phương thức) là hai khái niệm cơ bản trong Java mà bất kì người nào khi mới bắt đầu với lập trình cũng cần phân biệt. Vậy chúng là gì và khác nhau thế nào? Hãy cùng CodeGym Hà Nội phân tích và tìm hiểu trong bài viết này nhé!
> Đọc thêm: Khóa học lập trình Java
Nội dung
Override (ghi đè phương thức) là gì?
Override là một tính năng cho phép một lớp con cung cấp một triển khai cụ thể của phương thức đã được cung cấp bởi một trong các lớp cha của nó. Nói một cách khác, ghi đè phương thức là nếu lớp con có một hoặc nhiều phương thức giống với một trong các lớp cha của nó.
Để thu được tính đa hình tại runtime, ta dùng ghi đè phương thức (override).
Các quy định về ghi đè trong Java
- Danh sách tham số phải trùng nhau, kiểu giá trị trả về phải tương thích.
- Phương thức đè không được giảm quyền truy nhập so với phiên bản của lớp cha.
- Nói cách khác, quyền truy nhập mà phiên bản của lớp con cho phép phải bằng hoặc rộng hơn phiên bản của lớp cha. Ta không thể cài đè một phương thức public bằng một phiên bản private. Nếu không, tình huống xảy ra là một lời gọi phương thức đã được trình biên dịch chấp nhận vì tưởng là phương thức public nhưng đến khi nó chạy lại bị máy ảo từ chối vì phiên bản được gọi lại là private.
- Phải là quan hệ IS-A (kế thừa).
- Các phương thức final, static, private không thể cài đè.
Ví dụ thực tế về override (ghi đè phương thức) trong Java
class Person { public void seeCockroaches() { } } class Women extends Person { @Override public void seeCockroaches() { System.out.println("Woman see cockroaches: Screaming and run away"); } } class Man extends Person { @Override public void seeCockroaches() { System.out.println("Man see cockroaches: Beat the cockroaches"); } } class Test { public static void main(String[] args) { Person man = new Man(); Person women = new Women(); man.seeCockroaches(); women.seeCockroaches(); } } |
Kết quả sau khi chạy chương trình trên là:
Man see cockroaches: Beat the cockroaches Woman see cockroaches: Scream and run away |
Overload (nạp chồng phương thức) là gì?
Nạp chồng phương thức là có vài phương thức trùng tên nhưng khác nhau về đối số trong cùng 1 lớp. Nạp chồng phương thức cho phép ta tạo nhiều phiên bản của một phương thức, mỗi phiên bản chấp nhận một danh sách đối số khác nhau, nhằm tạo thuận lợi cho việc gọi phương thức.
Để thu được tinh đa hình tại compile time, ta dùng nạp chồng phương thức (overload).
Các quy tắc nạp chồng
- Các phương thức overloaded phải cùng tên nhưng khác nhau ở các tham số.
- Chúng có thể được định nghĩa cùng hoặc khác kiểu dữ liệu trả về.
- Chúng có thể được định nghĩa cùng hoặc khác access modifier.
- Các phương thức chỉ khác nhau ở kiểu dữ liệu trả về hoặc access modifier thì không được gọi là overloaded .
Ví dụ thực tế về overload (nạp chồng phương thức) trong Java
public class Bird { public String fly(String scream) { return "Birds fly away"; } public String fly(String scream, String location) { return "Birds fly away"; } public void fly(String cream, String location, int distance) { System.out.println("Birds fly away"); } public static void main(String[] args) { Bird bird = new Bird(); System.out.println(bird.fly("AAA")); System.out.println(bird.fly("AAA", "riverside")); bird.fly("AAA", "riverside", 2); } } |
Kết quả sau khi chạy chương trình trên là:
Birds fly away Birds fly away Birds fly away |
Phân biệt giữa overload và override
Override | Overload | |
Hành vi | Thay đổi hành vi hiện tại của phương thức. | Thêm hoặc mở rộng cho hành vi của phương thức. |
Đa hình | Thể hiện tính đa hình tại run time. | Thể hiện tính đa hình tại compile time. |
Danh sách tham số | Danh sách tham số phải giống nhau. | Danh sách tham số có thể khác nhau. |
Quyền truy cập | Phương thức ghi đè ở lớp con phải có quyền truy cập bằng hoặc lớn hơn phương thức được ghi đè ở lớp cha. | Phương thức nạp chồng có thể có quyền truy cập khác nhau. |
Giá trị trả về | Giá trị trả về bắt buộc phải có kiểu giống nhau. | Giá trị trả về có thể có kiểu khác nhau. |
Phạm vi | Xảy ra giữa 2 lớp có quan hệ kế thừa | Xảy ra trong phạm vi cùng 1 lớp. |
Tổng kết
Bài viết trên đây đã giới thiệu về Override, Overload và sự khác biệt giữa chúng, hi vọng sẽ giúp ích ít nhiều cho các bạn đọc bài viết này. Hãy đón đọc những bài viết và tìm hiểu thêm về các ngôn ngữ lập trình khác qua các khóa học lập trình tại CodeGym Hà Nội bạn nhé!
0 Lời bình