2009-12-12 16 views
8
class test 
{ 
    test() 
    { 
     System.out.println("Constructor"); 
    } 

    { 
    System.out.println("Hai"); 
    } 

} 
public class sample 
{ 
    public static void main(String [] a) 
    { 
     test t = new test();   
    } 
} 

उपरोक्त कोड में क्यों है कि ब्रेसिज़ ((i.e) "है") में दिए गए बयान को कंसक्टर निष्पादित करने से पहले मुद्रित किया जाता है।जावा मूल बातें में संदेह?

उत्तर

31

आज्ञा देना एक और अधिक स्पष्ट उदाहरण के साथ व्यक्त:

public class Test { 

    static { 
     System.out.println("static initializer"); 
    } 

    { 
     System.out.println("instance initializer"); 
    } 

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

} 

और यह परीक्षण इस प्रकार है:

public class Main { 

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

} 

उत्पादन:

static initializer 
instance initializer 
constructor 
instance initializer 
constructor 

स्थिर initializers केवल एक बार क्रियान्वित कर रहे हैं रनटाइम के दौरान, विशेष रूप से कक्षा के लोड होने के दौरान। इंस्टेंस प्रारंभकर्ता को कन्स्ट्रक्टर से पहले प्रत्येक तत्कालता के दौरान निष्पादित किया जाता है।

आप उनमें से एक से अधिक हो सकते हैं और कोडिंग में दिखाई देने पर उन्हें आदेश में निष्पादित किया जाएगा।

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

स्थैतिक प्रारंभकर्ताओं का प्रमुख लाभ यह है कि उन्हें कक्षा लोडिंग के दौरान केवल एक बार निष्पादित किया जाता है। एक प्रसिद्ध असली दुनिया उदाहरण जेडीबीसी चालक है। जब आप

Class.forName("com.example.jdbc.Driver"); 

जो केवल static initializers कार्यान्वित करते हैं, तो किसी भी (सभ्य) JDBC ड्राइवर ही DriverManager में के रूप में

static { 
     DriverManager.registerDriver(new com.example.jdbc.Driver()); 
} 

इस तरह DriverManager पा सकते हैं के दौरान सही JDBC ड्राइवर इस प्रकार दर्ज किए जाएंगे getConnection()

5

हां। यह instance initializer है। जैसे ही कक्षा को तुरंत चालू किया जाता है।

+2

तो स्थिर कीवर्ड वैकल्पिक है? – blackanchorage

+0

तो यदि उपरोक्त कोड में एक स्थिर ब्लॉक बनाते हैं, जो पहले स्थिर ब्लॉक या स्थैतिक प्रारंभकर्ता ब्लॉक चलाएगा? .... क्या आप समझा सकते हैं कि स्थैतिक प्रारंभकर्ता क्या है? – Hariharbalaji

+1

यह निश्चित रूप से 'स्थिर 'प्रारंभकर्ता नहीं है। – BalusC

2

एक कक्षा के भीतर तुरंत ब्रेसिज़ एक उदाहरण प्रारंभकर्ता (जावा 1.1 में पेश किया गया) पेश करता है। घोषणापत्र के हिस्से के रूप में लिखे गए फ़ील्ड को असाइन करने के लिए उन्हें कोड के समान ही माना जाता है। तो निम्नलिखित के बराबर हैं:

private final Thing x = new Thing(); 

और

private final Thing x; 
{ 
    x = new Thing(); 
} 

कोड तुरंत एक सुपर निर्माता बुला के बाद निर्माताओं द्वारा निष्पादित किया जाता है। तो, कोई अन्य initialisation संभालने, कोड समतुल्य रूप निर्माता के हिस्से के रूप में लिखा जा सकता:

private final Thing x; 
public MyCLass() { 
    super(); // Often implicit. 
    x = new Thing(); 
} 

ब्रेसिज़ static कीवर्ड और स्थिर initialisers से पहले ही स्थिति, एक बार निष्पादित में जब एक वर्ग initialised है, पर नहीं प्रति उदाहरण आधार।

3

उपरोक्त कोड में ब्रेसिज़ ((i.e) "है") के भीतर दिए गए बयान को कन्स्ट्रक्टर निष्पादित करने से पहले मुद्रित किया जाता है।

क्योंकि यह अपेक्षित व्यवहार Java Language Specification :)

की 12.5 Creation of New Class Instances बस नव बनाई गई वस्तु परिणाम के रूप में दिया जाता है के लिए एक संदर्भ से पहले खंड में वर्णित के रूप में है, संकेत दिया निर्माता है

  1. आर्ग असाइन करें: नई वस्तु प्रारंभ करने में निम्नलिखित प्रक्रिया का उपयोग कर संसाधित इस कन्स्ट्रक्टर आमंत्रण के लिए नव निर्मित पैरामीटर चर के लिए कन्स्ट्रक्टर के लिए स्मारक।
  2. इस निर्माता की एक स्पष्ट निर्माता मंगलाचरण एक ही कक्षा (this का उपयोग) में एक और निर्माता के साथ शुरू होता है, तो तर्कों और प्रक्रिया है कि मंगलाचरण रिकर्सिवली इन ही पांच चरणों का उपयोग निर्माता का मूल्यांकन। यदि वह कन्स्ट्रक्टर आमंत्रण अचानक समाप्त हो जाता है, तो यह प्रक्रिया के लिए एक ही कारण से अचानक समाप्त होती है; अन्यथा, कदम 5.
  3. यह निर्माता (this का प्रयोग करके) एक ही कक्षा में एक और निर्माता की एक स्पष्ट निर्माता मंगलाचरण से शुरू नहीं होता साथ जारी है। इस निर्माता Object के अलावा किसी अन्य वर्ग के लिए है, तो यह निर्माता एक सुपर क्लास निर्माता (super का प्रयोग करके) की एक स्पष्ट या अस्पष्ट मंगलाचरण के साथ शुरू हो जाएगा। तर्कों और प्रक्रियाओं का मूल्यांकन करें जो सुपरक्लास कन्स्ट्रक्टर इनवोकेशन इन पांच चरणों का उपयोग करते हुए पुनरावृत्त करें। यदि कन्स्ट्रक्टर आमंत्रण अचानक समाप्त करता है, तो यह प्रक्रिया उसी कारण के लिए अचानक समाप्त हो जाती है। अन्यथा, कदम 4.
  4. के साथ जारी रखने, इस वर्ग के लिए उदाहरण initializers और उदाहरण चर initializers निष्पादित इसी उदाहरण चर के उदाहरण चर initializers का मान निर्दिष्ट बाएँ से सही क्रम में, जिसमें वे वर्ग के लिए स्रोत कोड में टेक्स्ट रूप से दिखाई देते हैं। यदि में से किसी के निष्पादन के परिणामस्वरूप इन प्रारंभकर्ताओं के परिणामस्वरूप अपवाद होता है, तो प्रारंभकर्ताओं को संसाधित नहीं किया जाता है और यह प्रक्रिया उस के साथ अचानक अपवाद को पूरा करती है। अन्यथा, कदम 5. साथ (कुछ जल्दी कार्यान्वयन में, संकलक गलत तरीके से कोड लोप जारी रखने के एक क्षेत्र प्रारंभ करने में करता है, तो क्षेत्र प्रारंभकर्ता अभिव्यक्ति एक निरंतर अभिव्यक्ति जिसका मूल्य के लिए डिफ़ॉल्ट प्रारंभ मूल्य के बराबर था इसका प्रकार।)
  5. इस कन्स्ट्रक्टर के बाकी हिस्सों का निष्पादन करें। यदि वह निष्पादन अचानक समाप्त हो जाता है, तो यह प्रक्रिया इसी कारण से अचानक समाप्त होती है। अन्यथा, यह प्रक्रिया सामान्य रूप से पूर्ण होती है।पर ... उदाहरण initializers अधिक जानकारी के लिए

देखें अनुभाग 8.6 Instance Initializers

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