2012-05-18 20 views
12

मुझे आश्चर्य है कि क्या सभी स्थानीय चर स्थिर हो जाते हैं यदि हम उन्हें एक स्थिर विधि में घोषित करते हैं?स्थिर तरीकों में स्थानीय चर भी स्थिर हैं?

उदाहरण के लिए

:

public static void A(){ 
     int x [] = {3,2}; 
     changeX(x); 

     for (int i = 0; i< x.length; i++){ 
      System.out.println(x[i]); // this will print -1 and 1 
     } 
    } 
    private static void changeX(int[] x){ 
     x[0] = -1; 
     x[1] = 1; 
    } 

जहां तक ​​मैं समझता हूँ कि जावा हमेशा मूल्य द्वारा पास होना जरूरी है, लेकिन क्यों एक्स के राज्य बदल गया है के बाद हम changeX फोन किसने बनाया? क्या कोई इसे समझा सकता है? और क्या कोई बता सकता है कि जावा आवंटन के मामले में स्थिर चर के साथ जावा कैसे काम करता है? और क्या होता है यदि हम पैरामीटर के रूप में किसी फ़ंक्शन में स्थिर चर पार करते हैं (मुझे पता है कि लोग सामान्य रूप से ऐसा नहीं करेंगे)

+1

यह कोई समझ नहीं आता है क्योंकि स्थानीय चर के लिए स्थैतिक का कोई अर्थ नहीं है। वे स्थानीय, अवधि हैं, चाहे वे एक स्थिर विधि या एक उदाहरण विधि में हैं। –

+0

यह एक स्थानीय या अस्थायी चर है। समारोह खत्म हो जाने के बाद, इसका कोई गुंजाइश नहीं है। – Subs

+0

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

उत्तर

18

आपके अधिकांश प्रश्नों का उत्तर "किसी भी अन्य चर के समान है।"

स्थैतिक तरीकों में स्थानीय चर स्थिर स्थिति में केवल स्थानीय चर हैं। वे स्थिर नहीं हैं, और वे किसी भी तरह से विशेष नहीं हैं।

स्टेटिक चर संबंधित Class ऑब्जेक्ट्स से जुड़ी मेमोरी में आयोजित किए जाते हैं; स्थैतिक संदर्भ चर द्वारा संदर्भित किसी भी वस्तु बस नियमित ढेर में रहते हैं।

जब आप एक तर्क के रूप में एक विधि के लिए स्थिर चर पारित करते हैं ... बिल्कुल कुछ भी दिलचस्प नहीं होता है।

अपने कोड में परिदृश्य के बारे में:

  1. कल्पना कीजिए कि आप एक स्ट्रिंग पर एक खिलौना गुब्बारा है कि (गुब्बारा अपने सरणी वस्तु है, और स्ट्रिंग यह करने के लिए संदर्भ A() में घोषित है।)
  2. अब आप गुब्बारे के लिए पर टाई एक और स्ट्रिंग और हाथ एक दोस्त को कि स्ट्रिंग (कि वास्तव में क्या होता है जब आप changeX() विधि कॉल है: स्ट्रिंग विधि के पैरामीटर है, और यह एक ही वस्तु के लिए अंक।)
  3. अगला, आपका दोस्त स्ट्रिंग में खींचता है, एक ब्लैक मार्कर लेता है और गुब्बारे पर एक चेहरा खींचता है (यह changeX() सरणी को संशोधित करने की विधि है)।
  4. फिर अपने दोस्त उसकी स्ट्रिंग unties, बस अपने स्ट्रिंग गुब्बारे से जुड़ी छोड़ने (विधि रिटर्न, और changeX() में स्थानीय चर क्षेत्र से बाहर चला जाता है।)
  5. अंत में आप स्ट्रिंग रील और गुब्बारे को देखो: बेशक, आप चेहरे को देखते हैं (आपका A() दिनचर्या बदले गए सरणी को देखता है।)

यह वास्तव में उतना आसान है!

+0

क्या आप ऊपर दिए गए कोड को समझा सकते हैं कि X की स्थिति उस फ़ंक्शन कॉल के बाद क्यों बदल गई? – peter

+1

@ user1389813: इसका संदर्भ * स्थिर * और संदर्भ संदर्भ चर के साथ करने के लिए कुछ भी नहीं है। कृपया जावा-रांच को चर के बारे में क्या कहना है पढ़ें। –

+0

लेकिन मैंने सोचा कि जावा हमेशा पास-दर-मूल्य – peter

2

जैसा कि अन्य ने इंगित किया है, एमईएचओडीओडी के लिए स्थानीय वेरिएबल किसी भी अन्य विधि के भीतर घोषित वैरिएबल के समान हैं - वे गतिशील रूप से आवंटित होते हैं और जब वे वैरिएबल लौटाते हैं तो अब मुक्त हो सकता है दिखाई।

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

1

स्थिर चर को "स्थायी पीढ़ी" नामक ढेर के एक विशेष क्षेत्र में संग्रहीत किया जाता है।

एक स्थैतिक विधि में डूबने वाले स्थानीय चर गैर-स्थैतिक विधि में घोषित लोगों के साथ कोई फर्क नहीं पड़ता है। ऑब्जेक्ट संदर्भ और आदिम चर ढेर पर रखे जाते हैं। जब भी आप कोई ऑब्जेक्ट बनाते हैं, तब उस कोड को निष्पादित किया जाता है जब उस कोड को निष्पादित किया जाता है।

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