การแทนที่วิธีการ ทำงานได้เนื่องจากคุณลักษณะการผูกเมธอดรันไทม์ใน Java ดังนั้น หากเราบังคับให้คอมไพเลอร์จาวาทำการโยงแบบคงที่สำหรับเมธอด เราก็สามารถป้องกันไม่ให้เมธอดนั้นถูกแทนที่ในคลาสที่ได้รับ
เราสามารถป้องกันการ Override ของ Java ได้ 3 วิธี
- โดยการทำ method ขั้นสุดท้ายใน base class
- โดยการทำให้วิธีการคงที่ในคลาสพื้นฐาน
- โดยการทำให้เมธอดส่วนตัวในคลาสฐาน
วิธีสุดท้ายไม่สามารถแทนที่ได้
เรากำลังเพิ่มข้อจำกัดที่คลาสที่ได้รับมาไม่สามารถแทนที่เมธอดนี้โดยเฉพาะได้
ตัวอย่าง
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(); } }
ผลลัพธ์
Base class test() method Derived class show() method
วิธีการแบบคงที่ไม่สามารถแทนที่ได้
เราไม่สามารถแทนที่เมธอดสแตติกในคลาสที่ได้รับ เนื่องจากเมธอดสแตติกเชื่อมโยงกับคลาส ไม่ใช่กับอ็อบเจ็กต์ หมายความว่าเมื่อเราเรียกใช้เมธอดแบบสแตติก JVM จะไม่ส่งการอ้างอิงนี้ไปยังเมธอดแบบคงที่ทั้งหมด ดังนั้นจึงไม่สามารถรวมรันไทม์สำหรับเมธอดแบบคงที่ได้
ตัวอย่าง
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(); } }
ผลลัพธ์
Base class test() method Derived class show() method
วิธีการส่วนตัวไม่สามารถแทนที่ได้
เมธอดส่วนตัวของคลาสพื้นฐานไม่สามารถมองเห็นได้ในคลาสที่ได้รับ ดังนั้นจึงไม่สามารถแทนที่ได้
ตัวอย่าง
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(); } }
ผลลัพธ์
Derived class show() method