2014-10-26 13 views
6

मैं जावा में लिंक्डलिस्ट सीख रहा हूं और मेरे पास तीन फाइलें हैं Main.java, List.java और Node.java। जब मैं ऐसा कर रहा हूं, तो मुझे एक सवाल आया कि मुझे स्थानीय चर को प्रारंभ क्यों करना चाहिए जिसे विधि में घोषित किया गया है, लेकिन क्लास वेरिएबल नहीं है जिसे कक्षा में घोषित किया गया है।क्यों जावा डिफ़ॉल्ट रूप से केवल कक्षा चर प्रारंभ कर रहा है लेकिन स्थानीय चर नहीं?

पहली तस्वीर में, मैंने कक्षा चर के रूप में घोषित किया, यह कोई त्रुटि नहीं फेंकता है।

लेकिन दूसरी तस्वीर में मैंने स्थानीय चर के रूप में सिर शुरू किया.अब, यह स्थानीय चर प्रारंभ करने में त्रुटि उत्पन्न करता है।

कक्षा चर के रूप में घोषित होने पर क्या अंतर होता है? जावा में

enter image description here

शुरुआती।

अपडेट: मुझे पता है कि इसे कैसे ठीक किया जाए, लेकिन मुझे स्पष्ट नहीं है कि क्यों जावा डिफ़ॉल्ट रूप से केवल कक्षा चर प्रारंभ कर रहा है लेकिन स्थानीय चर नहीं।

+0

फ़ील्ड चर डिफ़ॉल्ट रूप से प्रारंभ किए जाते हैं। ऐसा इसलिए है क्योंकि जैसे ही इंस्टेंस बनाया गया है, उन चरों को एक्सेस करने योग्य होने की आवश्यकता है, क्योंकि जब तक वस्तु जीवित है तब तक वे पहुंच योग्य हैं। स्थानीय चर, हालांकि, केवल तभी जरूरी है जब उस विशेष स्थानीय दायरे को निष्पादित किया जा रहा हो। यदि जावा स्थानीय वर्र्स को प्रारंभ करना था, तो वे या तो स्कोप निष्पादित होने पर हर बार शुरू किया जाएगा, या स्टैक पर कहीं भी रखा जाना चाहिए। मुझे यकीन है कि प्रदर्शन कारणों के लिए यह तरीका है –

+0

@ एंडी थॉमस मुझे नहीं पता कि इसे डुप्लिकेट के रूप में क्यों चिह्नित किया जा रहा है। वह त्रुटि के बारे में नहीं पूछ रहा है (मुझे यकीन है कि वह समझता है कि कैसे ठीक किया जाए)।वह पूछ रहा है कि ऐसा क्यों है, एक प्रश्न जो मैं स्टैक ओवरव्लो –

+0

@ विन्सइमी पर नहीं ढूंढ सकता - काफी मेला, यह एक मोटा मैच था। फिर से खोलने। –

उत्तर

0

स्टेटिक/गैर स्थिर क्षेत्रों कि पुरातन नहीं हैं, बाहर काम अपने Node तरह यकीन नहीं है, डिफ़ॉल्ट रूप से null पर प्रारंभ कर रहे हैं। स्थिर/गैर स्थैतिक फ़ील्ड जो आदिम हैं उनके डिफ़ॉल्ट मान प्राप्त करते हैं।

एक और मामला भी है जहां कुछ चर डिफ़ॉल्ट रूप से प्रारंभ किए जाते हैं: जब आप किसी सरणी को तुरंत चालू करते हैं।

int
  • null के लिए
    • 0Integer
    • आदि

    हालांकि, एक स्थानीय विधि में, संकलक आवंटित नहीं करता डिफ़ॉल्ट मान के लिए: प्रत्येक कोशिका का प्रतिनिधित्व करता है प्रकार के बारे में डिफ़ॉल्ट मान है, स्थानीय चर के लिए।
    यही कारण है कि आपका आईडीई इस बारे में चेतावनी देता है: "प्रारंभ नहीं किया जा सकता है!"।

    समझने के लिए, आपको इस post में रुचि क्यों हो सकती है।

  • +0

    ठीक है, आपका लिंक मुझे स्पष्टीकरण देता है। धन्यवाद :) –

    +0

    आपका स्वागत है :) – Mik378

    0

    पहले मामले में जावा नहीं जान सकता, जब आप नोड "हेड" को मान निर्दिष्ट करते हैं। आप "एड" पर कॉल करने से पहले कॉल कर सकते हैं दूसरे में कमांड एक ही विधि में हैं और निष्पादन का आदेश स्पष्ट है।

    प्रत्येक मामले में आपको प्रत्येक चर को प्रारंभ करना चाहिए। मुझे याद है, तो सही सदस्य चर अशक्त के लिए शुरू कर रहे हैं, लेकिन मैं इसे हर JVM के लिए

    +0

    * संदर्भ * फ़ील्ड चर को शून्य करने के लिए असाइन किया गया है। * आदिम * फ़ील्ड वेरिएबल्स को उनके [डिफ़ॉल्ट मान] (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html) में प्रारंभ किया जाता है (डिफ़ॉल्ट मानों पर स्क्रॉल करें) –

    +1

    और यह इसका हिस्सा है भाषा विनिर्देश, विनिर्देश की JVM व्याख्या नहीं। वास्तव में, यदि आप स्पष्ट रूप से चर को स्पष्ट करते हैं तो एक निष्क्रिय JVM बड़ा कोड बना सकता है। आप अनिवार्य रूप से वीएम को कन्स्ट्रक्टर से पहले कक्षा के लिए कोड चलाने के लिए कह रहे हैं। यह है, आईएमएचओ, खराब जावा फॉर्म। – jdv

    2

    यह (, विशेष रूप से §4.12.5) the Java Language Specification से नहीं बल्कि अच्छी तरह से समझाया गया है:

    एक कार्यक्रम में हर चर एक मान होना चाहिए से पहले अपने मूल्य प्रयोग किया जाता है:

    • प्रत्येक वर्ग चर , आवृत्ति परिवर्तनीय, या सरणी घटक को डिफ़ॉल्ट मान के साथ प्रारंभ किया जाता है जब यह बनाया जाता है (§15.9, §15.10):
    • सभी संदर्भ प्रकारों के लिए (§4।3), डिफ़ॉल्ट मान शून्य है।
    • एक स्थानीय चर (§14.4, §14.14) स्पष्ट रूप से एक मूल्य, या तो प्रारंभ (§14.4) या असाइनमेंट (§15.26) द्वारा, दिया जाना चाहिए इससे पहले कि यह प्रयोग किया जाता है एक तरीका है कि सत्यापित किया जा सकता में निश्चित असाइनमेंट (§16) के नियमों का उपयोग करना।

    थोड़ा विस्तार करने के लिए, §16 definite assignment के लिए नियमों में चला जाता है, जो कारण की जड़ पर है:

    प्रत्येक स्थानीय चर (§14.4) और हर खाली अंतिम क्षेत्र (§4.12.4, §8.3.1.2) में निश्चित रूप से असाइन किया गया मान होना चाहिए जब उसके मूल्य का कोई भी उपयोग होता है।

    स्थानीय चर या रिक्त अंतिम फ़ील्ड x की प्रत्येक पहुंच के लिए x को निश्चित रूप से एक्सेस से पहले असाइन किया जाना चाहिए, या संकलन-समय त्रुटि उत्पन्न होती है।

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

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

    यह मतलब नहीं है बस एक चर घोषित करने और इसे करने के लिए एक मूल्य बताए यह साथ कुछ करने के लिए प्रयास करने के लिए, के रूप में चर करता एक मूल्य के न है।

    +0

    वह पहले से ही यह जानता है। अपने प्रश्न EDIT के अंतिम भाग को पढ़ें: एनवीएम, इसे हटा दिया गया। लेकिन उन्होंने कहा कि वह समझता है कि इसे शुरू किया जाना चाहिए। हेस बस यह सुनिश्चित नहीं है कि यह –

    +0

    जैसा क्यों है, मुझे यकीन नहीं है कि "वह पहले से ही यह जानता है" का क्या मतलब है। जेएलएस संदर्भ स्पष्ट नहीं किया गया था, और यह ** ** कारण है कि आपको स्थानीय चर प्रारंभ करना क्यों है, लेकिन आपको एक आवृत्ति चर के लिए नहीं है। – Makoto

    +0

    "स्थानीय चर को स्पष्ट रूप से उपयोग किए जाने से पहले एक मान दिया जाना चाहिए" तो यही कारण है कि स्थानीय चर को डिफ़ॉल्ट रूप से प्रारंभ नहीं किया जाता है? यह जवाब होगा अगर उसने पूछा, "मुझे यह त्रुटि क्यों मिल रही है" –

    0

    क्यों भाषा इस तरह से काम करती है, ऐसा इसलिए है क्योंकि पसंदीदा शैली स्थानीय चर के घोषणापत्र में देरी होने तक देरी होती है जब तक कि उनका पहले उपयोग नहीं किया जाता है। जावा को डिज़ाइन किया गया था ताकि आपको उस स्थान तक एक चर घोषित करने की आवश्यकता न हो, जहां इसे पहली बार उपयोग किया जाता है (उदाहरण के लिए, जावास्क्रिप्ट, जहां ब्लॉक-स्तरीय दायरे की कमी के कारण और उछाल के कारण भी आप घोषित होने से बेहतर हैं विधि या फ़ंक्शन की शुरुआत में चर), इसलिए यह कोई समस्या नहीं होनी चाहिए कि स्थानीय चर को डिफ़ॉल्ट मान नहीं मिलता है।

    स्थानीय चर के लिए भी विचार यह होना चाहिए कि डिफ़ॉल्ट मान निर्दिष्ट करने में अपेक्षाकृत कम मूल्य था। यहां तक ​​कि यदि मैं एक स्थानीय चर प्रारंभ करना चाहता हूं, तो इसके बारे में स्पष्ट होना अच्छा है।

    बेशक उदाहरण के लिए और कक्षा के सदस्यों की घोषणा-पहले-उपयोग लागू नहीं होती है, क्योंकि इसमें कोई बात नहीं है कि इसे क्या कह सकता है। अगर कुछ असाइन नहीं किया गया है तो उसे डिफ़ॉल्ट मान प्राप्त करने की आवश्यकता है।

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