Khi khai báo một method ở class con mà có sẵn ở class cha được gọi là method overriding. Overriding cho phép các class con tự đưa ra cách triển khai riêng cho một method đã được class cha cung cấp sẵn.
Lấy ví dụ, chúng ta class 2 class Person và Boy, Person là class cha, và Boy là class con. Person có sẵn method eat(), class Boy không muốn sử dụng method eat() của class cha mà muốn tự định nghĩa riêng cho mình method eat().
// File Person.java public class Person { void eat() { System.out.println("Person is eating"); } }
// File Boy.java public class Boy { void eat() { System.out.println("Boy is eating"); } }
// File Main.java public class Main { public static void main(String[] args) { Boy boy = new Boy(); boy.eat(); } }
Output: Boy is eating
Method overriding là một tính năng khá hữu ích, vì trong thực tế sẽ có rất nhiều trường hợp class con cần các implement riêng cho các method có sẵn ở class cha. Những trường hợp này các method ở class cha có ý nghĩa như là một khuôn mẫu để các class con dựa theo đó làm, và mỗi class con sẽ có cách thực hiện khác nhau.
Method Overriding và Dynamic Method Dispatch
Method overriding là ví dụ của đa hình runtime. Khi class cha tham chiếu đến object của class con, method sẽ được xác định tại runtime. Nghĩa là nếu chúng ta gọi đến method có sẵn ở class cha và được class con định nghĩa lại thì trình biên dịch sẽ gọi method của class con.
// File Main.java public class Main { public static void main(String[] args) { // class cha khong tham chieu den object class con Person person = new Person(); person.eat(); // Cha cha tham chieu den object class con Person boy = new Boy(); boy.eat(); } }
Output:
Person is eating
Boy is eating
Ở ví dụ trên khi chúng ta khai báo
Person boy = new Boy()
Class cha tham chiếu đến object class con, tại thời điểm chạy chương trình, trình biên dịch sẽ kiểm tra và nó sẽ gọi đến method eat() của Boy class.
Giả sử như chúng ta có thêm class Girl thừa kế Person
// File Girl.java public class Girl extends Person { void eat() { System.out.println("Girl is eating"); } }
// File Main.java public class Main { public static void main(String[] args) { // class cha không tham chiếu đến object class con Person person = new Person(); person.eat(); // Cha cha tham chieu den object class con Boy Person boy = new Boy(); boy.eat(); // Cha cha tham chieu den object class con Girl Person girl = new Girl(); girl.eat(); } }
Output:
Boy is eating
Girl is eating
Khi thêm class Girl và nó cũng override lại method eat() như trên thì method overriding vẫn diễn ra.
Như vậy chúng ta thấy chúng ta chỉ cần nắm class Cha là kiểu dữ liệu và khai báo tham chiếu đến object của class con. Điều này sẽ giúp chúng ta dễ dàng quản lý dữ liệu hơn.
Tại thời điểm chạy chương trình, trình biên dịch sẽ dựa vào object mà class cha tham chiếu đến mà có các hành động tương ứng được gọi là Dynamic Method Dispatch. Như ví dụ trên chúng ta có 2 biến boy và girl đều có kiểu dữ kiễu là Person, nhưng boy tham chiếu đến Boy, girl tham chiếu đến Girl. Lúc thực thi nó đã gọi đến method eat tương ứng cho từng class con, chúng ta không cần phải kiểm tra object đang tham chiếu đến class nào nữa rồi.
Nguồn tham khảo
https://www.javatpoint.com/method-overriding-in-java
Method overriding in java with example