count
फ़ील्ड कक्षा में स्थिर है Counter
, तो इसका मतलब है कि आप चर को निम्न अभिव्यक्ति के साथ संदर्भित कर सकते हैं: Counter.count
. बेशक, एक्सेस संशोधक पर विचार किया जाना चाहिए। उदाहरण के लिए, private
फ़ील्ड केवल उस कक्षा में उपलब्ध हैं जिसमें वे घोषित किए गए हैं। और protected
फ़ील्ड पैकेज के भीतर सभी वर्गों के साथ-साथ पैकेज के बाहर उनके सभी उपवर्गों के लिए उपलब्ध हैं। मान लीजिए कि Counter
कक्षा में एक स्थिर increment()
विधि है जिसका काम वेतन वृद्धि करना हैcount
मैदान। इस विधि को कॉल करने के लिए आप उपयोग कर सकते हैं Counter.increment()
। Counter
स्थैतिक क्षेत्र या विधि तक पहुँचने के लिए कक्षा का एक उदाहरण बनाने की आवश्यकता नहीं है । यह स्थैतिक (वर्ग) चर और विधियों और गैर-स्थैतिक (उदाहरण) चर और विधियों के बीच मूलभूत अंतर है। एक महत्वपूर्ण नोट। यह मत भूलो कि कक्षा के स्थिर सदस्य सीधे वर्ग के हैं, न कि कक्षा का कोई उदाहरण। अर्थात्, स्थैतिक चर का मान सभी वस्तुओं count
के लिए समान होगा । Counter
इस लेख में, हम जावा में स्थैतिक संशोधक का उपयोग करने के मूलभूत पहलुओं के साथ-साथ कुछ विशेषताओं को देखेंगे जो आपको प्रमुख प्रोग्रामिंग अवधारणाओं को समझने में मदद करेंगे।
जावा में स्थिर संशोधक के बारे में प्रत्येक प्रोग्रामर को क्या पता होना चाहिए।
इस खंड में, हम स्थैतिक तरीकों, क्षेत्रों और कक्षाओं का उपयोग करने के मुख्य पहलुओं को देखते हैं। चलिए चरों के साथ शुरू करते हैं।-
आप किसी स्थिर संदर्भ में किसी वर्ग के गैर-स्थैतिक सदस्यों तक नहीं पहुँच सकते, जैसे कि स्थैतिक विधि या ब्लॉक। नीचे दिए गए कोड को संकलित करने से त्रुटि होगी:
public class Counter { private int count; public static void main(String args []) { System.out.println(count); // Compile time error } }
यह जावा प्रोग्रामर्स द्वारा की जाने वाली सबसे आम गलतियों में से एक है, खासकर नौसिखियों द्वारा। चूंकि
main
विधि स्थिर है औरcount
चर नहीं है, विधिprintln
के अंदर विधि का उपयोग करनेmain
से "संकलन समय त्रुटि" उत्पन्न होगी। -
स्थानीय चर के विपरीत, स्थैतिक क्षेत्र और विधियाँ
thread safe
जावा में नहीं हैं। व्यवहार में, यह बहु-थ्रेडेड प्रोग्रामिंग में सुरक्षा समस्याओं के सबसे लगातार कारणों में से एक है। यह देखते हुए कि एक वर्ग का प्रत्येक उदाहरण एक स्थिर चर की एक ही प्रति को संदर्भित करता है, ऐसे चर को कक्षा द्वारा संरक्षित या "लॉक" करने की आवश्यकता होती है। इसलिए, स्थैतिक चर का उपयोग करते समय, सुनिश्चित करें कि वे ठीक से हैंsynchronized
जैसे कि समस्याओं से बचने के लिएrace conditions
। -
स्थैतिक विधियों का व्यावहारिक लाभ यह है कि हर बार जब आप उन्हें कॉल करना चाहते हैं तो एक नई वस्तु बनाने की आवश्यकता नहीं होती है। एक स्थिर विधि को घोषित करने वाले वर्ग के नाम का उपयोग करके कहा जा सकता है। इसलिए ये तरीके
factory
तरीकों औरutility
विधियों के लिए एकदम सही हैं। वर्गjava.lang.Math
एक अद्भुत उदाहरण है: इसकी लगभग सभी विधियाँ स्थिर हैं। जावा की उपयोगिता कक्षाएंfinal
उसी कारण से चिह्नित हैं। -
@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
कहा जाता है, क्योंकि विधि को संकलन समय पर बुलाया गया था। और ध्यान दें कि कोई संकलन त्रुटियां नहीं थीं! -
क्या अधिक है, शीर्ष-स्तरीय कक्षाओं के अलावा, आप कक्षाओं को स्थिर घोषित कर सकते हैं। ऐसी कक्षाओं के रूप में जाना जाता है
nested static classes
। वे बेहतर सामंजस्य प्रदान करने के लिए उपयोगी हैं। नेस्टेड स्टैटिक क्लास का एक आकर्षक उदाहरण हैHashMap.Entry
, जो अंदर एक डेटा संरचना हैHashMap
। यह ध्यान देने योग्य है कि, आंतरिक कक्षाओं की तरह, स्थिर नेस्टेड कक्षाएं एक अलग .class फ़ाइल में घोषित की जाती हैं। इस प्रकार, यदि आप अपनी मुख्य कक्षा में पाँच नेस्टेड कक्षाएं घोषित करते हैं, तो आपके पास .class एक्सटेंशन वाली 6 फाइलें होंगी। एक अन्य उदाहरण हमारी अपनी घोषणा हैComparator
, जैसे कि कक्षाAgeComparator
में आयु तुलनित्र ( ) ।Employee
-
स्थैतिक संशोधक को स्थिर ब्लॉक में भी निर्दिष्ट किया जा सकता है, जिसे "स्थैतिक प्रारंभिक ब्लॉक" के रूप में जाना जाता है, जिसे क्लास लोड होने पर निष्पादित किया जाता है। यदि आप इस तरह के ब्लॉक की घोषणा नहीं करते हैं, तो जावा सभी स्थिर क्षेत्रों को एक सूची में एकत्रित करता है और कक्षा लोड होने पर उन्हें प्रारंभ करता है। एक स्थिर ब्लॉक चेक किए गए अपवादों को नहीं फेंक सकता है, लेकिन यह अनियंत्रित लोगों को फेंक सकता है। इस मामले में, एक
ExceptionInInitializerError
घटित होगा। व्यवहार में, स्थैतिक क्षेत्रों के आरंभीकरण के दौरान होने वाले किसी भी अपवाद को जावा द्वारा इस त्रुटि में लपेटा जाएगा। यह का सबसे आम कारण भी हैNoClassDefFoundError
, क्योंकि संदर्भित होने पर कक्षा स्मृति में नहीं होगी। -
यह जानना उपयोगी है कि स्थिर विधियों को संकलित समय पर जोड़ा जाता है, आभासी या गैर-स्थैतिक विधियों के लिंक के विपरीत, जो वास्तविक समय पर कॉल किए जाने पर रन टाइम से जुड़े होते हैं। तदनुसार, जावा में स्थैतिक तरीकों को ओवरराइड नहीं किया जा सकता है, क्योंकि रन टाइम पर बहुरूपता उन पर लागू नहीं होती है। विधि स्थिर घोषित करते समय विचार करने के लिए यह एक महत्वपूर्ण सीमा है। ऐसा करना तभी समझ में आता है जब उपवर्ग में विधि को ओवरराइड करने की क्षमता या आवश्यकता नहीं होती है। फ़ैक्टरी विधियाँ और उपयोगिता विधियाँ स्थैतिक संशोधक के उचित उपयोग के अच्छे उदाहरण हैं। जोशुआ बलोच ने अपनी पुस्तक इफेक्टिव जावा में कंस्ट्रक्टर्स की तुलना में स्टैटिक फैक्ट्री विधियों के कई फायदे बताए हैं, जो प्रत्येक जावा प्रोग्रामर के लिए पढ़ना अनिवार्य है।
-
प्रारंभ एक स्थिर ब्लॉक का एक महत्वपूर्ण पहलू है। क्लास को मेमोरी में लोड करने के बाद स्टेटिक फील्ड या वेरिएबल्स को इनिशियलाइज़ किया जाता है। इनिशियलाइज़ेशन का क्रम ऊपर से नीचे तक होता है, उसी क्रम में जिसमें वे जावा क्लास की सोर्स फ़ाइल में घोषित किए जाते हैं। चूँकि स्टैटिक फील्ड्स को थ्रेड-सेफ तरीके से इनिशियलाइज़ किया जाता है, इसलिए इस प्रक्रिया का उपयोग
Singleton
पैटर्न को लागू करने के लिए भी किया जाता है। यदि आप किसी कारण सेEnum
a का उपयोग नहीं कर रहे हैंSingleton
, तो आपके पास एक अच्छा विकल्प है। लेकिन इस मामले में, आपको यह ध्यान रखना चाहिए कि यह "आलसी" आरंभीकरण नहीं है। इसका मतलब यह है कि स्थैतिक क्षेत्र को किसी के "पूछने" से पहले भी आरंभ किया जाएगा। यदि कोई वस्तु संसाधन-भारी है या शायद ही कभी उपयोग की जाती है, तो इसे स्थिर ब्लॉक में प्रारंभ करना आपके पक्ष में काम नहीं करेगा। -
क्रमांकन के दौरान, स्थैतिक क्षेत्र, जैसे
transient
चर, क्रमबद्ध नहीं होते हैं। दरअसल, यदि आप किसी डेटा को स्टैटिक फील्ड में सेव करते हैं, तो इसमें डिसेरिएलाइजेशन के बाद इसका शुरुआती (डिफॉल्ट) वैल्यू होगा। उदाहरण के लिए, यदि एक स्थिर क्षेत्र एक हैint
, तो इसका मान अक्रमांकन के बाद शून्य होगा। यदि इसका प्रकार हैfloat
, तो मान 0.0 होगा। यदि फ़ील्ड एक हैObject
, तो मान होगाnull
। ईमानदार होने के लिए, यह जावा पदों के साक्षात्कार में क्रमबद्धता के बारे में अक्सर पूछे जाने वाले प्रश्नों में से एक है। एक स्थिर क्षेत्र में आवश्यक वस्तु डेटा संग्रहीत न करें! -
अंत में, स्थैतिक आयात के बारे में बात करते हैं। इस संशोधक में मानक कथन के साथ बहुत कुछ समान है
import
, लेकिन यह अलग है कि यह आपको एक या सभी स्थिर वर्ग सदस्यों को आयात करने देता है। एक बार स्टैटिक मेथड्स इम्पोर्ट हो जाने के बाद, उन्हें एक्सेस किया जा सकता है जैसे कि उन्हें एक ही क्लास में घोषित किया गया हो। इसी तरह, स्थैतिक क्षेत्रों को आयात करके, हम उन्हें वर्ग नाम निर्दिष्ट किए बिना एक्सेस कर सकते हैं। यह सुविधा जावा 1.5 में दिखाई दी और ठीक से उपयोग किए जाने पर कोड की पठनीयता में सुधार करती है। यह निर्माण अक्सर जुनीट परीक्षणों में पाया जाता है, क्योंकि लगभग सभी परीक्षण डेवलपर्स जोरदार तरीकों के लिए स्थिर आयात का उपयोग करते हैं, उदाहरण के लिएassertEquals()
और उनके ओवरलोडेड वेरिएंट। -
अभी के लिए इतना ही। प्रत्येक जावा प्रोग्रामर को ऊपर बताए गए स्थिर संशोधक के सभी पहलुओं को जानना आवश्यक है। इस लेख ने स्थैतिक चर, फ़ील्ड्स, विधियों, आरंभीकरण ब्लॉकों और आयातों के बारे में बुनियादी जानकारी की समीक्षा की। इसने कुछ महत्वपूर्ण गुणों को भी छुआ जो जावा प्रोग्राम लिखने और समझने के लिए आवश्यक हैं। मुझे आशा है कि प्रत्येक डेवलपर स्थैतिक सदस्यों के अपने कुशल उपयोग को पूरा करेगा, क्योंकि गंभीर सॉफ्टवेयर विकास के लिए यह बहुत महत्वपूर्ण है।"
GO TO FULL VERSION