super
कीवर्ड का उपयोग अन्य विधियों को संदर्भित करने के लिए न करें जो ओवरराइड नहीं हैं। यह आपके वर्गों को बढ़ाने की कोशिश कर रहे अन्य डेवलपर्स के लिए भ्रमित करता है।
चलिए कुछ कोड देखें जो इस तरह से super
कीवर्ड का उपयोग करें। Dog
और CleverDog
: यहाँ हम 2 वर्ग
/* file Dog.java */
public static class Dog extends Animal {
private String name;
public Dog(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
/* file CleverDog.java */
public class CleverDog extends Dog {
public CleverDog(String name) {
super(name);
}
public void rollover() {
System.out.println(super.getName()+" rolls over!");
}
public void speak() {
System.out.println(super.getName() + " speaks!");
}
}
अब
, कल्पना करें कि आप इस परियोजना पर एक नया डेवलपर हैं, और आप एक चतुर कुत्ता जो टीवी पर है के लिए कुछ विशिष्ट व्यवहार की जरूरत है: कि कुत्ते सब करना है इसकी चाल है, लेकिन अपने कल्पित टीवी नाम से जाना चाहिए। इसे पूरा करने के आप getName(...)
विधि ओवरराइड ...
/* file DogOnTv.java */
public class DogOnTv extends CleverDog {
String fictionalName;
public DogOnTv(String realName, String fictionalName) {
super(realName);
fictionalName = fictionalName;
}
public String getName() {
return fictionalName;
}
}
... और एक जाल मूल निर्माता और super
कीवर्ड के अपने असामान्य उपयोग द्वारा निर्धारित में गिर जाते हैं!
ऊपर कोड काम करने के लिए नहीं जा रहा है - क्योंकि मूल CleverDog
कार्यान्वयन में, getName()
super
कीवर्ड का उपयोग शुरू हो जाती है। इसका मतलब है कि यह हमेशा Dog.getName()
का आह्वान करता है - किसी भी ओवरराइडिंग के अप्रासंगिक। नतीजतन, जब आप अपने नए DogOnTv
प्रकार का उपयोग करें ...
System.out.println("Showcasing the Clever Dog!");
CleverDog showDog = new CleverDog("TugBoat");
showDog.rollover();
showDog.speak();
System.out.println("And now the Dog on TV!");
DogOnTv dogOnTv = new DogOnTv("Pal", "Lassie");
dogOnTv.rollover();
... आप गलत आउटपुट प्राप्त:
Showcasing the Clever Dog!
Tugboat rolls over!
Tugboat speaks!
And now the Dog on TV!
Pal rolls over!
Pal speaks!
यह सामान्य अपेक्षित व्यवहार है जब आप एक विधि पर हावी नहीं है, तो आप super
कीवर्ड का उपयोग करके इस तरह के भ्रम पैदा करने से बचना चाहिए जहां यह संबंधित नहीं है।
, अगर, हालांकि, यह वास्तव में व्यवहार आप चाहते है बजाय final
कीवर्ड का उपयोग - स्पष्ट रूप से संकेत मिलता है कि विधि ओवरराइड नहीं किया जा सकता है:
/* file CleverDog.java */
public class CleverDog extends Dog {
public CleverDog(String name) {
super(name);
}
public final String getName() { // final so it can't be overridden
return super.getName();
}
public void rollover() {
System.out.println(this.getName()+" rolls over!"); // no `super` keyword
}
public void speak() {
System.out.println(this.getName() + " speaks!"); // no `super` keyword
}
}
अच्छा स्थान (यह सिर्फ एक उदाहरण मैंने लिखा था प्रश्न के हिस्से के रूप में)। सदस्यों को अब अद्यतन और निजी पर सेट। – Jonny