CodeGym /Java Blog /अनियमित /जावा में स्थिर संशोधक के बारे में आपको 10 बातें जानने की ...
John Squirrels
स्तर 41
San Francisco

जावा में स्थिर संशोधक के बारे में आपको 10 बातें जानने की जरूरत है

अनियमित ग्रुप में प्रकाशित
जावा में, स्थैतिक संशोधक का अर्थ है कि कुछ सीधे एक वर्ग से संबंधित है: यदि कोई क्षेत्र स्थिर है, तो यह वर्ग से संबंधित है; यदि कोई विधि स्थिर है, तो वह वर्ग से संबंधित है। नतीजतन, आप स्थिर विधि को कॉल करने या स्थिर क्षेत्र को संदर्भित करने के लिए कक्षा के नाम का उपयोग कर सकते हैं। उदाहरण के लिए, यदि countफ़ील्ड कक्षा में स्थिर है Counter, तो इसका मतलब है कि आप चर को निम्न अभिव्यक्ति के साथ संदर्भित कर सकते हैं: Counter.count. जावा में स्थैतिक संशोधक के बारे में आपको 10 बातें जानने की जरूरत है - 1बेशक, एक्सेस संशोधक पर विचार किया जाना चाहिए। उदाहरण के लिए, privateफ़ील्ड केवल उस कक्षा में उपलब्ध हैं जिसमें वे घोषित किए गए हैं। और protectedफ़ील्ड पैकेज के भीतर सभी वर्गों के साथ-साथ पैकेज के बाहर उनके सभी उपवर्गों के लिए उपलब्ध हैं। मान लीजिए कि Counterकक्षा में एक स्थिर increment()विधि है जिसका काम वेतन वृद्धि करना हैcountमैदान। इस विधि को कॉल करने के लिए आप उपयोग कर सकते हैं Counter.increment()Counterस्थैतिक क्षेत्र या विधि तक पहुँचने के लिए कक्षा का एक उदाहरण बनाने की आवश्यकता नहीं है । यह स्थैतिक (वर्ग) चर और विधियों और गैर-स्थैतिक (उदाहरण) चर और विधियों के बीच मूलभूत अंतर है। एक महत्वपूर्ण नोट। यह मत भूलो कि कक्षा के स्थिर सदस्य सीधे वर्ग के हैं, न कि कक्षा का कोई उदाहरण। अर्थात्, स्थैतिक चर का मान सभी वस्तुओं countके लिए समान होगा । Counterइस लेख में, हम जावा में स्थैतिक संशोधक का उपयोग करने के मूलभूत पहलुओं के साथ-साथ कुछ विशेषताओं को देखेंगे जो आपको प्रमुख प्रोग्रामिंग अवधारणाओं को समझने में मदद करेंगे।

जावा में स्थिर संशोधक के बारे में प्रत्येक प्रोग्रामर को क्या पता होना चाहिए।

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

    
    public class Counter {
    private int count;
    public static void main(String args []) {
       System.out.println(count); //  Compile time error
    }
    }
    

    यह जावा प्रोग्रामर्स द्वारा की जाने वाली सबसे आम गलतियों में से एक है, खासकर नौसिखियों द्वारा। चूंकि mainविधि स्थिर है और countचर नहीं है, विधि printlnके अंदर विधि का उपयोग करने mainसे "संकलन समय त्रुटि" उत्पन्न होगी।

  2. स्थानीय चर के विपरीत, स्थैतिक क्षेत्र और विधियाँ thread safeजावा में नहीं हैं। व्यवहार में, यह बहु-थ्रेडेड प्रोग्रामिंग में सुरक्षा समस्याओं के सबसे लगातार कारणों में से एक है। यह देखते हुए कि एक वर्ग का प्रत्येक उदाहरण एक स्थिर चर की एक ही प्रति को संदर्भित करता है, ऐसे चर को कक्षा द्वारा संरक्षित या "लॉक" करने की आवश्यकता होती है। इसलिए, स्थैतिक चर का उपयोग करते समय, सुनिश्चित करें कि वे ठीक से हैं synchronizedजैसे कि समस्याओं से बचने के लिए race conditions

  3. स्थैतिक विधियों का व्यावहारिक लाभ यह है कि हर बार जब आप उन्हें कॉल करना चाहते हैं तो एक नई वस्तु बनाने की आवश्यकता नहीं होती है। एक स्थिर विधि को घोषित करने वाले वर्ग के नाम का उपयोग करके कहा जा सकता है। इसलिए ये तरीके factoryतरीकों और utilityविधियों के लिए एकदम सही हैं। वर्ग java.lang.Mathएक अद्भुत उदाहरण है: इसकी लगभग सभी विधियाँ स्थिर हैं। जावा की उपयोगिता कक्षाएं finalउसी कारण से चिह्नित हैं।

  4. @Overrideएक अन्य महत्वपूर्ण बिंदु यह है कि आप ( ) स्थिर विधियों को ओवरराइड नहीं कर सकते । यदि आप इस तरह की विधि की घोषणा करते हैं subclass, यानी एक ही नाम और हस्ताक्षर वाली विधि, तो आप इसे superclassओवरराइड करने की बजाय विधि को "छुपाएं"। इस घटना के रूप में जाना जाता है method hiding। इसका मतलब यह है कि यदि माता-पिता और बच्चे दोनों वर्गों में एक स्थिर विधि घोषित की जाती है, तो कहा जाने वाला तरीका हमेशा संकलन समय पर चर प्रकार पर आधारित होगा। मेथड ओवरराइडिंग के विपरीत, जब प्रोग्राम चलता है तो ऐसे मेथड्स को एक्जीक्यूट नहीं किया जाएगा। आइए एक उदाहरण पर विचार करें:

    
    class Vehicle {
         public static void kmToMiles(int km) {
              System.out.println("Inside the parent class / static method");
         } 
    }
    
    class Car extends Vehicle {
         public static void kmToMiles(int km) {
              System.out.println("Inside the child class / static method");
         } 
    }
    
    public class Demo {   
       public static void main(String args []) {
          Vehicle v = new Car();
           v.kmToMiles(10);
      }
    }
    

    कंसोल आउटपुट:

    मूल वर्ग/स्थैतिक विधि के अंदर

    कोड स्पष्ट रूप से प्रदर्शित करता है कि इस तथ्य के बावजूद कि वस्तु एक है Car, कक्षा में स्थिर विधि को Vehicleकहा जाता है, क्योंकि विधि को संकलन समय पर बुलाया गया था। और ध्यान दें कि कोई संकलन त्रुटियां नहीं थीं!

  5. क्या अधिक है, शीर्ष-स्तरीय कक्षाओं के अलावा, आप कक्षाओं को स्थिर घोषित कर सकते हैं। ऐसी कक्षाओं के रूप में जाना जाता है nested static classes। वे बेहतर सामंजस्य प्रदान करने के लिए उपयोगी हैं। नेस्टेड स्टैटिक क्लास का एक आकर्षक उदाहरण है HashMap.Entry, जो अंदर एक डेटा संरचना है HashMap। यह ध्यान देने योग्य है कि, आंतरिक कक्षाओं की तरह, स्थिर नेस्टेड कक्षाएं एक अलग .class फ़ाइल में घोषित की जाती हैं। इस प्रकार, यदि आप अपनी मुख्य कक्षा में पाँच नेस्टेड कक्षाएं घोषित करते हैं, तो आपके पास .class एक्सटेंशन वाली 6 फाइलें होंगी। एक अन्य उदाहरण हमारी अपनी घोषणा है Comparator, जैसे कि कक्षा AgeComparatorमें आयु तुलनित्र ( ) ।Employee

  6. स्थैतिक संशोधक को स्थिर ब्लॉक में भी निर्दिष्ट किया जा सकता है, जिसे "स्थैतिक प्रारंभिक ब्लॉक" के रूप में जाना जाता है, जिसे क्लास लोड होने पर निष्पादित किया जाता है। यदि आप इस तरह के ब्लॉक की घोषणा नहीं करते हैं, तो जावा सभी स्थिर क्षेत्रों को एक सूची में एकत्रित करता है और कक्षा लोड होने पर उन्हें प्रारंभ करता है। एक स्थिर ब्लॉक चेक किए गए अपवादों को नहीं फेंक सकता है, लेकिन यह अनियंत्रित लोगों को फेंक सकता है। इस मामले में, एक ExceptionInInitializerErrorघटित होगा। व्यवहार में, स्थैतिक क्षेत्रों के आरंभीकरण के दौरान होने वाले किसी भी अपवाद को जावा द्वारा इस त्रुटि में लपेटा जाएगा। यह का सबसे आम कारण भी है NoClassDefFoundError, क्योंकि संदर्भित होने पर कक्षा स्मृति में नहीं होगी।

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

  8. प्रारंभ एक स्थिर ब्लॉक का एक महत्वपूर्ण पहलू है। क्लास को मेमोरी में लोड करने के बाद स्टेटिक फील्ड या वेरिएबल्स को इनिशियलाइज़ किया जाता है। इनिशियलाइज़ेशन का क्रम ऊपर से नीचे तक होता है, उसी क्रम में जिसमें वे जावा क्लास की सोर्स फ़ाइल में घोषित किए जाते हैं। चूँकि स्टैटिक फील्ड्स को थ्रेड-सेफ तरीके से इनिशियलाइज़ किया जाता है, इसलिए इस प्रक्रिया का उपयोग Singletonपैटर्न को लागू करने के लिए भी किया जाता है। यदि आप किसी कारण से Enuma का उपयोग नहीं कर रहे हैं Singleton, तो आपके पास एक अच्छा विकल्प है। लेकिन इस मामले में, आपको यह ध्यान रखना चाहिए कि यह "आलसी" आरंभीकरण नहीं है। इसका मतलब यह है कि स्थैतिक क्षेत्र को किसी के "पूछने" से पहले भी आरंभ किया जाएगा। यदि कोई वस्तु संसाधन-भारी है या शायद ही कभी उपयोग की जाती है, तो इसे स्थिर ब्लॉक में प्रारंभ करना आपके पक्ष में काम नहीं करेगा।

  9. क्रमांकन के दौरान, स्थैतिक क्षेत्र, जैसे transientचर, क्रमबद्ध नहीं होते हैं। दरअसल, यदि आप किसी डेटा को स्टैटिक फील्ड में सेव करते हैं, तो इसमें डिसेरिएलाइजेशन के बाद इसका शुरुआती (डिफॉल्ट) वैल्यू होगा। उदाहरण के लिए, यदि एक स्थिर क्षेत्र एक है int, तो इसका मान अक्रमांकन के बाद शून्य होगा। यदि इसका प्रकार है float, तो मान 0.0 होगा। यदि फ़ील्ड एक है Object, तो मान होगा null। ईमानदार होने के लिए, यह जावा पदों के साक्षात्कार में क्रमबद्धता के बारे में अक्सर पूछे जाने वाले प्रश्नों में से एक है। एक स्थिर क्षेत्र में आवश्यक वस्तु डेटा संग्रहीत न करें!

  10. अंत में, स्थैतिक आयात के बारे में बात करते हैं। इस संशोधक में मानक कथन के साथ बहुत कुछ समान है import, लेकिन यह अलग है कि यह आपको एक या सभी स्थिर वर्ग सदस्यों को आयात करने देता है। एक बार स्टैटिक मेथड्स इम्पोर्ट हो जाने के बाद, उन्हें एक्सेस किया जा सकता है जैसे कि उन्हें एक ही क्लास में घोषित किया गया हो। इसी तरह, स्थैतिक क्षेत्रों को आयात करके, हम उन्हें वर्ग नाम निर्दिष्ट किए बिना एक्सेस कर सकते हैं। यह सुविधा जावा 1.5 में दिखाई दी और ठीक से उपयोग किए जाने पर कोड की पठनीयता में सुधार करती है। यह निर्माण अक्सर जुनीट परीक्षणों में पाया जाता है, क्योंकि लगभग सभी परीक्षण डेवलपर्स जोरदार तरीकों के लिए स्थिर आयात का उपयोग करते हैं, उदाहरण के लिए assertEquals()और उनके ओवरलोडेड वेरिएंट।

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

टिप्पणियां
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION