2010-12-03 11 views
24

स्थैतिक चर लोड, रनटाइम या संकलन समय कब होता है? क्या कोई इसे समझा सकता है।जब जावा, रनटाइम या संकलन समय में स्थिर स्थिर चर होता है?

मैं वास्तव में सहायता की सराहना करता हूं।

धन्यवाद।

उत्तर

12

वे रनटाइम पर लोड होते हैं।

स्टेटिक का अर्थ है: वेरिएबल वर्ग के हैं, न कि कक्षा के उदाहरणों के लिए। इसलिए प्रत्येक स्थैतिक चर का केवल एक मान है, और यदि आपके पास कक्षा के एन उदाहरण हैं तो एन मान नहीं।

+0

तो पल आप निष्पादन योग्य शुरू करते हैं, यदि आपके पास एकाधिक कक्षाएं हैं, तो उनके सभी स्थैतिक चर ढेर पर लोड हो जाएंगे? – committedandroider

+1

@committedandroider: यह थोड़ा और जटिल है - कक्षा के कहीं भी उपयोग किए जाने से ठीक पहले स्थिर वैरिएबल प्रारंभ हो जाते हैं – Ralph

4

कक्षा लोड होने पर रन टाइम। - Have a look at initialization

+2

रनटाइम द्वारा, क्या आपका मतलब है कि कक्षा कब लोड की जाती है या जब उस क्षेत्र का पहले संदर्भ दिया जाता है? – Bhushan

1

आप संकलन समय पर एक चर कैसे लोड करेंगे? परिवर्तनीय प्रारंभिक वर्ग लोड होने पर प्रारंभ किया गया है। JVMS देखें।

74

संकलक रनटाइम पर मान की गणना करने के बजाय बाइटकोड में मान एम्बेड करके इनलाइन करने योग्य स्थिर अंतिम फ़ील्ड को अनुकूलित करता है।

जब आप एक JVM ऊपर आग और (इस classloader जब कक्षा पहली किसी भी तरह से संदर्भित है द्वारा किया जाता है) किसी भी स्थिर ब्लॉक या फ़ील्ड 'लोड' कर रहे हैं JVM में पहली बार के लिए एक वर्ग लोड और सुलभ हो ।

एक प्रदर्शन:

public class StaticDemo { 

// a static initialization block, executed once when the class is loaded 
static { 
    System.out.println("Class StaticDemo loading..."); 
} 

// a constant 
static final long ONE_DAY_IN_MILLIS = 24 * 60 * 60 * 1000; 

// a static field 
static int instanceCounter; 

// a second static initialization block 
// static members are processed in the order they appear in the class 
static { 
    // we can now acces the static fields initialized above 
    System.out.println("ONE_DAY_IN_MILLIS=" + ONE_DAY_IN_MILLIS 
    + " instanceCounter=" + instanceCounter); 
} 

// an instance initialization block 
// instance blocks are executed each time a class instance is created, 
// after the parent constructor, but before any own constructors (as remarked by Ahmed Hegazy) 
{ 
    StaticDemo.instanceCounter++; 
    System.out.println("instanceCounter=" + instanceCounter); 
} 

public static void main(String[] args) { 
    System.out.println("Starting StaticDemo"); 
    new StaticDemo(); 
    new StaticDemo(); 
    new StaticDemo(); 
} 

static { 
    System.out.println("Class StaticDemo loaded"); 
} 

} 

आउटपुट:

Class StaticDemo loading... 
ONE_DAY_IN_MILLIS=86400000 instanceCounter=0 
Class StaticDemo loaded 
Starting StaticDemo 
instanceCounter=1 
instanceCounter=2 
instanceCounter=3 

सूचना कैसे 'शुरू StaticDemo' उत्पादन की पहली पंक्ति के रूप में प्रकट नहीं होता है। ऐसा इसलिए है क्योंकि कक्षा से पहले लोड की जानी चाहिए, मुख्य विधि को निष्पादित किया जा सकता है, जिसका अर्थ है कि सभी स्थैतिक फ़ील्ड और ब्लॉक क्रमशः संसाधित होते हैं।

+0

भयानक स्पष्टीकरण @Adriaan – tez

+0

अच्छा, बहुत बहुत धन्यवाद! –

+0

कमाल। यह सही जवाब होना चाहिए! – Antonio

0

लोडिंग एक रनटाइम ऑपरेशन है। सब कुछ रनटाइम पर भरा हुआ है।

2

क्लास लोड होने पर स्थिर फ़ील्ड लोड होते हैं। यह आमतौर पर होता है जो किसी वर्ग की फ़ाइल ऑब्जेक्ट बनाई जाती है, लेकिन यदि कक्षा का उपयोग किसी अन्य तरीके से किया जाता है तो यह पहले हो सकता है।

स्थैतिक प्रारंभकर्ता थ्रेड सुरक्षित है और आप कक्षा को कई धागे में सुरक्षित रूप से एक्सेस कर सकते हैं। लॉक का उपयोग किए बिना थ्रेड सेफ सिंगलटन बनाने के लिए यह एक तरीका है।

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

0

जब आप java ClassName टाइप करते हैं तो वर्ग स्थैतिक चर के साथ JVM में लोड होता है, इसलिए आपको इसके लिए किसी ऑब्जेक्ट की आवश्यकता नहीं होती है।

जहां ऑब्जेक्ट बनाया गया है, तो जेवीएम द्वारा आवृत्ति चर के रूप में लोड किया गया है।

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