विधि अधिभावी जावा में रन-टाइम मेथड बाइंडिंग फीचर के कारण काम करता है। इसलिए, अगर हम जावा कंपाइलर को किसी मेथड के लिए स्टैटिक बाइंडिंग करने के लिए बाध्य करते हैं तो हम उस मेथड को व्युत्पन्न क्लास में ओवरराइड होने से रोक सकते हैं।
हम जावा में मेथड ओवरराइडिंग को 3 तरीकों से रोक सकते हैं
- आधार वर्ग में अंतिम विधि बनाकर
- आधार वर्ग में एक विधि को स्थिर बनाकर
- आधार वर्ग में एक विधि को निजी बनाकर
अंतिम विधियों को ओवरराइड नहीं किया जा सकता
एक विधि को अंतिम बनाकर हम एक प्रतिबंध जोड़ रहे हैं कि व्युत्पन्न वर्ग इस विशेष विधि को ओवरराइड नहीं कर सकता है।
उदाहरण
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