Nội dung bài viết
Lê Minh Trung Bài viết trình bày về kỹ thuật ghi đè hàm trong java.

Giới thiệu

Cùng với nạp chồng phương thức (Overloading method), ghi đè phương thức (Overriding method) là một kỹ thuật rất thú vị được java hỗ trợ. Bài viết này sẽ trình bày cho các bạn về kỹ thuật Overriding method trong java.

Tiền đề bài viết

Bài viết nằm trong chuỗi bài viết về ngôn ngữ java của STDIO.

Đối tượng hướng đến

Bài viết hướng đến những độc giả có mối quan tâm tới ngôn ngữ lập trình java.

Override

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

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

Đặc điểm:

  • 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.
  • Một 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 18, ở đây, ta khởi tạo 1 tham chiếu kiểu CBird là obj 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.

Một số lưu ý

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

Một 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 17, ta tạo một biến tham chiếu obj kiểu CAnimal tham chiếu tới một đối tượng kiểu CElephant và dùng obj gọi phương thức doSomething() tại dòng 18. Nếu theo lý thuyết logic về override thì kết quả phải là Elephant. Tuy nhiên, ở đây, chúng ta nhận được 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. Đó 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

Tôi sẽ trình bày sự khác nhau cơ bản giữa overload và override thông qua bảng sau:

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.

THẢO LUẬN
ĐÓNG