दिलचस्प पोस्ट
रनटाइम पर सामान्य प्रकार का वर्ग प्राप्त करें पायथन – ई-मेल हैडर डीकोडिंग यूटीएफ -8 पायथन में खाली सूची बनाना Web.xml में सर्वलेट यूआरएल मैपिंग कैसे उपयोग की जाती हैं? नियमित अभिव्यक्ति का उपयोग करने के लिए या नहीं? कैनवास गुणों को आइटम्स कॉंट्रॉल डाटाटाप्लेट में सेट करना Google ऐप इंजन पर जावा बनाम पायथन का चयन करना सीएसएस का उपयोग कर खाली इनपुट बॉक्स का मिलान करना ट्विटर बूटस्ट्रैप सूचना संदेश बंद करें और फिर से खोलें कैसे अजाक्स लोडेड सामग्री पर घटनाओं बाध्य करने के लिए? textarea के लिए val () बनाम टेक्स्ट () UIWebView से एम्बेडेड YouTube वीडियो प्लेबैक से NSNotifications कैसे प्राप्त करें क्या यह एक html फ़ॉर्म के अंदर एक और एचटीएमएल फार्म के लिए मान्य है? सूची <T> पर कैसे पुनरावृत्त करें और JSF Facelets में प्रत्येक आइटम को प्रस्तुत करें मैं Stemming या Lemmatization शब्द कैसे करूं?

स्थिर चर कब प्रारंभ किए जाते हैं?

मैं सोच रहा हूँ जब स्थिर चर उनके मूलभूत मूल्यों के लिए आरंभीकृत हो जाते हैं। क्या यह सही है कि जब कोई वर्ग लोड होता है, स्थिर वार्स बनाया जाता है (आवंटित), तो स्थिर प्रारंभिक और घोषणाओं में प्रारंभिक निष्पादित होते हैं? किस बिंदु पर डिफ़ॉल्ट मान दिए जाते हैं? यह आगे संदर्भ की समस्या की ओर जाता है।

इसके अलावा कृपया अगर आप इस सवाल के संदर्भ में यह बता सकते हैं कि क्यों समय पर स्थैतिक क्षेत्रों का आरंभ नहीं किया गया है? और विशेष रूप से उसी साइट पर केविन ब्रॉक द्वारा दिए गए उत्तर मैं तीसरे बिंदु को नहीं समझ सकता

वेब के समाधान से एकत्रित समाधान "स्थिर चर कब प्रारंभ किए जाते हैं?"

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

इंस्टेंस और क्लास (स्थिर) वैरिएबल स्वचालित रूप से मानक डिफ़ॉल्ट मानों पर आरंभ कर दिए जाते हैं यदि आप जानबूझकर उन्हें इनिशियलाइज़ करने में विफल होते हैं। हालांकि स्थानीय चर स्वचालित रूप से प्रारंभ नहीं किए जाते हैं, आप एक प्रोग्राम को संकलित नहीं कर सकते हैं जो या तो स्थानीय चर को प्रारंभ करने में विफल रहता है या उस स्थानीय वैरिएबल का उपयोग करने से पहले कोई मूल्य निर्दिष्ट करता है।

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

आंतरिक कक्षाओं के मामले में, वे स्थिर फ़ील्ड नहीं कर सकते हैं

एक आंतरिक वर्ग एक नीडिंत वर्ग है जिसे स्पष्ट रूप से या अस्पष्ट रूप से घोषित नहीं किया गया है। आंतरिक कक्षाएं स्थिर प्रारंभिक (§8.7) या सदस्य इंटरफेस घोषित नहीं हो सकती हैं। आंतरिक वर्ग स्थिर सदस्यों को घोषित नहीं कर सकते हैं, जब तक कि वे कंपाइल-टाइम स्थिर फ़ील्ड न हों "

जेएलएस 8.1.3 इनर क्लासेस देखें और इंस्टॉलेशन बंद करें

जावा में final क्षेत्रों को उनके घोषणा स्थान से अलग से प्रारंभ किया जा सकता है, हालांकि यह static final क्षेत्रों पर लागू नहीं हो सकता है। नीचे दिए गए उदाहरण देखें

 final class Demo { private final int x; private static final int z; //must be initialized here. static { z = 10; //It can be initialized here. } public Demo(int x) { this.x=x; //This is possible. //z=15; compiler-error - can not assign a value to a final variable z } } 

इसका कारण यह है कि प्रकार के साथ जुड़े static चर की एक प्रति है, उदाहरण के रूप में प्रत्येक प्रकार के उदाहरण के साथ जुड़े किसी के बजाय, और अगर हम निर्माता के भीतर प्रकार के static final z को प्रारंभ करने का प्रयास करते हैं, तो यह static final प्रकार फ़ील्ड z क्योंकि कन्स्ट्रक्टर उस श्रेणी के प्रत्येक त्वरण पर चलाया जाता है जो स्थिर final क्षेत्रों में नहीं होना चाहिए।

देख:

  • जेएलएस 8.7, स्थिर प्रारंभकर्ता
  • जेएलएस 12.2, क्लासेस और इंटरफेस का लोडिंग
  • जेएलएस 12.4, क्लासेस और इंटरफेस का आरंभ

विशेष रूप से अंतिम विशेष रूप से प्रारंभिक चरण प्रदान करता है जो स्थैतिक चर को आरम्भ करने के बाद वर्तनी करते हैं, और किस क्रम में (चेतावनी के साथ कि संकलन-समय स्थिरांक के final वर्ग चर और इंटरफ़ेस फ़ील्ड्स पहले इनिशियलाइज़ किए जाते हैं।)

मुझे यकीन नहीं है कि बिंदु 3 के बारे में आपका विशिष्ट प्रश्न क्या है (यह मानते हुए कि नेस्टेड एक क्या है?) है विस्तृत अनुक्रम बताता है कि यह रिकर्सिव आरंभीकरण अनुरोध होगा क्योंकि यह आरंभीकरण जारी रखेगा।

आरम्भिकरण का क्रम है:

  1. स्थैतिक आरंभीकरण ब्लॉक
  2. इंस्टेंस आरंभीकरण ब्लॉक्स
  3. कंस्ट्रक्टर्स

इस प्रक्रिया का विवरण जेवीएम विनिर्देश दस्तावेज में समझाया गया है।

क्लास लोडर द्वारा क्लास भरी हुई है जब स्टेटिक फ़ील्ड आरंभीकृत हो जाती हैं। इस समय डिफ़ॉल्ट मान को असाइन किया गया है यह स्रोत कोड में दिखाई देने के बजाय यह क्रम में किया जाता है

स्थैतिक चर

  • यह एक ऐसा चर है जो कक्षा से संबंधित है और ऑब्जेक्ट के लिए नहीं (उदाहरण)
  • निष्पादन की शुरुआत में (जब क्लासलोडर पहली बार वर्ग को लोड करता है) स्थैतिक चर केवल एक बार प्रारंभ किया जाता है
  • ये वैरिएबल किसी भी इंस्टेंस व्हेरिएबल के आरम्भिकरण से पहले, आरंभीकरण किया जाएगा
  • क्लास के सभी उदाहरणों से साझा करने के लिए एक एकल कॉपी
  • एक स्थिर चर वर्ग के नाम से सीधे पहुंचा जा सकता है और किसी भी ऑब्जेक्ट की आवश्यकता नहीं है

दूसरे प्रश्न से कोड के साथ शुरू:

 class MyClass { private static MyClass myClass = new MyClass(); private static final Object obj = new Object(); public MyClass() { System.out.println(obj); // will print null once } } 

इस वर्ग का एक संदर्भ प्रारंभ होगा। सबसे पहले, कक्षा को प्रारंभिक रूप में चिह्नित किया जाएगा। फिर प्रथम स्थैतिक फ़ील्ड को MyClass () के एक नए उदाहरण के साथ आरंभ किया जाएगा। ध्यान दें कि myClass को तुरंत रिक्त MyClass इंस्टेंस के संदर्भ दिया गया है स्थान है, लेकिन सभी मान शून्य हैं कन्स्ट्रक्टर अब निष्पादित और obj प्रिंट करता है, जो शून्य है।

अब कक्षा को इनिशियलाइज़ करने के लिए: obj को एक नया असली ऑब्जेक्ट के संदर्भ में बनाया गया है, और हमने किया है

अगर इस तरह से एक बयान से बंद किया गया था: MyClass mc = new MyClass(); एक नया MyClass इंस्टेंस के लिए स्थान दोबारा आवंटित किया गया है (और mc में रखा गया संदर्भ)। कन्स्ट्रक्टर फिर से निष्पादित होता है और फिर obj प्रिंट करता है, जो अब रिक्त नहीं है।

असली चाल यहां यह है कि जब आप new उपयोग करते हैं, तो WhatEverItIs weii = new WhatEverItIs( p1, p2 ); weii को तत्काल रिक्त स्मृति के एक संदर्भ के लिए संदर्भ दिया गया है JVM तब मूल्यों को इनिशियलाइज़ करने के लिए और कन्स्ट्रक्टर को चलाएगा। लेकिन यदि आप किसी भी तरह से संदर्भित करने से पहले ही ऐसा करते हैं – उदाहरण के लिए, किसी दूसरे धागे से या क्लास आरंभीकरण से संदर्भित करके – आप शून्य आवृत्तियों से भरा एक क्लास उदाहरण देख रहे हैं।

स्थिर वैरिएबल निम्नलिखित तीन तरीकों में intialize हो सकता है जैसा कि आप को पसंद करते हैं किसी एक का चयन करें

  1. आप घोषणा के समय इसे इटियल कर सकते हैं
  2. या आप स्थैतिक ब्लॉक बनाकर ऐसा कर सकते हैं उदा: *

    स्थिर {// आरम्भिकरण के लिए जो भी कोड आवश्यक है वह यहां जाता है}

*

  1. स्थिर ब्लॉकों का एक विकल्प है – आप एक निजी स्थिर विधि लिख सकते हैं

 class name { public static varType myVar = initializeVar(); private static varType initializeVar() { // initialization code goes here } }