Overloading:
Dịch ra tiếng Việt nghĩa theo nghĩa chuyên ngành là quá tải lên cái đã có (nghe buồn cười quá). Thật vậy, trong OOP (Object-Oriented Programming) chúng ta có thể khai báo các phương thức (hàm) có cùng tên nhưng khác nhau về kiểu của các đối số (arguments), kiểu trả về của phương thức và cả số lượng đối số của phương thức.
Một ví dụ minh họa như sau:
Giả sử chúng ta có một lớp định nghĩa phương thức Cộng:
public class Demo {
public int Cong(int x, int y) {
return x + y;
}
public string Cong(string s1, string s2) {
return s1.Concat(s2);
}
}
Hai phương thức Cong định nghĩa trong cùng lớp là đặc điểm khác biệt thứ hai giữa Overloading và Overriding.
Overriding:
Nếu tách hai từ này ra thì hiểu nghĩa rõ ràng hơn. Dịch sát theo tiếng Việt là che phủ lên cái đã có (nghe lạ lạ nữa). Trong OOP, các phương thức được gọi là overriding nếu chúng có cùng đối số (cả về kiểu lẫn số lượng) nhưng được định nghĩa ở các lớp khác nhau. Cụ thể: một phương thức định nghĩa ở lớp cơ sở (base class) và phương thức kia định nghĩa ở lớp dẫn xuất (derived class).
Chúng ta xem xét ví dụ sau:
class Animal{
public void move(){
System.out.println("Animals can move");
}
}
class Dog extends Animal{
public void move(){
super.move(); // invokes the super class method
System.out.println("Dogs can walk and run");
}
}
public class TestDog{
public static void main(String args[]){
Animal b = new Dog(); // Animal reference but Dog object
b.move();//Runs the method in Dog class
}
}
Một số quy tắc sử dụng phương thức overriding:
- Danh sách đối số nên giống hoàn toàn với phương thức được overriden.
- Kiểu trả về nên giống (hoặc là kiểu con) với kiểu trả về của phương thức được overriden được mô tả trong lớp cơ sở.
- Mức độ truy cập bị hạn chế hơn nhiều so với phương thức được overriden ở lớp cơ sở.
- Các phương thức instance chỉ có thể overriden nếu chúng kế thừa từ lớp cơ sở.
- Các phương thức được mô tả final (trong java) không được overriden.
- Các phương thức được mô tả static thì không overriden nhưng được mô tả lại.
- Các phương thức không kế thừa sẽ không được overriden (hiển nhiên)
- Trong một lớp dẫn xuất nằm cùng gói với lớp cơ sở của các thể hiện (instance), chúng ta có thể override tất cả các phương thức của lớp cha mà không được khai báo final hoặc private.
- Đối với các lớp dẫn xuất nằm khác gói với lớp cơ sở, chỉ có thể override các phương thức không phải final được khai báo là public hoặc protected.
- Các hàm tạo không thể overriden.
Một số bài báo thảo luận rằng chúng ta có thể hiểu overloading là static (easy binding) polymorphism và overriding là dynamic (late binding) polymorphism.