2013-06-08 10 views
20

बस इस तरह के संकलन कोड के कारण के बारे में सोच:एक इंस्टेंस प्रारंभकर्ता और कन्स्ट्रक्टर के बीच क्या अंतर है?

class MyClass extends AnotherClass { 
    { 
    MySecondClass object = new MySecondClass(); 
    object.doSomething(); 
    } 
} 

क्या इस कोड और निर्माता में कोड के बीच अंतर? यह कोड ऑब्जेक्ट सृजन से पहले निष्पादित करता है।

+0

मैं इस बारे में थोड़ी देर के लिए सोच रहा था, मुझे याद है कि यह कुछ समय पहले देखा गया था ... किसी को पता है कि इस संरचना को क्या कहा जाता है? – SimonT

+1

इसे "प्रारंभकर्ता ब्लॉक" कहा जाता है। यह वास्तव में बस हर कन्स्ट्रक्टर में कॉपी किया गया है। – wchargin

+1

यह प्रश्न डुप्लिकेट प्रश्न हो सकता है: http://stackoverflow.com/questions/16128076/instance-initialization-block-and-subclasses –

उत्तर

22

किसी भी नाम के साथ ब्रेसिज़ के अंदर कोड कक्षा के निर्माता का हिस्सा होगा और कक्षा निर्माता में निहित तर्क से पहले निष्पादित किया जाएगा।

त्वरित उदाहरण:

public class Foo { 
    { 
     System.out.println("Before Foo()"); 
    } 

    public Foo() { 
     System.out.println("Inside Foo()"); 
    } 

    { 
     System.out.println("Not After Foo()"); 
    } 
} 
+5

यह प्रत्येक कन्स्ट्रक्टर से पहले चला जाता है। ('javap -c' आपको बताएगा।) – millimoose

+0

@millimoose सच, उत्तर तय किया गया। उदाहरण के लिए –

+1

+1। – Maroun

3

यह वह जगह है एक उदाहरण प्रारंभ ब्लॉक कि निर्माता से पहले चलाता है और अगर आप से पूछना क्यों एक चाहता हूँ निर्माता के स्थान पर यह प्रयोग करेंगे? जवाब नहीं है, आप नहीं करते हैं।

बस इस तरह कोड संकलन के कारण के बारे में सोच:

आप आम तौर पर इसका इस्तेमाल आम कोड को अलग करने के लिए जब निर्माता अधिक भार का उपयोग कर। तो, "उपरोक्त वास्तव में ओवरलोडेड कन्स्ट्रक्टरों में से एक को संदर्भित करता है जिसे ऑब्जेक्ट इंस्टेंटेशन पर के बाद सामान्य इंस्टेंस प्रारंभिक कोड ब्लॉक निष्पादित किया गया है।

वैसे, आप कभी-कभी एक कन्स्ट्रक्टर को दूसरे से कॉल करके प्राप्त कर सकते हैं लेकिन कॉल को कॉलिंग कन्स्ट्रक्टर के अंदर पहली पंक्ति पर होना चाहिए या कोड संकलित नहीं होगा।

+0

नहीं, ज़ाहिर है कि मैं इसे कन्स्ट्रक्टर के बजाय इस्तेमाल करने की योजना नहीं बना रहा था। यह सिर्फ एक सादा हित था, और कुछ नहीं। और कन्स्ट्रक्टर ओवरलोडिंग के स्पष्टीकरण के लिए धन्यवाद। – Oldestkon

+1

आपका स्वागत है। आप शायद यह पहले ही जानते होंगे। स्थिर इनिट ब्लॉक भी हैं जिनका उपयोग स्थिर वर्ग के सदस्यों को शुरू करने के लिए किया जाता है। और, आपके कोड में दिखाई देने वाले क्रम में एकाधिक ब्लॉक निष्पादित होते हैं। –

+0

मैं मूल रूप से मूल बातें जानता हूं, फिलहाल मैं बहु-थ्रेडिंग की "गहराई" सीख रहा हूं, जैसे अस्थिर वार्स, या सिंक्रनाइज़ ब्लॉक। – Oldestkon

12

इसे इंस्टेंस प्रारंभकर्ता कहा जाता है। प्रारंभकर्ता में कोड के बाद सुपर क्लास कन्स्ट्रक्टर और पर कॉल शेष कन्स्ट्रक्टर कोड से पहले डाला गया है।

किसी भी कन्स्ट्रक्टर का पहला ऑपरेशन एक सुपर क्लास कन्स्ट्रक्टर का आह्वान करना है। यदि एक निर्माता को स्पष्ट रूप से कहा जाता है, super(...), निर्दिष्ट कन्स्ट्रक्टर का उपयोग किया जाता है। यदि कोई कन्स्ट्रक्टर स्पष्ट रूप से लागू नहीं किया गया है, तो सुपर क्लास में डिफ़ॉल्ट कन्स्ट्रक्टर (बिना तर्क के) का आह्वान किया जाता है। यदि ऐसा कोई कन्स्ट्रक्टर मौजूद नहीं है, तो यह एक संकलित समय त्रुटि है।

इस स्पष्ट या निहित रचनाकार आमंत्रण के बाद, उदाहरण प्रारंभकर्ताओं को स्रोत कोड में दिखाई देने के क्रम में बुलाया जाता है (हां, आपके पास एक से अधिक प्रारंभकर्ता हो सकते हैं)।

समझाने के लिए, इस कार्यक्रम चलाने प्रिंट

 
Another constructor 
Init 1 
Init 2 
Test constructor 
class Another { 
    Another() { System.out.println("Another constructor"); } 
} 

class Test extends Another { 

    public static void main(String[] args) { new Test(); } 

    { System.out.println("Init 1"); } 

    Test() { System.out.println("Test constructor"); } 

    { System.out.println("Init 2"); } 

} 

सबसे अधिक देखा आवेदन initalization "double brace initialization" idiom, जहां एक गुमनाम आंतरिक वर्ग परिभाषित किया गया है में है, और एक उदाहरण बनाया है और एक ही बार में कॉन्फ़िगर किया गया है।

JButton popupButton = new JButton(new AbstractAction("Popup") { 
    { 
    putValue(Action.SHORT_DESCRIPTION, "Popup a dialog"); 
    } 

    @Override 
    public void actionPerformed(ActionEvent evt) 
    { 
    popup(); 
    } 
}); 

यह यदि आप कई निर्माताओं है, और हर निर्माता में कुछ पैरामीटर कम प्रारंभ करने की आवश्यकता उपयोगी हो सकता है: यहाँ स्विंग प्रोग्रामिंग से एक बहुत ही आम उदाहरण है। इसे प्रारंभिक ब्लॉक में लगाया जा सकता है।

+0

यह उत्तर उस क्रम को बहुत समझाता है जिसमें उदाहरण प्रारंभकर्ता और रचनाकार कहा जाता है। धन्यवाद! –

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

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