2013-04-06 5 views
7

क्लास नाम के साथ अंतिम स्थैतिक चर का उपयोग करते समय जावा में स्थिर ब्लॉक क्यों संसाधित नहीं किया जा रहा है?स्टेटिक ब्लॉक जावा में अनप्रचारित

class Foo { 
    public static final int BAR; 
    static { 
    System.out.println("Hello"); 
    } 
    } 
class Baz { 
    public static void quux() { 
    System.out.println(Foo.BAR); 
    } 
} 

उत्तर

11

यह कभी कभी होगा - यह है कि क्या वास्तव में चर है पर निर्भर करता है एक निरंतर:

  • यह या तो एक स्ट्रिंग या एक आदिम चर (संभवतः एक साथ किसी अन्य वर्ग हो गया है शून्य मान; मुझे जांचना होगा)
  • प्रारंभिक अभिव्यक्ति को निरंतर अभिव्यक्ति होना चाहिए

यदि ऐसा है, तो चर के किसी भी संदर्भ को प्रभावी रूप से मूल्य में बदल दिया जाता है। इसलिए इस कोड में:

class Foo { 
    public static final int BAR = 5; 
} 

class Baz { 
    public static void quux() { 
     System.out.println(Foo.BAR); 
    } 
} 

Baz में विधि एक ही कोड के रूप में में संकलित किया गया है:

public static void quux() { 
    System.out.println(5); 
} 

Foo.BAR का कोई संकेत बाईटकोड में छोड़ दिया है, इसलिए Foo प्रारंभ करने की आवश्यकता नहीं है जब विधि निष्पादित होती है।

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

class Foo { 
    public static final int BAR; 

    static { 
     BAR = 5; 
    } 
} 

class Baz { 
    public static void quux() { 
     System.out.println(Foo.BAR); 
    } 
} 

Foo.BAR जहाँ तक संकलक का सवाल है एक निरंतर के रूप में गिनती नहीं बनाने के लिए पर्याप्त होगा कि।

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