मेथड ओवरराइडिंग जावा में रन-टाइम मेथड बाइंडिंग फीचर के कारण काम करती है। इसलिए, यदि हम जावा कंपाइलर को किसी मेथड के लिए स्टैटिक बाइंडिंग करने के लिए मजबूर करते हैं तो हम उस मेथड को डेराइव्ड क्लास में ओवरराइड होने से रोक सकते हैं।
हम Java में मेथड ओवरराइडिंग को 3 तरीकों से रोक सकते हैं:
- बेस क्लास में मेथड को final बनाकर
- बेस क्लास में मेथड को static बनाकर
- बेस क्लास में मेथड को private बनाकर
Final मेथड्स को ओवरराइड नहीं किया जा सकता
किसी मेथड को final बनाकर हम एक प्रतिबंध जोड़ रहे हैं कि डेराइव्ड क्लास इस विशेष मेथड को ओवरराइड नहीं कर सकती।
उदाहरण
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");
}
// test() मेथड को ओवरराइड नहीं कर सकते क्योंकि यह Base क्लास में final है
/*
public void test() {
System.out.println("Derived class test() method");
}
*/
}
public class Test {
public static void main(String[] args) {
Base ref = new Derived();
// Final मेथड test() को कॉल करना
ref.test();
// ओवरराइडेड मेथड show() को कॉल करना
ref.show();
}
}
आउटपुट
Base class test() method Derived class show() method
Static मेथड्स को ओवरराइड नहीं किया जा सकता
हम डेराइव्ड क्लास में static मेथड्स को ओवरराइड नहीं कर सकते क्योंकि static मेथड्स क्लास से जुड़े होते हैं, ऑब्जेक्ट से नहीं। इसका मतलब है कि जब हम static मेथड को कॉल करते हैं तो JVM इसे this रेफरेंस पास नहीं करता जैसा कि यह सभी नॉन-स्टैटिक मेथड्स के लिए करता है। इसलिए static मेथड्स के लिए रन-टाइम बाइंडिंग नहीं हो सकती।
उदाहरण
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");
}
// यह ओवरराइडेड मेथड नहीं है, इसे Derived क्लास में नया मेथड माना जाएगा
public static void test() {
System.out.println("Derived class test() method");
}
}
public class Test {
public static void main(String[] args) {
Base ref = new Derived();
// यह Base क्लास के test() को कॉल करेगा क्योंकि इसमें स्टैटिक बाइंडिंग थी
ref.test();
// ओवरराइडेड मेथड show() को कॉल करना
ref.show();
}
}
आउटपुट
Base class test() method Derived class show() method
Private मेथड्स को ओवरराइड नहीं किया जा सकता
बेस क्लास के प्राइवेट मेथड्स डेराइव्ड क्लास में विजिबल नहीं होते, इसलिए उन्हें ओवरराइड नहीं किया जा सकता।
उदाहरण
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");
}
// यह ओवरराइडेड मेथड नहीं है, इसे अन्य मेथड माना जाएगा।
public void test() {
System.out.println("Derived class test() method");
}
}
public class Test {
public static void main(String[] args) {
Base ref = new Derived();
// प्राइवेट मेथड test() को कॉल नहीं कर सकते, यह लाइन कंपाइल टाइम एरर देगी
// ref.test();
// ओवरराइडेड मेथड show() को कॉल करना
ref.show();
}
}
आउटपुट
Derived class show() method