2013-06-21 14 views
18

मैं सोच रहा हूं कि एक स्थिर स्थैतिक विधि स्थिर आवृत्ति चर को कैसे संशोधित कर सकती है। मुझे पता है कि स्थैतिक विधियां केवल अन्य स्थिर तरीकों और स्थैतिक चरों तक पहुंच सकती हैं। हालांकि, दूसरी तरफ सच है? क्या गैर स्थैतिक विधियां केवल गैर स्थैतिक चर तक पहुंच सकती हैं? उदाहरण के लिए:गैर स्थैतिक विधियां स्थैतिक चर संशोधित कर सकती हैं

public class SampleClass { 
    private static int currentCount = 0; 

    public SampleClass() { 
    currentCount++; 
    } 

    public void increaseCount() { 
    currentCount++; 
    } 
} 

यह कोड संकलित करता है और मैं जानना चाहता हूं कि क्यों स्थिर पहुंच निजीकरण के संदर्भ में।

+6

आप इसे करने की कोशिश की थी? –

+1

@ मार्को हां, यह संकलित करता है। बस सोच रहा है कि क्या लोगों ने इसे कहीं भी दस्तावेज किया है, और क्या मेरा तर्क सही है। –

+2

यह वास्तव में सच नहीं है कि स्थैतिक विधियां इंस्टेंस चर को संशोधित नहीं कर सकती हैं। यह सिर्फ इतना है कि उनके पास कोई "अंतर्निहित" संदर्भ नहीं है। आप 'कक्षा पूर्व {निजी int x लिख सकते हैं; स्थैतिक शून्य एफएन (पूर्व पूर्व) {ex.x = 12; }} '। बीटीडब्लू: म्यूटेबल स्टेटिक्स आम तौर पर एक बुरा विचार है। –

उत्तर

23

मैं The Java Tutorials

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

तो जवाब है हाँ, गैर स्थिर तरीकों स्थैतिक चर

संशोधित कर सकते हैं
15

नहीं, किसी भी गैर स्थैतिक विधि के पास स्थिर सदस्यों तक पहुंच है। यह एकमात्र तरीका गलत होगा यदि गैर स्थैतिक संदर्भ में स्थिर सदस्य तक पहुंच नहीं है (उदा। स्थिर सदस्य वर्ग के लिए निजी है और गैर-स्थैतिक कोड उस वर्ग में नहीं है)। एक स्थिर आवृत्ति/विधि प्रदान करने के लिए स्थैतिक चर मौजूद हैं, उदाहरण के लिए यदि हमारे पास गेम क्लास और हाईस्कॉर वैरिएबल है, तो हाईस्कॉर स्थिर होगा (उदाहरण के बिना सुलभ), और प्रत्येक गेम (गेम क्लास का एक उदाहरण) के बाद अगर हमारा स्कोर उच्च स्कोर से अधिक है तो हम अपने गैर-स्थैतिक संदर्भ से हाईस्कॉर्टर को बदल सकते हैं।

+0

धन्यवाद आदमी। मुझे निजी चीज़ के बारे में पता नहीं था और मुझे यहां पर सिरदर्द हो रहा था .... –

0

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

0

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

इसके लिए - स्टेटिक विधियां केवल स्थिर फ़ील्ड को स्पर्श कर सकती हैं (या अन्य स्थैतिक विधियों को कॉल कर सकती हैं)।

लेकिन जैसा कि आपने बताया कि अन्य तरीकों से संभव है, एक गैर-स्टेटिक विधि एक स्थिर क्षेत्र को संशोधित कर सकती है जो इसकी कक्षा की सभी वस्तुओं के लिए स्थिर है।

0

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

5

गैर स्थैतिक विधियां स्थैतिक चर का उपयोग कर सकती हैं। स्टेटिक विधियां ऑब्जेक्ट.एक्स बनाने के बिना सीधे स्थिर चर या विधियों तक पहुंच सकती हैं: सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग तर्क [])

+0

* * ऑब्जेक्ट का उपयोग किए बिना। इसे पैरामीटर के रूप में प्रदान किया जा सकता है। – EJP

0

स्टेटिक सदस्य उदाहरण सदस्य नहीं हैं, ये कक्षा द्वारा साझा किए जाते हैं, इसलिए मूल रूप से कोई भी उदाहरण विधि इन स्थिर सदस्यों तक पहुंचें।

0

गैर स्थिर तरीके के रूप में वे कक्षा के सदस्य

Demo Code

public class Static_Class { 
    protected static String str; 
    private static int runningLoop; 

    static{ 
     str = "Static Block"; 
    } 

    /** 
    * Non-Static Method Accessing Static Member 
    */ 
    public void modifyStaticMember(){ 
     str = "Non-Static Method";  
    } 

    /** 
    * Non-Static Method invoking Static Method 
    */ 
    public void invokeStaticMethod(){ 
     String[] args = {}; 
     if(runningLoop == 0){ 
      runningLoop++; 
      main(args); 
     } 
     //Exiting as it will lead to java.lang.StackOverflowError 
     System.exit(0); 
    } 

    public static void main(String[] args) { 
     Static_Class instance = new Static_Class(); 
     System.out.println(str); 
     instance.modifyStaticMember(); 

     // Changed Value persists 
     System.out.println(str); 

     //Invoking Static Method 
     instance.invokeStaticMethod(); 

    } 
} 
0

हाँ, एक स्थिर विधि एक गैर स्थैतिक चर का उपयोग कर सकते दोनों स्थैतिक चर स्टेटिक तरीके का उपयोग कर सकते &। यह कक्षा में ऑब्जेक्ट बनाने और ऑब्जेक्ट के माध्यम से चर का उपयोग करके किया जाता है। नीचे दिए गए उदाहरण में main एक स्थिर विधि है जो परिवर्तनीय a एक्सेस करती है जो एक गैर-स्थैतिक चर है।

डेमो कोड:

public class Sample { 

    private int a; 

    void method() 
    { 
     System.out.println("i am a private method"); 
    } 

    public static void main(String[] args) 
    { 
     Sample sample=new Sample(); 
     sample.a=10; 
     System.out.println(sample.a); 
    } 
} 
संबंधित मुद्दे