2012-01-25 33 views
6

जब हम जावा में किसी विशेष वर्ग को तुरंत चालू करते हैं तो सुपरक्लास का एक उदाहरण बनाया जाता है। यदि ऐसा है तो सभी सुपर वर्गों को तुरंत चालू करने के लिए बहुत अधिक उपरांत होगा। मैं निम्नलिखित कोड की कोशिश की:क्या हम ऑब्जेक्ट को तुरंत चालू करते समय सुपरक्लास का उदाहरण बनाते हैं?

public class AClass { 
    public AClass() { 
     System.out.println("Constructor A"); 
    } 
} 

public class BClass extends AClass{ 
    public BClass(){ 
     System.out.println("Constructor B"); 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
     BClass b = new BClass(); 
    } 
} 

कोड के उत्पादन में है:

Constructor A 

Constructor B 

तो, इसका मतलब यह है कि सुपर-क्लास की वस्तुओं की पूरी पदानुक्रम बनाया हो जाता है जब हम एक वर्ग का दृष्टांत?

उत्तर

8

एक एकल ऑब्जेक्ट बनाया गया है - लेकिन वह ऑब्जेक्ट सुपरक्लास और सबक्लास (और java.lang.Object दोनों) का एक उदाहरण है। तीन अलग-अलग वस्तुएं नहीं हैं। फ़ील्ड के एक सेट के साथ एक वस्तु है (मूल रूप से पदानुक्रम को ऊपर और नीचे घोषित सभी क्षेत्रों का संघ) और एक ऑब्जेक्ट हेडर।

कंस्ट्रक्टर्स नीचे से ऊपर तक वंशानुगत पदानुक्रम क्रियान्वित कर रहे हैं - लेकिन this संदर्भ उन निर्माताओं की सभी के लिए समान हो जाएगा; वे सभी एक ही वस्तु के प्रारंभ में योगदान दे रहे हैं।

+0

मैंने हमेशा सोचा (गलत तरीके से) कि एक अलग सबक्लास और एक अलग सुपरक्लास ऑब्जेक्ट्स उप-वर्ग की वस्तु बनाने पर बनाए जाते हैं। – abc

+0

और इस तरह यह पाइथन में भी काम करता है या उस मामले के लिए सी ++ (मुझे विश्वास है, मैंने इसे आजमाया नहीं है)। सही ? – abc

2

हां, यह वर्ग विरासत का पूरा बिंदु है।

आप दो ऑब्जेक्ट्स को तुरंत चालू नहीं कर रहे हैं, हालांकि: आप एक ऑब्जेक्ट को तुरंत चालू कर रहे हैं, और AClass और फिर BClass कन्स्ट्रक्टर दोनों चला रहे हैं। AClass कन्स्ट्रक्टर AClass से विरासत में प्राप्त भागों को प्रारंभ करने के लिए ज़िम्मेदार है, और BClass कन्स्ट्रक्टर BClass में परिभाषित अतिरिक्त चीज़ों को प्रारंभ करने के लिए ज़िम्मेदार है।

+0

मैंने हमेशा सोचा (गलत तरीके से) कि एक उप-वर्ग के ऑब्जेक्ट को बनाने पर एक अलग सबक्लास और एक अलग सुपरक्लास ऑब्जेक्ट बनाए जाते हैं। छिपी हुई रेखा "सुपर()" को स्पष्ट रूप से बताते हुए – abc

2

हां।

public BClass() 
{ 
    super(); // hidden line, added by compiler 
    System.out.println("Constructor B"); 
} 

आप डिफ़ॉल्ट निर्माता का उपयोग नहीं करना चाहते हैं, तो आप इस तरह कर सकते हैं::

public BClass() 
{ 
    super (parameters); // now you will use different constructor from AClass 
         // compiler will not add here call to "super()" 
    System.out.println("Constructor B"); 
} 

ओरेकल साइट से: एक निर्माता हैं

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

+0

+1। जब मैंने जावा में कोडिंग शुरू की तो यह मेरे लिए भ्रम का मुद्दा था। –

संबंधित मुद्दे

 संबंधित मुद्दे