2013-07-17 26 views
11

जब मैं जावा के बारे में पुस्तक पढ़ रहा था, मैंने इस तरह एक उदाहरण लिखा था। और मुझे आश्चर्य है कि क्या मैं मुख्य विधि के बाहर चर को घोषित कर सकता हूं? बाहरी विधि के अंदर और अंदर परिवर्तनीय घोषित करने के बीच क्या अंतर है? यहां "स्थैतिक" भूमिका क्या है? कृपया मुझे कुछ समझाओ? मैं जावा में नया हूँ।मुख्य विधि और मुख्य विधि के अंदर परिवर्तनीय परिवर्तनीय के बीच क्या अंतर है?

public class Printstuff { 
     static int an_integer = 0; 
     public static void main(String[] args) { 
      int an_integer = 2; 
      String[] some_strings = {"Shoes", "Suit", "Tie" }; 
      an_integer = an_integer - 1; 
      some_strings[an_integer] = some_strings[an_integer] +"+++"; 
      for (int i = 0; i < some_strings.length; i++) 
      System.out.println(some_strings[Printstuff.an_integer]); 
     } 
    } 

सर्वश्रेष्ठ संबंध।

उत्तर

12

1) के अंदर बनाम बाहर:

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

आप बाहर अपने वस्तु विधि (वर्ग के अंदर) की घोषणा करते हैं, यह access modifier पर निर्भर करता है।
डिफ़ॉल्ट रूप से, यह उस वर्ग और पूरे पैकेज के भीतर से दृश्यमान/सुलभ है।

2) स्टेटिक

स्टेटिक का मतलब है कि इस वस्तु/चर वर्ग खुद के अंतर्गत आता है, और अपनी वस्तुओं के लिए नहीं।

उदाहरण:

public class Members { 

    static int memberCount; 

    public Members() { 
    memberCount++; 
    } 
} 

memberCount केवल एक बार ही मौजूद है, चाहे कितना वर्ग की कई वस्तुओं से मौजूद है। (किसी ऑब्जेक्ट को बनाया जाने से पहले भी!)

हर बार जब आप Members का नया ऑब्जेक्ट बनाते हैं, memberCount बढ़ जाता है। अब आप इसे इस तरह से एक्सेस कर सकते हैं: Members.memberCount

3

मुख्य विधि में एक चर घोषित करने से यह केवल मुख्य में उपलब्ध होगा। बाहर एक चर घोषित करने से यह मुख्य विधि सहित कक्षा के सभी तरीकों के लिए उपलब्ध कराएगा।

उदाहरण:

public class Foo { 
    private String varOne = "Test"; 

    public void testOne() { 
    System.out.println(varOne); 
    System.out.println(varTwo); // Error, this variable is available in the testTwo method only 
    } 

    public void testTwo() { 
    String varTwo = "Bar"; 
    System.out.println(varOne); // Will display "Test" 
    System.out.println(varTwo); // Will display "Bar" 
    } 
} 
+0

कक्षा के बाहर एक ही पैकेज में अन्य कक्षाओं के लिए भी – nachokk

+1

@nachokk: बस इस मामले में। यह एक्सेस विनिर्देशक पर निर्भर करता है। – pratZ

+1

यह कोड संकलित नहीं होगा, क्योंकि 'varOne' गैर स्थैतिक है, इसलिए स्थिर' मुख्य() 'विधि से उपयोग नहीं किया जा सकता है। – bcsb1001

1

वहाँ एक गुंजाइश अंतर है। और आपको इसे स्थैतिक घोषित करना होगा क्योंकि आपका मुख्य कार्य स्थैतिक है इसलिए यह आपको केवल स्थिर चर का उपयोग करने की अनुमति देता है। वेरिएबल जो मुख्य विधि के अंदर घोषित करता है केवल मुख्य विधि के अंदर ही उपयोग किया जाएगा।

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

+0

धन्यवाद जो स्पष्ट था। –

1

अंतर अब आपके an_integer में अधिक दायरा है।

उदाहरण यदि आपके पास कोई और तरीका है।

public class Printstuff { 
     static int an_integer = 0; 
     public static void main(String[] args) { 
      int an_integer = 2; 
      String[] some_strings = {"Shoes", "Suit", "Tie" }; 
      an_integer = an_integer - 1; 
      some_strings[an_integer] = some_strings[an_integer] +"+++"; 
      for (int i = 0; i < some_strings.length; i++) 
      System.out.println(some_strings[Printstuff.an_integer]); 
     } 

     public void anotherMethod(){ 
     an_integer++; 
     } 


    } 

आप

<default package> int an_integer=0;

एक ही पैकेज में सभी clases इस चर तक पहुँच गया है की घोषणा की है।

+0

धन्यवाद यह स्पष्ट था –

+0

आपका स्वागत है, किसी भी उत्तर को स्वीकार करने और उनको ऊपर उठाने पर विचार करें जो आपको समझने देते हैं :) – nachokk

1

जो आप संदर्भित करते हैं वह एक चर का दायरा है। तरीकों के अंदर

चर इस विधि के अंदर ही जाया जा सकता है, यानी an_integer अंदर main -method main विधि बाहर संदर्भित नहीं किया जा सकता। चर के अंदर परीक्षा के लिए वेरिएबल्स में संकुचित स्कॉप्स भी हो सकते हैं। for लूप का क्लासिक इटरेटिंग चर केवल इसके लूप के अंदर उपलब्ध है, इसके बाद यह चला गया।

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

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

Static फ़ील्ड्स का अब मतलब है कि यह चर वर्ग के उदाहरण से संबंधित नहीं है, बल्कि कक्षा में ही है। Static फ़ील्ड्स (और विधियों) को कक्षा को पहले शुरू किए बिना पढ़ा जा सकता है (या लागू किया जा सकता है)। एक उदाहरण एक वर्ग का मानक स्तर हो सकता है, या शायद एक कारखाना विधि (यदि यह एक विधि है)। Static फ़ील्ड final संशोधक के साथ, स्थिरांक के लिए भी उपयोगी हो सकते हैं। एक public final static फ़ील्ड काफी वैश्विक स्थिर है।

3

मुझे खेद है कि किसी ने स्मृति मामलों का उल्लेख नहीं किया है। कई साल पहले, मुख्य() के भीतर तत्काल आवृत्ति को ढेर में आवंटित किया जाएगा, गीलेर इसे तुरंत चालू कर देगा, मुख्य रूप से चर को चरम पर आवंटित करेगा। उन दिनों में, सिस्टम के बहुत छोटे ढेर थे, इसलिए इस विस्तार की जांच न करने से स्टैक ओवरफ्लो बहुत आसान हो जाएगा। मैं स्मृति वास्तुकला में एक विशेषज्ञ नहीं हूं, हालांकि, मेरी इच्छा है कि कोई मौजूदा सूक्ष्म वास्तुकला/स्मृति पर लागू होने वाले इस सूक्ष्म विवरण में योगदान दे सके।

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