2012-07-20 11 views
114

static सदस्यों (static फ़ील्ड या static विधियां) जावा में इस कक्षा की वस्तुओं के बजाय अपने संबंधित वर्ग से जुड़े हुए हैं। निम्न कोड null संदर्भ पर स्थिर फ़ील्ड तक पहुंचने का प्रयास करता है।जावा में एक शून्य संदर्भ पर स्टेटिक फ़ील्ड

public class Main 
{ 
    private static final int value = 10; 

    public Main getNull() 
    { 
     return null; 
    } 

    public static void main(String[] args) 
    { 
     Main main=new Main(); 
     System.out.println("value = "+main.getNull().value); 
    } 
} 

main.getNull() हालांकि रिटर्न null, यह काम करता है और प्रदर्शित करता है value = 10। यह कोड कैसे काम करता है?

+15

हो सकता है कि इस सवाल का मदद कर सकते हैं यह समझ: [कैसे एक अशक्त संदर्भ पर एक (स्थिर) विधि लागू NullPointerException फेंक नहीं है आया है?] (Http://stackoverflow.com/questions/3293353/ कैसे-आओ-invoking-a-static-method-on-a-null-context-doesnt-throw-nullpointe? rq = 1) –

+4

मज़े के लिए, 'मुख्य मुख्य = शून्य; main.getNull()। मान'। –

+1

यह मुझे 'नया थ्रेड [] {} [- 1]। नींद (10) की याद दिलाता है, जहां नींद() एक स्थिर विधि है। यह कुछ पुराने जावा संस्करणों पर सफल होने के लिए प्रयोग किया जाता था। – hertzsprung

उत्तर

89

को यही व्यवहार Java Language Specification में निर्दिष्ट किया जाता:

एक अशक्त संदर्भ एक अपवाद पैदा करने के बिना एक वर्ग (स्थिर) चर का उपयोग करने के लिए इस्तेमाल किया जा सकता है।

अधिक जानकारी के अलावा, एक static field evaluation, जैसे Primary.staticField काम करता है के रूप में इस प्रकार है (जोर मेरा) - आपके मामले में, Primary = main.getNull():

  • प्राथमिक अभिव्यक्ति मूल्यांकन किया जाता है, और परिणाम त्याग दिया जाता है। [...]
  • यदि फ़ील्ड एक गैर-खाली अंतिम फ़ील्ड है, तो परिणाम क्लास या इंटरफ़ेस में निर्दिष्ट क्लास चर का मान है जो प्राथमिक अभिव्यक्ति का प्रकार है। [...]
+5

अगर किसी के पास यह जानकारी है * क्यों * यह विकल्प बनाया गया था, तो यह दिलचस्प होगा। –

+6

@ जोनॉफअल्ट ट्रेडस मुझे लगता है कि यह स्पष्ट है: शून्य संदर्भ पर कॉल करते समय किसी भी अपवाद को फेंकना उचित नहीं है क्योंकि इससे कोई फर्क नहीं पड़ता क्योंकि विधि स्थिर है। – Malcolm

+12

@ जोनॉफअल्ट ट्रेडस: असली सवाल यह है कि स्थिर सदस्यों को उदाहरण के रूप में बुलाया जाने का विकल्प क्यों बनाया गया था ... मेरे लिए, ऐसा लगता है कि यह केवल भ्रम और कम पठनीय कोड का कारण बनता है। – Falanwe

19

क्योंकि, जैसा कि आपने कहा था, स्थिर फ़ील्ड एक उदाहरण से जुड़े नहीं हैं।

एक उदाहरण संदर्भ से स्थिर फ़ील्ड तक पहुंचने की क्षमता (जैसा कि आप कर रहे हैं) केवल एक वाक्य रचनात्मक चीनी है और इसका कोई अतिरिक्त अर्थ नहीं है।
आपका कोड संकलित

main.getNull(); 
Main.value 
+7

मैं इसे वाक्य रचनात्मक चीनी कहूंगा, सिंटैक्टिक आंखों की धूल की तरह;) –

3
  1. वर्ग के नाम के साथ एक static सदस्य को एक्सेस करना कानूनी है, लेकिन इसके कोई लिखा गया था कि एक वस्तु संदर्भ चर का उपयोग कर static सदस्य तक नहीं पहुँच सकता। तो यह यहाँ पर काम करता है।

  2. एक null वस्तु संदर्भ चर संकलन में एक अपवाद या तो फेंक के बिना एक static वर्ग चर का उपयोग या बार चलाने के लिए अनुमति दी है।

3

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

Main main = null; 
System.out.println(main.value); 

यह क्योंकि संकलन समय पर स्थिर चर मूल्य के मूल्य प्रिंट होगा यह करने के लिए

System.out.println(Main.value); 

सबूत परिवर्तित किया जाएगा:

डाउनलोड decompiler और अपने .class फाइल करने के लिए डिकंपाइल।जावा फ़ाइल और आप सभी स्थैतिक विधियों या चर निर्दिष्ट ऑब्जेक्ट नाम को स्वचालित रूप से कक्षा के नाम से बदल सकते हैं।

2

स्टेटिक चर और विधि हमेशा कक्षा से संबंधित हैं। तो जब भी हम किसी ऑब्जेक्ट को केवल गैर स्थैतिक चर बनाते हैं और विधियों के साथ ढेर के लिए विधियां जाती हैं लेकिन कक्षा के साथ विधि क्षेत्र में स्थैतिक रहता है। यही कारण है कि जब भी हम एक स्थैतिक चर या विधि को कक्षा नाम डॉट वैरिएबल या विधि नाम में परिवर्तित करने का प्रयास करते हैं।

कृपया अधिक जानकारी के लिए नीचे दिए गए लिंक का संदर्भ लें।

http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

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