जावा में अशक्त संदर्भ पर स्थैतिक क्षेत्र


119

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। यह कोड कैसे काम करता है?



4
मनोरंजन के लिए, प्रयास करें Main main = null; main.getNull().value
मार्को टोपोलनिक

1
यह मुझे याद दिलाता है कि new Thread[]{}[-1].sleep(10);कहां सोना () एक स्थिर तरीका है। यह कुछ पुराने जावा संस्करणों पर सफल हुआ करता था।
२३:३३ पर hertzsprung

जवाबों:


93

यह व्यवहार जावा भाषा विनिर्देश में निर्दिष्ट है :

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

अधिक विवरण में, एक स्थिर क्षेत्र मूल्यांकन , जैसे Primary.staticFieldकि निम्नानुसार काम करता है (जोर मेरा) - आपके मामले में Primary = main.getNull(),:

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

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

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

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

2
@Falanwe: सहमत हुए, और यह एक ऐसा निर्माण है जिसके लिए मुझे कोई आवश्यकता नहीं थी, हालाँकि मैं ज्यादातर .NET में काम करता हूँ जहाँ इसकी अनुमति नहीं है। मुझे लगता है कि जब आप मूल वर्ग का संदर्भ देते हैं, तो आप उपवर्ग की उपयुक्त स्थैतिक विधि को कॉल करना चाह सकते हैं।

8
@Falanwe यह अनुमति है, लेकिन ग्रहण में चेतावनी देता है: "स्थिर फ़ील्ड Main.value को स्थिर तरीके से एक्सेस किया जाना चाहिए"। कम से कम हममें से वे लोग चेतावनियों के बारे में (जैसे मेरे) इस तरह के कोड से बचेंगे।
Artyom

19

क्योंकि, जैसा कि आपने कहा, स्थैतिक क्षेत्र एक उदाहरण से संबद्ध नहीं हैं।

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

main.getNull(); 
Main.value

7
मैं इसे सिंटैक्टिक शुगर कहूंगा, सिंटैक्टिक सॉ-डस्ट की तरह;)
स्टीफन स्वेंसन

3

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

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

यह स्थिर परिवर्तनीय मूल्य के मूल्य को प्रिंट करेगा क्योंकि संकलन समय पर इसे परिवर्तित किया जाएगा

System.out.println(Main.value);

सबूत:

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


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

  2. एक nullऑब्जेक्ट रेफरेंस वैरिएबल को एक staticकंपाइलर या रन टाइम पर बिना किसी अपवाद के क्लास वेरिएबल को एक्सेस करने की अनुमति है ।


2

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

अधिक विस्तार के लिए नीचे दिए गए लिंक को देखें।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.