CodeGym /Java Blog /अनियमित /जावा स्कोप
John Squirrels
स्तर 41
San Francisco

जावा स्कोप

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

जावा स्कोप सामान्य रूप से

चर और विधियों के दायरे को अलग करना क्यों आवश्यक है? तथ्य यह है कि कभी-कभी कार्यक्रम बहुत बड़े होते हैं और एक या दूसरे चर को ट्रैक करना मुश्किल हो सकता है। इसके अलावा, बड़ी परियोजनाओं में, चरों का स्पष्ट नामकरण वांछनीय है ताकि यह स्पष्ट हो कि वे किस लिए हैं। स्कोप विशेष रूप से आपको प्रोग्राम के विभिन्न हिस्सों में एक ही नाम के साथ अलग-अलग वैरिएबल रखने की अनुमति देता है। इस तरह के कोड को बनाए रखना और पढ़ना आसान है। जावा स्कोप परिभाषित करता है कि एक प्रोग्राम में एक निश्चित चर या विधि कहाँ पहुँच योग्य है। संक्षेप में:
  • एक विधि में घोषित एक चर घोषणा की शुरुआत से विधि के अंत तक (विधि का दायरा) दिखाई देता है।
  • कोड ब्लॉक में घोषित चर उस कोड ब्लॉक के अंत तक मौजूद रहता है।
  • वेरिएबल्स जो विधि तर्क हैं विधि के अंत तक मौजूद हैं।
  • क्लास/ऑब्जेक्ट चर युक्त ऑब्जेक्ट के जीवनकाल के लिए मौजूद हैं। उनकी दृश्यता को विशेष एक्सेस संशोधक द्वारा नियंत्रित किया जाता है।
  • प्रोग्राम चलने पर हर समय स्टेटिक क्लास वेरिएबल्स मौजूद होते हैं। उनकी दृश्यता भी एक्सेस संशोधक द्वारा निर्धारित की जाती है।

विधि स्तर का दायरा

किसी विधि में घोषित कोई भी चर, जिसमें तर्क शामिल हैं, उस विधि के बाहर पहुँच योग्य नहीं है। विधियों के अंदर घोषित सभी चर उनकी घोषणा की शुरुआत से विधि के अंत तक दिखाई देते हैं। यहाँ विधि चर दायरे का एक उदाहरण दिया गया है:

public class JScopeTest1 {


   public static void main(String[] args) {

       System.out.println(myMethod(5));
       System.out.println(myMethod(17));

   }
   public static int  myMethod(int arg) {
       int secondArg = 100; //local method variable
       return secondArg + arg;
   }
}
यहां हमारे पास दूसरा आर्ग है , एक स्थानीय चर या विधि तर्क। हम इस चर का उपयोग myMethod विधि के बाहर या घोषित होने से पहले नहीं कर सकते । यदि एक चर एक कार्य तर्क है, तो यह इस पद्धति के पूरे शरीर में दिखाई देता है। उपरोक्त उदाहरण में हमारे पास ऐसे दो तर्क हैं: myMethod में arg और main मेथड में args।

कक्षा स्तर का दायरा

क्लास-लेवल स्कोप (इंस्टेंस वेरिएबल्स) - किसी क्लास में घोषित कोई भी वेरिएबल उस क्लास के सभी तरीकों के लिए उपलब्ध है। इसके एक्सेस संशोधक (यानी सार्वजनिक या निजी) के आधार पर, इसे कभी-कभी कक्षा के बाहर भी एक्सेस किया जा सकता है। इसलिए यदि एक चर एक वर्ग चर है, तो यह एक विशिष्ट वस्तु से बंधा होता है और तब तक मौजूद रहता है जब तक कि इस वर्ग का एक वस्तु है। यदि कोई वस्तु नहीं है, तो चर की कोई प्रति नहीं है। चर वर्ग के सभी तरीकों से दिखाई देता है, भले ही वे इसके पहले या बाद में घोषित किए गए हों। प्रत्येक वस्तु का अपना चर अन्य वस्तुओं से स्वतंत्र होता है। स्थैतिक तरीकों से एक चर तक पहुँच संभव नहीं है।

कोड उदाहरण


public class Student {
   
//class level variables
   public String surname;
   String name;
   String secondName;
   private Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }

   @Override
   public int hashCode(){
       //TODO: check for nulls
       //return surname.hashCode() ^ name.hashCode() ^ secondName.hashCode() ^ (birthday.hashCode());
       return (surname + name + secondName + birthday).hashCode();
   }
   @Override
   public boolean equals(Object other_) {
       Student other = (Student)other_;
       return (surname == null || surname.equals(other.surname) )
               && (name == null || name.equals(other.name))
               && (secondName == null || secondName.equals(other.secondName))
               && (birthday == null || birthday.equals(other.birthday));
   }
}
उपनाम , नाम , दूसरा नाम और जन्मदिन आवृत्ति चर हैं।

ब्लॉक स्कोप

यदि किसी चर को कोड के किसी ब्लॉक में परिभाषित/घोषित किया जाता है, तो यह कोड के उस ब्लॉक के अंत तक मौजूद रहता है। आमतौर पर, ऐसे चर घुंघराले ब्रेसिज़ के बीच मौजूद होते हैं जिनमें उन्हें परिभाषित किया जाता है। बहुत बार ब्लॉक स्कोप एक लूप वैरिएबल हो सकता है। एक वेरिएबल जिसे for लूप कंडीशन में घोषित किया गया है, लूप के बाहर एक्सेस नहीं किया जा सकता है, जब तक कि आपने इसे पहले से परिभाषित नहीं किया हो।

public class JScopeTest2 {
   public static void main(String[] args) {
       for (int i = 0; i < 10; i++) {
           int sum = 0;
           sum = sum + i;
       }
      
       int sum = 1;
       System.out.println(sum);
   }
}
पहला योग और i चर दोनों लूप के अंदर घोषित किए गए हैं और इस लूप के बाहर मौजूद नहीं हैं। हालाँकि दूसरा योग लूप के बाहर घोषित किया गया था इसलिए यह विशेष चर मुद्रित होने वाला है।

स्थैतिक चर

यदि एक चर को स्थिर (स्थिर कीवर्ड के साथ चिह्नित) के रूप में घोषित किया जाता है, तो यह तब तक मौजूद रहता है जब तक इसकी कक्षा मौजूद रहती है। आमतौर पर, जेवीएम पहले उपयोग पर एक वर्ग को स्मृति में लोड करता है, जब स्थैतिक चर प्रारंभ होते हैं।

import java.util.Date;

public class Student {
   public static int today = 2022;
   String surname;
   String name;
   String secondName;
   Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }

 
   public static void main(String[] args) {
       System.out.println(today);
   }

}
स्थैतिक आज चर का उपयोग करने के लिए आपको छात्र वर्ग का एक नया उदाहरण नहीं बनाना चाहिए । यहां "2022" छपा होगा।

एक्सेस संशोधक

विधि या चर तक पहुंच को प्रतिबंधित करने के लिए जावा में 4 एक्सेस संशोधक हैं। आप उन्हें कक्षाओं के अंदर उपयोग कर सकते हैं, तरीकों के अंदर नहीं।
  • निजी सबसे अधिक प्रतिबंधात्मक संशोधक है। यह घोषित किए गए वर्ग के तरीकों और चरों तक पहुंच को प्रतिबंधित करता है। यदि कक्षा के बाहर कुछ विधियों या चरों का उपयोग करने की आवश्यकता नहीं है, तो निजी का उपयोग करें। जावा में वर्ग चर आमतौर पर निजी होते हैं।

  • यदि कोई एक्सेस संशोधक निर्दिष्ट नहीं है, तो विधि या चर डिफ़ॉल्ट संशोधक को स्वीकार करेगा। डिफ़ॉल्ट केवल वर्तमान पैकेज से पहुंच की अनुमति देता है।

  • संरक्षित संशोधक किसी विधि या चर को केवल वर्तमान पैकेज के भीतर से एक्सेस करने की अनुमति देता है, जब तक कि इसे पैकेज के बाहर चाइल्ड क्लास के माध्यम से एक्सेस नहीं किया जाता है।

  • सार्वजनिक कम से कम प्रतिबंधात्मक संशोधक है। यह आपको न केवल उस वर्ग से, बल्कि बाहर से भी एक वर्ग, विधि या चर का उपयोग करने की अनुमति देता है। यह संशोधक वास्तव में अक्सर प्रयोग किया जाता है।

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