Java मध्ये, स्टॅटिक मॉडिफायर म्हणजे काहीतरी थेट वर्गाशी संबंधित आहे: जर फील्ड स्थिर असेल तर ते वर्गाशी संबंधित आहे; जर पद्धत स्थिर असेल तर ती वर्गाची आहे. परिणामी, तुम्ही स्टॅटिक पद्धत कॉल करण्यासाठी किंवा स्टॅटिक फील्डचा संदर्भ देण्यासाठी वर्गाचे नाव वापरू शकता. उदाहरणार्थ, countवर्गामध्ये फील्ड स्टॅटिक असल्यास Counter, याचा अर्थ तुम्ही खालील अभिव्यक्तीसह व्हेरिएबलचा संदर्भ घेऊ शकता: Counter.count. Java मधील स्टॅटिक मॉडिफायरबद्दल तुम्हाला 10 गोष्टी माहित असणे आवश्यक आहे - 1अर्थात, प्रवेश सुधारकांचा विचार करणे आवश्यक आहे. उदाहरणार्थ, privateफील्ड फक्त त्या वर्गात उपलब्ध आहेत ज्यामध्ये ते घोषित केले गेले आहेत. आणि protectedफील्ड पॅकेजमधील सर्व वर्गांसाठी तसेच पॅकेजच्या बाहेरील त्यांच्या सर्व उपवर्गांसाठी उपलब्ध आहेत. समजा Counterवर्गाकडे एक स्थिर increment()पद्धत आहे ज्याचे कार्य वाढवणे आहेcountफील्ड ही पद्धत कॉल करण्यासाठी, आपण वापरू शकता Counter.increment(). Counterस्टॅटिक फील्ड किंवा पद्धतीमध्ये प्रवेश करण्यासाठी वर्गाचे उदाहरण तयार करण्याची आवश्यकता नाही . स्टॅटिक (क्लास) व्हेरिएबल्स आणि मेथड्स आणि नॉन-स्टॅटिक (इंस्टन्स) व्हेरिएबल्स आणि पद्धतींमध्ये हा मूलभूत फरक आहे. एक महत्वाची नोंद. हे विसरू नका की वर्गातील स्थिर सदस्य थेट वर्गाशी संबंधित आहेत, वर्गाचे कोणतेही उदाहरण नाही. म्हणजेच, स्टॅटिक countव्हेरिएबलचे मूल्य सर्व ऑब्जेक्ट्ससाठी समान असेल Counter. या लेखात, आम्ही Java मधील स्टॅटिक मॉडिफायर वापरण्याच्या मूलभूत बाबी तसेच काही वैशिष्ट्यांचा विचार करू ज्या तुम्हाला मुख्य प्रोग्रामिंग संकल्पना समजून घेण्यास मदत करतील.

Java मधील स्टॅटिक मॉडिफायरबद्दल प्रत्येक प्रोग्रामरला काय माहित असले पाहिजे.

या विभागात, आम्ही स्थिर पद्धती, फील्ड आणि वर्ग वापरण्याचे मुख्य पैलू पाहतो. चला व्हेरिएबल्सपासून सुरुवात करूया.
  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स्थानिक व्हेरिएबल्सच्या विपरीत, स्टॅटिक फील्ड आणि पद्धती Java मध्ये नाहीत . व्यवहारात, मल्टी-थ्रेडेड प्रोग्रामिंगमधील सुरक्षा समस्यांचे हे सर्वात वारंवार कारणांपैकी एक आहे. क्लासच्या प्रत्येक उदाहरणात स्टॅटिक व्हेरिएबलची समान प्रत संदर्भित करते हे लक्षात घेता, अशा व्हेरिएबलला वर्गाने संरक्षित किंवा "लॉक" करणे आवश्यक आहे. म्हणून, स्टॅटिक व्हेरिएबल्स वापरताना, synchronizedसारख्या समस्या टाळण्यासाठी ते योग्यरित्या असल्याची खात्री करा race conditions.

  3. स्टॅटिक पद्धतींचा एक व्यावहारिक फायदा आहे की प्रत्येक वेळी आपण त्यांना कॉल करू इच्छित असताना नवीन ऑब्जेक्ट तयार करण्याची आवश्यकता नाही. एक स्थिर पद्धत घोषित करणार्‍या वर्गाचे नाव वापरून म्हटले जाऊ शकते. म्हणूनच या पद्धती factoryपद्धती आणि utilityपद्धतींसाठी योग्य आहेत. वर्ग java.lang.Mathएक अद्भुत उदाहरण आहे: त्याच्या जवळजवळ सर्व पद्धती स्थिर आहेत. Java चे उपयुक्तता वर्ग finalत्याच कारणासाठी चिन्हांकित केले आहेत.

  4. @Overrideदुसरा महत्त्वाचा मुद्दा असा आहे की तुम्ही ( ) स्थिर पद्धती ओव्हरराइड करू शकत नाही . तुम्ही अशी पद्धत a मध्ये घोषित केल्यास 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);
      }
    }
    

    कन्सोल आउटपुट:

    पालक वर्ग / स्थिर पद्धत आत

    कोड स्पष्टपणे दर्शवितो की ऑब्जेक्ट a आहे हे असूनही Car, क्लासमधील स्टॅटिक पद्धत Vehicleकॉल केली जाते, कारण पद्धत कंपाइलच्या वेळी कॉल केली गेली होती. आणि लक्षात घ्या की संकलित त्रुटी नाहीत!

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

  6. स्टॅटिक मॉडिफायरला स्टॅटिक ब्लॉकमध्ये देखील निर्दिष्ट केले जाऊ शकते, ज्याला "स्टॅटिक इनिशियलायझेशन ब्लॉक" म्हणून ओळखले जाते, जे क्लास लोड केल्यावर कार्यान्वित केले जाते. तुम्ही असा ब्लॉक घोषित न केल्यास, Java सर्व स्टॅटिक फील्ड्स एका सूचीमध्ये एकत्रित करते आणि क्लास लोड झाल्यावर त्यांना आरंभ करते. स्थिर ब्लॉक चेक केलेले अपवाद टाकू शकत नाही, परंतु तो अनचेक केलेले अपवाद टाकू शकतो. या प्रकरणात, एक ExceptionInInitializerErrorहोईल. प्रॅक्टिसमध्ये, स्टॅटिक फील्ड्सच्या इनिशिएलायझेशन दरम्यान उद्भवणारा कोणताही अपवाद Java द्वारे या त्रुटीमध्ये गुंडाळला जाईल. हे देखील सर्वात सामान्य कारण आहे NoClassDefFoundError, कारण जेव्हा त्याचा संदर्भ दिला जातो तेव्हा वर्ग मेमरीमध्ये राहणार नाही.

  7. हे जाणून घेणे उपयुक्त आहे की स्थिर पद्धती कंपाइलच्या वेळी जोडल्या जातात, आभासी किंवा नॉन-स्टॅटिक पद्धतींच्या लिंकिंगच्या विपरीत, ज्या वास्तविक ऑब्जेक्टवर कॉल केल्यावर रन टाइममध्ये जोडल्या जातात. त्यानुसार, जावामध्ये स्टॅटिक पद्धती ओव्हरराइड केल्या जाऊ शकत नाहीत, कारण रन टाइमवर पॉलिमॉर्फिझम लागू होत नाही. स्टॅटिक पद्धत घोषित करताना विचारात घेण्याची ही एक महत्त्वाची मर्यादा आहे. उपवर्गात पद्धत ओव्हरराइड करण्याची क्षमता किंवा गरज नसतानाच असे करणे अर्थपूर्ण आहे. स्टॅटिक मॉडिफायरच्या योग्य वापरासाठी फॅक्टरी पद्धती आणि उपयुक्तता पद्धती ही उत्तम उदाहरणे आहेत. जोशुआ ब्लॉच यांनी त्यांच्या Effective Java या पुस्तकात स्टॅटिक फॅक्टरी पद्धतींचे अनेक फायदे सांगितले आहेत, जे प्रत्येक Java प्रोग्रामरसाठी अनिवार्य वाचन आहे.

  8. इनिशियलायझेशन ही स्टॅटिक ब्लॉकची महत्त्वाची बाब आहे. क्लास मेमरीमध्ये लोड केल्यानंतर स्टॅटिक फील्ड किंवा व्हेरिएबल्स सुरू केले जातात. सुरुवातीचा क्रम वरपासून खालपर्यंत आहे, त्याच क्रमाने ते Java वर्गाच्या स्त्रोत फाइलमध्ये घोषित केले जातात. स्टॅटिक फील्ड्स थ्रेड-सेफ पद्धतीने सुरू केल्यामुळे, ही प्रक्रिया पॅटर्नची अंमलबजावणी करण्यासाठी देखील वापरली जाते Singleton. Enumतुम्ही काही कारणास्तव ए म्हणून वापरत नसल्यास Singleton, तुमच्याकडे एक चांगला पर्याय आहे. परंतु या प्रकरणात, आपण हे लक्षात घेतले पाहिजे की हे "आळशी" आरंभीकरण नाही. याचा अर्थ असा की कोणीतरी "विचारण्याआधी" देखील स्थिर फील्ड आरंभ केला जाईल. एखादी वस्तू संसाधन-जड असल्यास किंवा क्वचितच वापरली जात असल्यास, त्यास स्थिर ब्लॉकमध्ये प्रारंभ करणे आपल्या बाजूने कार्य करणार नाही.

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

  10. शेवटी, स्थिर आयात बद्दल बोलूया. या मॉडिफायरमध्ये स्टँडर्ड स्टेटमेंटमध्ये बरेच साम्य आहे import, परंतु हे वेगळे आहे की ते तुम्हाला एक किंवा सर्व स्टॅटिक क्लास सदस्यांना आयात करू देते. एकदा स्टॅटिक पद्धती आयात केल्यावर, त्या एकाच वर्गात घोषित केल्याप्रमाणे प्रवेश केल्या जाऊ शकतात. त्याचप्रमाणे, स्टॅटिक फील्ड इंपोर्ट करून, आम्ही क्लासचे नाव न सांगता त्यामध्ये प्रवेश करू शकतो. हे वैशिष्ट्य Java 1.5 मध्ये दिसले आणि योग्यरितीने वापरल्यास कोड वाचनीयता सुधारते. ही रचना बहुतेकदा JUnit चाचण्यांमध्ये आढळते, कारण जवळजवळ सर्व चाचणी विकसक दावा पद्धतींसाठी स्थिर आयात वापरतात, उदा. assertEquals()आणि त्यांचे ओव्हरलोड केलेले प्रकार.

  11. सध्या एवढेच. प्रत्येक जावा प्रोग्रामरला वर नमूद केलेल्या स्टॅटिक मॉडिफायरचे सर्व पैलू माहित असणे आवश्यक आहे. या लेखात स्टॅटिक व्हेरिएबल्स, फील्ड, पद्धती, इनिशियलायझेशन ब्लॉक्स आणि इंपोर्ट्स बद्दल मूलभूत माहितीचे पुनरावलोकन केले आहे. जावा प्रोग्राम्स लिहिण्यासाठी आणि समजून घेण्यासाठी जाणून घेणे आवश्यक असलेल्या काही महत्त्वाच्या गुणधर्मांना देखील ते स्पर्श करते. मला आशा आहे की प्रत्येक डेव्हलपर स्थिर सदस्यांचा कौशल्यपूर्ण वापर करेल, कारण गंभीर सॉफ्टवेअर डेव्हलपमेंटसाठी हे खूप महत्वाचे आहे."