2012-08-08 10 views
8

यहाँ मैं एक कार्यक्रम किया था नहीं कार्यान्वित .. लेकिन जब मैं stat जो कार्यान्वित वहाँ जावा में static final के लिए किसी भी महत्व है मुद्रित ..? कृपया समझास्थिर ब्लॉक में कोड क्यों निष्पादित नहीं करता है? जब मैं <code>main</code><code>static</code> ब्लॉक में <code>constant</code> प्रिंट

package com.test.doubt;` 

class Doubt { 

    public static final int constant = 123; 
    public static int stat = 123; 

    static { 
    System.out.println("Static Block"); 
    } 
} 

public class MyProgram { 

    public static void main(String[] args) { 
    System.out.println(Doubt.constant); 
    } 
} 

उत्तर

10

static final int सीधे आपके कोड में आपके मान के रूप में संकलित किया जाएगा।

System.out.println(123); 

और आप सभी पर अपने जिसे उपयुक्त नाम Doubt वर्ग को छू नहीं कर रहे हैं (इस नहीं इस फैशन में स्थिरांक निर्दिष्ट करने के लिए एक तर्क है, Btw: यह कहने के लिए JVM देखता है और निष्पादित हो रहा है है। आपको लगता है कि मूल्य बदलते हैं तो आपको पुन: संयोजित करने के लिए हर संदर्भित वर्ग)

+0

धन्यवाद .. :) अब मुझे स्पष्ट हो गया .. – jenuine

20

आपका कोड Doubt वर्ग आरंभ नहीं है, इसलिए हुआ क्योंकि उस Doubt.constant एक निरंतर है। संकलन के समय इसका मूल्य MyProgram में बेक किया गया है - संकलन के बाद आप Doubt.class भी हटा सकते हैं और आपका प्रोग्राम अभी भी चल जाएगा।

भागो

javap -c com.test.doubt.MyProgram 

वास्तव में क्या अपने कोड संकलन के बाद की तरह दिखता है पर एक नजर है करने के लिए।

निरंतर अभिव्यक्ति का गठन करने के लिए section 15.28 of the JLS देखें। उदाहरण के लिए, यह अभी भी एक निरंतर होगा:

public static final String FOO = "Foo"; 

और इतने इन सब होगा:

public static final String FOO = "Foo"; 
public static final String BAR = "Bar"; 
public static final String FOOBAR = FOO + BAR; 

... लेकिन यह नहीं होगा

public static final String NOT_A_CONSTANT = "Foo".substring(0, 1); 
+0

+1 दूसरे शब्दों में है, 'javac' संकलक' Doubt' वर्ग के लिए की जरूरत दूर अनुकूलित। –

+3

@ थिलो: नहीं, यह * स्ट्रिंग के लिए भी होता है, जब तक कि यह एक संकलन-समय स्थिर होता है। विवरण के लिए जेएलएस की धारा 15.28 देखें। –

+0

'पैकेज com.test.doubt; कक्षा संदेह { \t सार्वजनिक स्थिर अंतिम int निरंतर = 123; \t सार्वजनिक स्थैतिक int stat = 123; \t स्थिर { \t \t System.out.println ("स्टेटिक ब्लॉक"); \t} } सार्वजनिक वर्ग MyProgram { \t public static void (String [] args) { // \t \t println (Doubt.constant); \t \t System.out.println (संदेह।स्टेट); \t \t \t \t \t} } 'लेकिन इस कोड को स्थिर ब्लॉक प्रिंट, इसलिए मैं भ्रमित हो – jenuine

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