मैं इस सरल प्रश्न से भ्रमित हूं। क्या कोई मान्य उत्तर के साथ मेरी मदद कर सकता है।
public class SuperClass{
public SuperClass(){
// may or may not have a constructor for superclass
}
}
public class SubClass extends SuperClass{
// anything here
public static void main(String args[])
{
SubClass sub=new SubClass();
}
}
अब मेरा सवाल है कि क्या मैं एक वस्तु बना रहा हूं
SubClass
कर देता है यह एक बनाएँ वस्तु काSuperClass
यदि हाँ तो क्यों .. ??
मैं जानता हूं कि ज्यादातर लोग इस सवाल को मूर्खतापूर्ण तरीके से देखते हैं। लेकिन ये मेरे सवाल हैं।
यह सुपरक्लास के निर्माता को बुलाता है तो यदि कोई वस्तु नहीं बनाई जाती है तो यह कैसे करता है?
क्या विस्तार से वर्ग का आकार बढ़ता है? यानी सुपरक्लास + सबक्लास। !!
उत्तर:
उत्तर № 1 के लिए 1अब मेरा सवाल यह है कि अगर मैं SubClass का ऑब्जेक्ट बना रहा हूँ तो क्या यह SuperClass का ऑब्जेक्ट बनाता है यदि हाँ तो क्यों .. ??
नहीं यह नहीं।
जब तुम करोगे
SubClass sub=new SubClass();
केवल SubClass
ऑब्जेक्ट बनाया गया। और केवल निर्माता का सुपर क्लास कॉल। और यह कि सुपर क्लास कंस्ट्रक्टर को कॉल करने से उन तक पहुँच नहीं बनी java.lang.Object
निर्माता।
पक्षीय लेख: नियम का एक अंग (डॉन "नहीं जानता कि यह आधिकारिक है या नहीं," प्रत्येक के साथ नया , केवल एक वस्तु बनाता है)
आप देखें:15.9.4 क्लास इंस्टेंस क्रिएशन एक्सप्रेशन का रन-टाइम मूल्यांकन
नई वस्तु में सभी के नए उदाहरण हैंनिर्दिष्ट वर्ग प्रकार और उसके सभी सुपरक्लेसेस में घोषित क्षेत्र। जैसा कि प्रत्येक नए फ़ील्ड उदाहरण को बनाया जाता है, इसे इसके डिफ़ॉल्ट मान (.54.12.5) से आरंभ किया जाता है।
तो आप इस तरह के निष्कर्ष पर आ सकते हैं class SubClass extends SuperClass
, तब विधियाँ, चर वर्ग की नकल की जाती हैं SubClass
.
संपादित करें:
अगर कोई ऑब्जेक्ट नहीं बनाया जाता है तो एक निर्माता को कैसे बुलाया जा सकता है .. ??
आह ... तुम्हारा शक मेरे लिए समझ में आ रहा है।
परंतु constructor
जावा में बहुत विशेष विधि है। आप एक क्लास फाइल को डिकंपाइल कर सकते हैं, आप कंस्ट्रक्टर्स को उसके नाम पर देख सकते हैं <init>.
आप फोन नहीं कर सकते स्पष्ट रूप से सिवाय कीवर्ड के new
या super
.
उत्तर № 2 के लिए 1
यह एक सरल हां / ना में जवाब देना कठिन है क्योंकि यह आपके द्वारा उपयोग किए जा रहे शब्दों की सटीक परिभाषा पर निर्भर करता है। जब आप कहें
SubClass sub = new SubClass();
यह पैदा करेगा एक ऑब्जेक्ट (कंस्ट्रक्टर बॉडी द्वारा बनाए गए किसी भी अन्य ऑब्जेक्ट की गणना नहीं करना या सदस्य क्षेत्रों की आरंभीकरण)। वस्तु एक है रनटाइम क्लास, कोनसा होगा SubClass
। अगर आप कहते हैं sub.getClass() == SubClass.class
, यह रिटर्न true
। अगर आप कहते हैं sub.getClass() == SuperClass.class
, यह रिटर्न false
। तो उस अर्थ में, उत्तर नहीं है, क्योंकि ऑब्जेक्ट (रनटाइम) वर्ग है SubClass
, नहीं SuperClass
.
हालाँकि, नया SubClass
ऑब्जेक्ट को "उदाहरण" के रूप में भी माना जाता है SuperClass
; अगर आप कहते हैं sub instanceof SuperClass
, यह अभिव्यक्ति है true
। आप भी उपयोग कर सकते हैं sub
कहीं भी SuperClass
की जरूरत है, उदा। यदि आपके पास एक चर है SuperClass s
आप असाइन कर सकते हैं s = sub
, और अगर एक विधि की जरूरत है एक SuperClass
पैरामीटर, आप पास कर सकते हैं sub
यह करने के लिए। OOP में, उत्तराधिकार (extends
जावा में) एक को दर्शाता है एक है संबंध, और इस अर्थ में, ए SubClass
एक है SuperClass
, और इसीलिए sub
भी एक है SuperClass
। लेकिन ध्यान दें कि इसकी रनटाइम क्लास कभी नहीँ परिवर्तन।
SuperClass s = sub;
boolean b1 = (s.getClass() == SuperClass.class); // false
boolean b2 = (s.getClass() == SubClass.class); // true
बेशक, सटीक प्रश्न का उत्तर देने के लिए "क्या यह सुपरक्लास की वस्तु बनाता है", इसका उत्तर हां हो सकता है यदि निर्माणकर्ता दिखता है
public SubClass () {
this.myParent = new SuperClass();
}
अब निर्माणकर्ता एक वस्तु बनाता है SubClass
और की एक अलग वस्तु SuperClass
। लेकिन मुझे यकीन है कि आपका मतलब नहीं है। :)
संपादित करें: आपके द्वारा बाद में जोड़े गए प्रश्नों को संबोधित करने के लिए:
यह सुपरक्लास के निर्माता को बुलाता है तो यदि कोई वस्तु नहीं बनाई जाती है तो यह कैसे करता है?
The SubClass
ऑब्जेक्ट में सदस्य क्षेत्र शामिल हैं जो घोषित किए गए हैं SuperClass
, प्लस सदस्य क्षेत्रों के लिए घोषित SubClass
. (प्लस सदस्य क्षेत्रों के लिए घोषित Object
और बीच में किसी भी अन्य सुपरक्लास.) लेकिन यह "अभी भी सिर्फ एक उन सभी क्षेत्रों युक्त वस्तु है ।के SubClass
कंस्ट्रक्टर कॉल करता है SuperClass
कंस्ट्रक्टर, जो (शायद) के लिए घोषित क्षेत्रों को शुरू करता है SuperClass
; तब SubClass
कंस्ट्रक्टर के लिए घोषित क्षेत्रों को शुरू कर सकते हैं SubClass
.
क्या विस्तार वर्ग के आकार में वृद्धि करता है? यानी सुपरक्लास SubClass.!!
यदि नए सदस्य क्षेत्रों में घोषित कर रहे है SubClass
, तो हां, एक SubClass
संभवतः अधिक स्मृति का उपयोग करता है, क्योंकि यह सभी क्षेत्रों में घोषित किया गया है SuperClass
साथ ही सभी क्षेत्रों में घोषित SubClass
.
जवाब के लिए 0 № 3
आपका प्रश्न थोड़ा भ्रामक है। - आप सुपरक्लास ऑब्जेक्ट नहीं बनाते क्योंकि एकमात्र निर्मित ऑब्जेक्ट एक उपवर्ग वस्तु है।- एक अन्य परिप्रेक्ष्य में, हां, आप सुपरक्लास ऑब्जेक्ट बनाते हैं क्योंकि एक सबक्लास ऑब्जेक्ट सुपरक्लास ऑब्जेक्ट है।दूसरे शब्दों में, "सुपरक्लास ओजे = नई उपवर्ग ();" पूरी तरह से मान्य है - सुपरक्लास "एस कंस्ट्रक्टर कहा जाता है
जवाब के लिए 0 № 4
नहीं, यह सुपरक्लास ऑब्जेक्ट नहीं बनाता है । हालांकि यह सुपरक्लास से विरासत में मिलता है, यह अपने कंस्ट्रक्टर और intialisation ब्लॉकों (यदि कोई हो) चलाता है, और यह भी अपने राज्य और व्यवहार हो जाता है ।