2010-11-03 22 views
68

मैं वर्तमान में अपने जावा पाठ्यक्रम में कक्षा विरासत के बारे में सीख रहा हूं और मुझे समझ में नहीं आता कि super() कॉल का उपयोग कब करें?मैं सुपर() का उपयोग कब करूं?

संपादित करें:

class A 
{ 
    int k = 10; 
} 

class Test extends A 
{ 
    public void m() { 
     System.out.println(super.k); 
    } 
} 

तो मैं समझता हूँ कि यहाँ, आप सुपर क्लास में k चर का उपयोग करने के super का उपयोग करना चाहिए:
मैं कहाँ super.variable प्रयोग किया जाता है कोड के इस उदाहरण मिल गया। हालांकि, किसी अन्य मामले में, super(); क्या करता है? अपने दम पर?

+29

असल में, इस उदाहरण में 'सुपर' को संदर्भित करने की आवश्यकता नहीं है। 'के' को सीधे संदर्भित किया जा सकता है। 'सुपर' को केवल 'एके' तक पहुंचने की आवश्यकता होगी यदि आपने 'टेस्ट' (' test.k') में 'k' नामक एक और फ़ील्ड घोषित किया है)। –

उत्तर

126

कॉलिंग बिल्कुलsuper()हमेशा अनावश्यक है। यह स्पष्ट रूप से कर रहा है जो अन्यथा पूर्ण रूप से किया जाएगा। ऐसा इसलिए है क्योंकि यदि आप सुपर कन्स्ट्रक्टर को कॉल छोड़ देते हैं, तो बिना किसी तर्क के सुपर कन्स्ट्रक्टर को स्वचालित रूप से लागू किया जाएगा। यह नहीं कहना कि यह खराब शैली है; कुछ लोग स्पष्ट होने की तरह हैं।

हालांकि, जहां यह उपयोगी हो जाता है, जब सुपर कन्स्ट्रक्टर तर्क देता है कि आप सबक्लास से गुजरना चाहते हैं।

public class Animal { 
    private final String noise; 
    protected Animal(String noise) { 
     this.noise = noise; 
    } 

    public void makeNoise() { 
     System.out.println(noise); 
    } 
} 

public class Pig extends Animal { 
    public Pig() { 
     super("Oink"); 
    } 
} 
+2

मान लीजिए कि एक चाइल्ड क्लास में एक विधि ओवरराइड हो जाती है और फिर अपने बच्चे वर्ग में फिर से भर जाती है। (बहुस्तरीय विरासत) क्या होगा यदि हमें दादाजी और माता-पिता के साथ-साथ पोते-पोते वर्ग में एक विधि को कॉल करना होगा। सुपर का इस्तेमाल कैसे किया जाएगा? – h8pathak

+0

@ h8pathak: यदि आप पूछ रहे हैं कि कैसे एक बाल वर्ग अपने माता-पिता के कार्यान्वयन को बाईपास कर सकता है लेकिन दादाजी को कॉल करें, यह जावा में संभव नहीं है। –

1

आप इसे सुपरक्लास की विधि (जैसे कि जब आप इस तरह की विधि ओवरराइड कर रहे हैं, super.foo() इत्यादि को कॉल करने के लिए इसका उपयोग कर सकते हैं - यह आपको उस कार्यक्षमता को रखने और इसे और भी जोड़ने के लिए अनुमति देगा ओवरडिन विधि में है।

0

सुपरक्लास के निर्माता को यह सुनिश्चित करने के लिए आपके उप-वर्ग 'कन्स्ट्रक्टर की पहली पंक्ति super() पर कॉल होना चाहिए।

+0

सच नहीं है। यह स्वचालित रूप से हो जाएगा। –

+0

भले ही कोई डिफ़ॉल्ट कन्स्ट्रक्टर न हो? यह कैसे पता चलेगा कि क्या पास करना है? – robev

+0

यदि कोई डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है, तो आपको 'सुपर (कुछ तर्क)' कॉल करने की आवश्यकता है, न कि 'सुपर() '। लेकिन मुद्दा यह है कि, "जरूरी" गलत है। सुपर क्लास के रचनाकारों में से एक ** गारंटीकृत ** है जिसे कक्षा संकलन के रूप में लंबे समय तक बुलाया जाता है। –

9

जब आप सुपर क्लास कन्स्ट्रक्टर को कॉल करना चाहते हैं - इसके भीतर के फ़ील्ड को प्रारंभ करने के लिए। जब इसका इस्तेमाल करने की समझ के लिए यह लेख पर एक नज़र डालें:

http://download.oracle.com/javase/tutorial/java/IandI/super.html

+4

जैसा कि यह लिंक में कहता है, आपने कभी * सुपर() 'को कॉल करने के लिए * नहीं किया है, क्योंकि जावा इसे स्पष्ट रूप से जोड़ देगा। लेकिन अगर आपको गैर-डिफ़ॉल्ट अभिभावक कन्स्ट्रक्टर की आवश्यकता है तो आपको 'सुपर (तर्क)' कॉल करना होगा। –

8

आप इसे एक उपवर्ग निर्माता की पहली पंक्ति के रूप में प्रयोग करेंगे अपनी मूल वर्ग के निर्माता कॉल करने के लिए।

उदाहरण के लिए:

public class TheSuper{ 
    public TheSuper(){ 
     eatCake(); 
    } 
} 

public class TheSub extends TheSuper{ 
    public TheSub(){ 
     super(); 
     eatMoreCake(); 
    } 
} 

निर्माण TheSub का एक उदाहरण कहेंगे विशेष रूप से अपने सुपर क्लास के एक निर्माता को चलाने के लिए दोनों eatCake() और eatMoreCake()

1

आप super() कहते हैं। यह देखते हुए कि एक वर्ग में कई कन्स्ट्रक्टर हो सकते हैं, आप या तो super() या super(param,param) का उपयोग करके एक विशिष्ट कन्स्ट्रक्टर को कॉल कर सकते हैं, जबकि आप जावा को हैंडल कर सकते हैं और मानक कन्स्ट्रक्टर को कॉल कर सकते हैं। याद रखें कि कक्षा पदानुक्रम का पालन करने वाले वर्ग "आइस-ए" रिश्ते का पालन करते हैं।

39

super का उपयोग constructor, methods और properties अभिभावक वर्ग के कॉल करने के लिए किया जाता है।

18

तुम भी उप वर्ग में super कीवर्ड का उपयोग कर सकते हैं जब आप माता-पिता वर्ग से एक विधि को लागू करने के लिए जब आप उपवर्ग में यह अधिरोहित है चाहता हूँ।

उदाहरण:

public class CellPhone { 
    public void print() { 
     System.out.println("I'm a cellphone"); 
    } 
} 

public class TouchPhone extends CellPhone { 
    @Override 
    public void print() { 
     super.print(); 
     System.out.println("I'm a touch screen cellphone"); 
    } 
    public static void main (strings[] args) { 
     TouchPhone p = new TouchPhone(); 
     p.print(); 
    } 
} 

यहाँ, लाइन super.print() सुपर क्लास CellPhone की print() विधि invokes। उत्पादन होगा:

I'm a cellphone 
I'm a touch screen cellphone 
+0

क्या यह आपकी मुख्य विधि घोषणा रेखा में (स्ट्रिंग [] तर्क) था? आपका बहुत बहुत धन्यवाद! –

0

ओरेकल प्रलेखन page से: अपने विधि अपने सुपर क्लास के तरीकों में से एक को ओवरराइड करता है

हैं, तो आप कीवर्ड super के उपयोग के माध्यम ओवरराइड विधि आह्वान कर सकते हैं।

आप छुपे हुए फ़ील्ड को संदर्भित करने के लिए super का भी उपयोग कर सकते हैं (हालांकि छिपाने वाले फ़ील्ड को हतोत्साहित किया जाता है)। उपवर्गों के निर्माता में super की

उपयोग:

एक सुपर क्लास निर्माता की

प्रार्थना किए उपवर्ग निर्माता में पहली पंक्ति होना चाहिए।

super(parameter list); 
super() साथ

, सुपर क्लास कोई तर्क निर्माता कहा जाता है:

एक सुपर क्लास निर्माता फोन करने के लिए वाक्य रचना

super(); 

या है। super(parameter list) के साथ, मिलान पैरामीटर सूची वाले सुपरक्लास कन्स्ट्रक्टर को कॉल किया जाता है।

नोट: एक निर्माता स्पष्ट रूप से एक सुपर क्लास निर्माता आह्वान नहीं करता हैं, जावा स्वचालित रूप से सुपर क्लास का कोई तर्क निर्माता के लिए एक कॉल डाल देता है। यदि सुपर क्लास में कोई तर्क-तर्क कन्स्ट्रक्टर नहीं है, तो आपको संकलन-समय त्रुटि मिल जाएगी।

संबंधित पोस्ट:

Polymorphism vs Overriding vs Overloading

0

मैं सिर्फ यह कोशिश की, सुपर टिप्पणी(); @ मार्क पीटर्स ने टिप्पणी के बिना यह वही काम किया है

package javaapplication6; 

/** 
* 
* @author sborusu 
*/ 
public class Super_Test { 
    Super_Test(){ 
     System.out.println("This is super class, no object is created"); 
    } 
} 
class Super_sub extends Super_Test{ 
    Super_sub(){ 
     super(); 
     System.out.println("This is sub class, object is created"); 
    } 
    public static void main(String args[]){ 
     new Super_sub(); 
    } 
} 
संबंधित मुद्दे