[Tự học Java] Ghi đè(Overriding) phương thức trong Java » https://final-blade.com

Trong bài hướng dẫn này, tất cả chúng ta sẽ tìm hiểu và khám phá về ghi đè phương pháp trong Java bằng những ví dụ minh họa .

Trong bài hướng dẫn lần trước, chúng ta đã tìm hiểu về tính kế thừa. Tính kế thừa là một thuộc tính của lập trình hướng đối tượng cho phép chúng ta kế thừa một class mới (subclass) từ một class đang tồn tại.

Bây giờ, nếu một phương pháp cùng được định nghĩa trong cả superclass và subclass, thì phương pháp trong subclass sẽ ghi đè lên phương pháp trong superclass. Đây được biết là ghi đè phương pháp ( Method Overriding ) .

1. Ví dụ 1: Ghi đè phương thức trong Java

/**
* Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
*
* @author cafedevn
* Contact: [email protected]
* Fanpage: https://www.facebook.com/cafedevn
* Instagram: https://instagram.com/cafedevn
* Twitter: https://twitter.com/CafedeVn
* Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

class Animal {
   public void displayInfo() {
      System.out.println("I am an animal.");
   }
}

class Dog extends Animal {
   @Override
   public void displayInfo() {
      System.out.println("I am a dog.");
   }
}

class Main {
   public static void main(String[] args) {
      Dog d1 = new Dog();
      d1.displayInfo();
   }
}

Khi chạy chương trình, tác dụng sẽ là :

I am a dog.

Trong chương trình ở trên, phương pháp displayInfo ( ) Open trong cả superclass Animal và subclass Dog .
Khi tất cả chúng ta gọi phương pháp displayInfo ( ) sử dụng đối tượng người tiêu dùng d1 ( đối tượng người dùng của subclass, phương pháp bên trong subclass dog sẽ được gọi. Phương thức displayInfo ( ) của subclass sẽ ghi đè lên phương pháp giống nó trong superclass .

Lưu ý việc sử dụng thẻ @ override trong ví dụ trên. Trong Java, những thẻ annotation là những metadata tất cả chúng ta sử dụng để phân phối thêm thông tin cho trình biên dịch. Ở đây, thẻ @ override chỉ định trình biên dịch rằng phương pháp đằng sau thẻ này sẽ ghi đè phương pháp của superclass .
Không thiết yếu phải sử dụng thẻ @ override, nhưng khi tất cả chúng ta sử dụng nó, phương pháp sẽ tuân thủ tổng thể những pháp luật về ghi đè. Ngược lại, trình biên dịch sẽ gặp lỗi .

2. Các quy định về ghi đè trong Java

Cả superclass và subclass phải có cùng tên phương pháp, cùng kiểu trả về và cùng list tham số .
Chúng ta không hề ghi đè phương pháp được khai báo là final và static .
Chúng ta luôn luôn nên ghi đè những phương pháp trừu tượng của superclass ( sẽ được bàn luận trong những bài hướng dẫn sau ) .
Từ khóa super trong ghi đè phương pháp trong Java
Một câu hỏi thường nổi lên trong khi thực thi việc ghi đè trong Java là :

3. Chúng ta có thể truy cập các phương thức của superclass sau khi ghi đè ko?

Vâng, và câu vấn đáp là có. Để truy vấn phương pháp của superclass từ subclass, tất cả chúng ta sử dụng từ khóa super .
Ví dụ 2 : việc sử dụng từ khóa super

/**
* Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
*
* @author cafedevn
* Contact: [email protected]
* Fanpage: https://www.facebook.com/cafedevn
* Instagram: https://instagram.com/cafedevn
* Twitter: https://twitter.com/CafedeVn
* Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

class Animal {
   public void displayInfo() {
      System.out.println("I am an animal.");
   }
}

class Dog extends Animal {
   public void displayInfo() {
      super.displayInfo();
      System.out.println("I am a dog.");
   }
}

class Main {
   public static void main(String[] args) {
      Dog d1 = new Dog();
      d1.displayInfo();
   }
}

Khi ta chạy chương trình, kết quả sẽ là:

I am an animal.
I am a dog.

Trong ví dụ trên, subclass dog ghi đè lên phương pháp displayInfo ( ) của superclass Animal .
Khi ta gọi phương pháp displayInfo ( ) sử dụng đối tượng người tiêu dùng d1 của subclass dog, phương pháp bên trong subclass Dog được gọi còn phương pháp bên trong superclass không được gọi. Chúng ta đã sử dụng superdisplayInfo ( ) để gọi phương pháp displayInfo ( ) của superclass bên trong phương pháp displayInfo ( ) của subclass Dog .
Điều quan trọng phải quan tâm là những hàm tạo trong Java sẽ không được thừa kế. Do đó, không có gì gọi là ghi đè hàm tạo trong Java cả .
Tuy nhiên, tất cả chúng ta hoàn toàn có thể gọi hàm tạo của superclass từ subclass của nó. Khi đó ta sử dụng super ( ). Để tìm hiểu và khám phá thêm, hãy tìm hiểu thêm từ khóa super trong Java .

4. Access specifier trong ghi đè phương thức

Phương thức cùng được khai báo trong superclass và subclass hoàn toàn có thể có những access specifier khác nhau. Tuy nhiên, điều này cũng có số lượng giới hạn .
Chúng ta chỉ hoàn toàn có thể sử dụng những access specifier trong subclass mà phân phối quyền truy vấn rộng hơn access specifier của superclass. Lấy ví dụ ,
Giả sử, một phương pháp là myClass ( ) trong superclass được khai báo là kiểu protected, thì phương pháp cùng tên trong subclass hoàn toàn có thể là public hoặc protected, nhưng không hề là private .
Ví dụ 3 : Access specifier trong ghi đè phương pháp

/**
* Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
*
* @author cafedevn
* Contact: [email protected]
* Fanpage: https://www.facebook.com/cafedevn
* Instagram: https://instagram.com/cafedevn
* Twitter: https://twitter.com/CafedeVn
* Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

class Animal {
   protected void displayInfo() {
      System.out.println("I am an animal.");
   }
}

class Dog extends Animal {
   public void displayInfo() {
      System.out.println("I am a dog.");
   }
}

class Main {
   public static void main(String[] args) {
      Dog d1 = new Dog();
      d1.displayInfo();
   }
}

Khi chạy chương trình, tác dụng sẽ là :

I am a dog.

Trong ví dụ trên, subclass Dog ghi đè phương pháp displayInfo ( ) của superclass Animal .
Bất cứ khi nào tất cả chúng ta gọi phương pháp displayInfo ( ) sử dụng đối tượng người tiêu dùng d1 ( đối tượng người dùng của subclass ), phương pháp bên trong subclass được gọi .
Lưu ý rằng, phương pháp displayInfo ( ) được khai báo là protected trong superclass animal. Phương thức tựa như lại có access specifier là public trong subclass Dog. Điều này trọn vẹn hoàn toàn có thể chính bới access specifier public cung ứng quyền truy vấn rộng hơn so với access specifier protected .

5. Ghi đè các phương thức trừu tượng

Trong Java, những class trừu tượng được tạo ra để làm superclass cho những class khác. Và nếu một class chứa một phương pháp trừu tượng, việc ghi đè nó là điều bắt buộc .
Chúng ta sẽ khám phá thêm về những class trừu tượng và việc ghi đè những phương pháp trừu tượng trong những bài hướng dẫn sau này .

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!