Không. Khi ghi đè phương thức của lớp cha, bạn phải đảm bảo cả hai phương thức có:
- Cùng tên phương thức
- Cùng tham số (parameter types và thứ tự)
- Cùng kiểu trả về (return type)
Nếu thay đổi chữ ký (signature), hai phương thức sẽ được coi là hai phương thức khác nhau (overloading), không phải overriding.
Ví dụ minh họa
class Super {
void sample(int a, int b) {
System.out.println("Method of the Super class");
}
}
public class MethodOverriding extends Super {
// Thay đổi tham số: int b -> float b -> Đây là OVERLOADING, không phải OVERRIDING
void sample(int a, float b) {
System.out.println("Method of the Sub class");
}
public static void main(String args[]) {
MethodOverriding obj = new MethodOverriding();
obj.sample(20, 20); // Gọi phương thức của Super class vì 20 là int
}
}
Kết quả
Method of the Super class
Giải thích: Vì chữ ký phương thức khác nhau (int, int vs int, float), Java coi đây là overloading. Khi gọi obj.sample(20, 20), cả hai tham số đều là int, nên phương thức của lớp cha được gọi.
Quy tắc ghi nhớ
- Override: Cùng tên, cùng tham số, cùng return type (hoặc covariant return type từ Java 5).
- Overload: Cùng tên, khác tham số.
- Access modifier của phương thức con phải >= phương thức cha (public > protected > default > private).
- Exception ném ra của phương thức con phải <= phương thức cha.