Search…

Ghi Đè Phương Thức - Overriding Method trong Java

19/09/20204 min read
Trong Java, ghi đè phương thức - overriding method là phương pháp "viết lại" cách thức hoạt động của 1 phương thức của lớp dẫn xuất.

Override là gì?

Khái niệm và đặc điểm

Override là hiện tượng 1 phương thức thuộc lớp cha được định nghĩa lại ở lớp con.

  • Phương thức override và được override phải có chung kiểu trả về, tên phương thức và danh sách tham số.
  • Override chỉ xảy ra giữa các lớp có quan hệ kế thừa.
  • 1 phương thức ở lớp cha được override ở lớp con thì phương thức override ở lớp con không được phép thu hẹp tầm vực của phương thức đó ở lớp cha.
  • Phương thức ở lớp cha được override ở lớp con thì phương thức override ở lớp con không được phép phát sinh những ngoại lệ kiểm tra (checked exception) khác loại hoặc không có quan hệ kế thừa với các ngoại lệ được ném ra từ phương thức đó ở lớp cha.
  • Sử dụng từ khóa super để gọi phương thức được override ở lớp cha tại phương thức override ở lớp con.

Ví dụ:

package Overriding_Method;

class CBird {
	public void getInformation(){
		System.out.print("has 2 legs, can fly");
	}
}
public class CParrot extends CBird { // overriding getInformation() method of CBird public void getInformation(){ System.out.println("Parrot"); // using super keyword to call getInformation() of CBird super.getInformation(); } public static void main(String [] args){ CBird obj = new CParrot(); obj.getInformation(); } }

Kết quả:

Parrot has 2 legs, can fly

Kết luận:

Quan sát dòng CBird obj = new CParrot(), khởi tạo 1 tham chiếu kiểu CBirdobj tham chiếu tới 1 đối tượng CParrot. Khác với kỹ thuật overloading method, với overriding method, phương thức được máy ảo Java quyết định gọi tại quá trình runtime dựa trên kiểu của đối tượng mà tham chiếu đó tham chiếu tới.

1 số lưu ý

Trong Java, khi sử dụng override cần lưu ý 1 số trường hợp như sau:

1 phương thức final hoặc static không thể được override, đặc biệt chú ý với phương thức static, quan sát ví dụ sau đây:

package Overriding_Method;

class CAnimal{
	public static void doSomething(){
		System.out.print("Animal");
	}
}

class CElephant extends CAnimal{
	public static void doSomething(){
		System.out.print("Elephant");
	}
}

public class Redefining_Method {
	public static void main(String [] args){
		CAnimal obj = new CElephant();
		obj.doSomething();
	}
}

Kết quả:

Animal

Nhận xét:

Tại dòng CAnimal obj = new CElephant(), tạo 1 biến tham chiếu obj kiểu CAnimal tham chiếu tới 1 đối tượng kiểu CElephant và dùng obj gọi phương thức doSomething(). Theo lý thuyết về override thì kết quả phải là Elephant. Tuy nhiên kết quả là Animal. Điều đó chứng tỏ phương thức được gọi là phương thức của lớp cha, trong khi, đối tượng được tham chiếu obj tham chiếu tới là 1 đối tượng thuộc lớp con (CElephant). Như vậy, phương thức doSomething() không phải là override mà là hiện tượng redefine trong Java.

Có thể​ nói, redefine là hiện tượng nằm giữa overload và override. Bởi lẽ, nó mang đặc điểm của cả 2 hiện tượng trên:

  • Tên hàm, kiểu trả về và danh sách tham số là giống nhau.
  • Việc lựa chọn phương thức được gọi diễn ra ở quá trình compile và dựa trên kiểu dữ liệu của tham chiếu thay vì kiểu dữ liệu của đối tượng tham chiếu đó tham chiếu tới.

So sánh Overloading method và Overriding method

OVERLOADING METHOD OVERRIDING METHOD
Kiểu trả về của các phương thức overload có thể giống nhau hoặc khác nhau. Số lượng tham số hoặc kiểu dữ liệu của tham số ở các hàm overload phải khác nhau. Kiểu trả về, tên, danh sách tham số của phương thức override và phương thức được override phải giống nhau.
Có thể mở rộng hoặc thu hẹp phạm vi của phương thức được overload. Không thể thu hẹp phạm vi của phương thức được override.
Cho phép tạo ra những ngoại lệ hoàn toàn mới so với những ngoại lệ từ phương thức được overload. Không cho phép tạo ra những ngoại lệ khác loại hoặc không phải đối tượng thuộc lớp con của lớp có thể hiện là ngoại lệ từ phương thức được override.
Phương thức overload được gọi do trình biên dịch quyết định dựa trên kiểu dữ liệu của biến tham chiếu tại quá trình biên dịch. Phương thức override được gọi do máy ảo Java quyết định dựa trên kiểu dữ liệu của đối tượng được tham chiếu tới tại quá trình runtime.
IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024