2010-03-04 11 views
22

मैं यह जानने की कोशिश कर रहा हूं कि कक्षा को स्थिर के रूप में क्यों बनाया जा सकता है? जैसा:जावा क्लास को स्थैतिक घोषित क्यों नहीं किया जा सकता है?

public static class Qwert{ 

    public static void main(String args[]){ 

     int x = 12; 
     while(x<12){ 
      x--; 
     } 
     System.out.println(" the X value is : "+ x); 
    } 
} 

उत्तर

53

जावा में, static कीवर्ड को आमतौर पर झंडे एक विधि या नहीं एक बार एक वर्ग के उदाहरण प्रति मौजूदा रूप में क्षेत्र, लेकिन एक बार कभी। वैसे भी एक वर्ग मौजूद है, फिर भी, सभी वर्ग इस तरह से "स्थैतिक" हैं और सभी वस्तुएं कक्षाओं के उदाहरण हैं।

staticभीतरी कक्षाएं, जो पूरी तरह से अलग है के लिए एक अर्थ है: आमतौर पर एक आंतरिक वर्ग उदाहरण एक बाहरी वर्ग उदाहरण यह से जुड़ा हुआ है कि के सदस्यों तक पहुँच सकते हैं, लेकिन अगर भीतरी वर्ग static है, यदि ऐसा नहीं होता इस तरह का एक संदर्भ है और बाहरी वर्ग के उदाहरण के बिना तत्काल किया जा सकता है। हो सकता है कि आपने उस जगह को देखा हो, फिर इसे शीर्ष-स्तरीय वर्ग पर उपयोग करने का प्रयास किया, जहां यह सार्थक नहीं है।

या शायद आपने इसे सी # जैसी अन्य भाषाओं में देखा है, जिसका वाक्यविन्यास जावा की तरह एक भयानक है।

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

+3

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

+0

इसके अलावा मैंने प्रति उदाहरण एक बार मौजूद गैर स्थैतिक तरीकों के बारे में सच्चाई झुकाई, वास्तव में वे स्मृति दृष्टिकोण से नहीं हैं। मैं सिर्फ एक वैचारिक बिंदु बना रहा था। –

+0

@jeff, उस वर्ग से ऑब्जेक्ट इंस्टेंटेशन के मामले में एक स्थिर रूप से घोषित आंतरिक कक्षा और गैर स्थैतिक एक के बीच क्या अंतर है? क्या कोई प्रकार है, आप केवल एक स्थिर वस्तु को एक स्थिर आंतरिक वर्ग से तुरंत चालू कर सकते हैं, और एक गैर-स्थैतिक आंतरिक कक्षा से एक से अधिक ऑब्जेक्ट को तुरंत चालू कर सकते हैं? क्या यही है? – ultrajohn

9

किसी विशेष वर्ग को तत्काल स्थापित करने से रोकने के लिए आपको एक निजी निर्माता बनाना चाहिए। यह Qwert प्रकार का ऑब्जेक्ट बनाने में सक्षम होने से 'किसी अन्य' वर्ग को रोकता है।

उदाहरण के लिए

:

public static class Qwert{ 


     private Qwert() {} 

     public static void main(String args[]){ 

      int x = 12; 
      while(x<12){ 
       x--; 
      } 
      System.out.println(" the X value is : "+ x); 
     } 
    } 
+0

अच्छी अंतर्दृष्टि, शायद वह जो करने की कोशिश कर रहा था वह इसके बारे में सोचने के लिए आया था। –

1

Qwert का उदाहरण बनाकर से किसी भी वर्ग को रोकने के लिए, या तो विरासत द्वारा या reflection उपयोग करके, आप निर्माता एक जहर की गोली रखकर असफल बनाने:

public class Qwert { 

    private Qwert() throws IllegalAccessException { 
     throw new IllegalAccessException("Utility class!"); 
    } 

    public static class Yuiop { 
     public Yuiop() throws IllegalAccessException { 
      // generates a synthetic accessor method to super() 
     } 
    } 

    public static void main(String args[]) { 
     new Yuiop(); 
    } 
} 
1

इसकी वजह यह है कि जब हम किसी घटक के लिए स्थिर कीवर्ड का उपयोग करते हैं, तो वह घटक कक्षा स्तर घटक बन जाता है और इसकी याददाश्त होती है अपनी कक्षा द्वारा लिया गया।

1

हम स्थिर के रूप में सदस्यों को परिभाषित करना चाहिए जो

  1. वर्ग की सभी वस्तुओं के लिए आम होना चाहिए।
  2. कक्षा से संबंधित होना चाहिए और कक्षा के नाम से सुलभ होना चाहिए।
  3. उन्हें एक्सेस करने के लिए कक्षा की किसी वस्तु की आवश्यकता नहीं होनी चाहिए।

अब मान लीजिए कि हम एक बाहरी वर्ग को स्थैतिक मानते हैं और मान लीजिए कि हमें ऐसा करने की अनुमति है। क्या यह किसी भी उद्देश्य की सेवा करेगा या किसी डेवलपर को कोई लाभ प्रदान करेगा या यह डेवलपर्स और भाषा रचनाकार दोनों के लिए अस्पष्टता और जटिलताओं का निर्माण करेगा?

चलो जांचें, एक बाहरी वर्ग को स्थैतिक रूप से परिभाषित करना उन प्रयोजनों को पूरा करेगा जिन्हें हमने ऊपर परिभाषित किया है या नहीं?

  1. प्रत्येक वर्ग अपनी सभी वस्तुओं के लिए पहले से ही आम है और इसकी सभी वस्तुओं के लिए स्थिर होने की आवश्यकता नहीं है।
  2. हमें अपने स्थिर सदस्यों तक पहुंचने के लिए कक्षा का नाम चाहिए क्योंकि ये सदस्य कक्षा का हिस्सा हैं जबकि बाहरी वर्ग पैकेज का हिस्सा है और हम केवल package_name.class_name (class_name.static_field_name के समान) लिखकर कक्षा तक पहुंच सकते हैं, इसलिए फिर से ऐसा करने की कोई ज़रूरत नहीं है जो डिफ़ॉल्ट रूप से पहले से मौजूद है।
  3. हमें किसी वर्ग को एक्सेस करने के लिए किसी ऑब्जेक्ट की आवश्यकता नहीं है, तो हम इसे एक्सेस करने के लिए package_name.class_name लिख सकते हैं। और परिभाषा के अनुसार, एक वर्ग अपनी वस्तुओं के लिए एक ब्लूप्रिंट है और हम इससे वस्तुओं को बनाने के लिए एक वर्ग बनाते हैं (अपवाद हमेशा जावा होगा। Jang.lang.Math), फिर बाहरी वर्ग को स्थिर के रूप में परिभाषित करने की आवश्यकता नहीं है।

उपरोक्त बिंदुओं से, हम कह सकते हैं कि जावा रचनाकारों ने बाहरी वर्ग को स्थैतिक होने की अनुमति नहीं दी है क्योंकि इसे स्थिर बनाने की आवश्यकता नहीं है। बाहरी वर्ग स्थिर बनाने की अनुमति केवल जटिलताओं, अस्पष्टता और डुप्लिकेट को बढ़ाएगी। Why An Outer Java Class Can’t Be Static

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