Ghi đè phương thức hoạt động nhờ tính năng ràng buộc phương thức thời gian chạy trong Java. Vì vậy, nếu chúng ta buộc trình biên dịch java thực hiện liên kết tĩnh cho một phương thức thì chúng ta có thể ngăn phương thức đó bị ghi đè trong một lớp dẫn xuất.
Chúng ta có thể ngăn ghi đè phương thức trong Java theo 3 cách
- Bằng cách đặt phương thức cuối cùng trong lớp cơ sở
- Bằng cách đặt một phương thức tĩnh trong lớp cơ sở
- Bằng cách đặt một phương thức ở chế độ riêng tư trong lớp cơ sở
Không thể ghi đè các phương thức cuối cùng
Bằng cách tạo một phương thức cuối cùng, chúng tôi đang thêm một hạn chế rằng lớp dẫn xuất không thể ghi đè phương thức cụ thể này.
Ví dụ
class Base { public void show() { System.out.println("Base class show() method"); } public final void test() { System.out.println("Base class test() method"); } } class Derived extends Base { public void show() { System.out.println("Derived class show() method"); } // can not override test() method because its final in Base class /* * public void test() { System.out.println("Derived class test() method"); } */ } public class Test { public static void main(String[] args) { Base ref = new Derived(); // Calling the final method test() ref.test(); // Calling the overridden method show() ref.show(); } }
Đầu ra
Base class test() method Derived class show() method
Không thể ghi đè các phương thức tĩnh
Chúng ta không thể ghi đè các phương thức tĩnh trong một lớp dẫn xuất bởi vì các phương thức tĩnh được liên kết với lớp chứ không phải với đối tượng. Nó có nghĩa là khi chúng ta gọi một phương thức tĩnh thì JVM không chuyển tham chiếu này đến nó như đối với tất cả các phương thức không tĩnh. Do đó, ràng buộc thời gian chạy không thể diễn ra đối với các phương thức tĩnh.
Ví dụ
class Base { public void show() { System.out.println("Base class show() method"); } public static void test() { System.out.println("Base class test() method"); } } class Derived extends Base { public void show() { System.out.println("Derived class show() method"); } // This is not an overridden method, this will be considered as new method in Derived class public static void test() { System.out.println("Derived class test() method"); } } public class Test { public static void main(String[] args) { Base ref = new Derived(); // It will call the Base class's test() because it had static binding ref.test(); // Calling the overridden method show() ref.show(); } }
Đầu ra
Base class test() method Derived class show() method
Không thể ghi đè các phương thức riêng tư
Các phương thức riêng của lớp cơ sở không hiển thị trong lớp dẫn xuất, do đó chúng không thể bị ghi đè.
Ví dụ
class Base { public void show() { System.out.println("Base class show() method"); } private void test() { System.out.println("Base class test() method"); } } class Derived extends Base { public void show() { System.out.println("Derived class show() method"); } // This is not an overridden method, this will be considered as other method. public void test() { System.out.println("Derived class test() method"); } } public class Test { public static void main(String[] args) { Base ref = new Derived(); // Cannot call the private method test(), this line will give compile time error // ref.test(); // Calling the overridden method show() ref.show(); } }
Đầu ra
Derived class show() method