Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

มีกี่วิธีในการป้องกันการแทนที่วิธีการใน Java?


การแทนที่วิธีการ ทำงานได้เนื่องจากคุณลักษณะการผูกเมธอดรันไทม์ใน 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