Trong lập trình hướng đối tượng, ghi đè là một kỹ thuật cho phép các đối tượng con ghi đè lại phương thức của đối tượng cha mà chúng kế thừa. Điều này cho phép chúng ta định nghĩa lại cách hoạt động của một phương thức và tùy chỉnh nó cho nhu cầu của đối tượng con. Trong bài viết này, chúng ta sẽ tìm hiểu về ghi đè trong Java và cách sử dụng nó.
Ghi đè phương thức trong Java
Khi một lớp con kế thừa từ lớp cha, nó có thể ghi đè lại một hoặc nhiều phương thức được định nghĩa trong lớp cha. Để ghi đè (Overriding) một phương thức trong Java, chúng ta cần định nghĩa lại phương thức đó trong lớp con với cùng tên, cùng tham số và cùng kiểu trả về như phương thức cha.
Ví dụ về ghi đè phương thức trong Java
class Animal {
public void makeSound() {
System.out.println("The animal makes a sound");
}
}
class Dog extends Animal {
public void makeSound() {
System.out.println("The dog barks");
}
}
Trong ví dụ trên, lớp Dog
kế thừa từ lớp Animal
và ghi đè lại phương thức makeSound()
. Khi chúng ta gọi phương thức makeSound()
trên đối tượng Dog
, nó sẽ in ra chuỗi "The dog barks"
thay vì chuỗi "The animal makes a sound"
.
Quy tắc của ghi đè trong Java
Khi ghi đè một phương thức trong Java, chúng ta cần tuân thủ một số quy tắc sau:
- Tên phương thức, tham số và kiểu trả về của phương thức ghi đè phải giống với phương thức cha.
- Phương thức ghi đè không được có phạm vi truy cập thấp hơn phương thức cha (ví dụ: phương thức cha là public, thì phương thức ghi đè cũng phải là public).
- Phương thức ghi đè không được có kiểu trả về khác với kiểu trả về của phương thức cha, trừ khi kiểu trả về của phương thức cha là kiểu đối tượng và kiểu trả về của phương thức ghi đè là kiểu con của kiểu đối tượng đó.
- Phương thức ghi đè không được ném ra các ngoại lệ (exception) mới hoặc các ngoại lệ không được quản lý (unchecked exception) mà không được khai báo trong phần khai báo ngoại lệ (throws clause) của phương thức cha.
Ví dụ về quy tắc của ghi đè trong Java
class Animal {
public void makeSound() throws Exception {
System.out.println("The animal makes a sound");
}
}
class Dog extends Animal {
public void makeSound() throws ArithmeticException {
System.out.println("The dog barks");
}
}
Trong ví dụ trên, phương thức makeSound()
của lớp Dog
ghi đè phương thức makeSound()
của lớp Animal
. Tuy nhiên, lớp Dog
không tuân thủ quy tắc của ghi đè trong Java khi ném ra một ngoại lệ (ArithmeticException
) không được khai báo trong phần khai báo ngoại lệ của phương thức cha (Animal
). Điều này sẽ dẫn đến lỗi biên dịch.
Sử dụng super để gọi phương thức của lớp cha
Trong một phương thức ghi đè, chúng ta có thể sử dụng từ khóa super
để gọi phương thức của lớp cha. Điều này cho phép chúng ta giữ lại các tính năng của phương thức cha và chỉ thay đổi những phần mà chúng ta muốn ghi đè.
Ví dụ về sử dụng super để gọi phương thức của lớp cha
class Animal {
public void makeSound() {
System.out.println("The animal makes a sound");
}
}
class Dog extends Animal {
public void makeSound() {
super.makeSound();
System.out.println("The dog barks");
}
}
Trong ví dụ trên, phương thức makeSound()
của lớp Dog
sử dụng từ khóa super
để gọi phương thức makeSound()
của lớp Animal
. Sau đó, nó in ra chuỗi "The dog barks"
. Khi chúng ta gọi phương thức makeSound()
trên đối tượng Dog
, nó sẽ in ra hai chuỗi "The animal makes a sound"
và "The dog barks"
.
Kết luận
Ghi đè là một kỹ thuật quan trọng trong lập trình hướng đối tượng, cho phép chúng ta tùy chỉnh lại cách hoạt động của một phương thức trong lớp con. Trong bài viết này, chúng ta đã tìm hiểu về cách ghi đè trong Java và quy tắc cần tuân thủ khi sử dụng nó. Chúng ta cũng đã tìm hiểu về việc sử dụng từ khóa super
để gọi phương thức của lớp cha trong một phương thức ghi đè. Hy vọng bài viết này sẽ giúp bạn hiểu thêm về ghi đè trong Java và cách sử dụng nó trong các dự án của mình.