नमस्ते! हम जावा में नेस्टेड कक्षाओं के विषय का पता लगाना जारी रखते हैं। पिछले अभ्यास में, हमने गैर-स्थैतिक नेस्टेड कक्षाओं के बारे में बात की थी, जिन्हें आंतरिक कक्षाओं के रूप में भी जाना जाता है। स्टेटिक नेस्टेड क्लासेस - 1आज हम कक्षाओं के दूसरे समूह की ओर बढ़ते हैं। हम स्टैटिक नेस्टेड क्लासेस पर विचार करेंगे। स्टेटिक नेस्टेड क्लासेस - 3वे अन्य वर्गों से कैसे भिन्न हैं? इस प्रकार की कक्षा की घोषणा करते समय, हम स्थैतिक कीवर्ड का उपयोग करते हैं, जिससे आप पहले से ही परिचित हैं:

public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {
      
       public static int getMaxPassengersCount() {
          
           return maxPassengersCount;
       }
   }
}
स्टेटिक नेस्टेड क्लासेस - 4इस उदाहरण में, हमारे पास Boeing737बाहरी वर्ग है, जो इस प्रकार के हवाई जहाज का प्रतिनिधित्व करता है। इसमें एक पैरामीटर वाला कंस्ट्रक्टर है: निर्माण का वर्ष ( int manufactureYear)। एक स्थिर चर भी है: यात्रियों की अधिकतम संख्या ( int maxPassengersCount)। इसका एक ही मॉडल के सभी विमानों के लिए समान मूल्य होगा, इसलिए हमें केवल एक उदाहरण की आवश्यकता है। इसके अतिरिक्त, इसमें एक स्थिर नेस्टेड वर्ग है: Drawing(विमान के इंजीनियरिंग ब्लूप्रिंट का प्रतिनिधित्व)। हम इस वर्ग का उपयोग विमान के बारे में सभी आधिकारिक सूचनाओं को समाहित करने के लिए करते हैं। हमारे उदाहरण में, सरलता के लिए, हमने इस वर्ग को निर्माण के वर्ष तक सीमित कर दिया है, लेकिन इसमें बहुत सी अन्य जानकारी हो सकती है। स्टेटिक नेस्टेड क्लासेस - 5जैसा कि हमने पिछले पाठ में कहा था, इस तरह के नेस्टेड वर्ग बनाने से एनकैप्सुलेशन में सुधार होता है और अधिक यथार्थवादी अमूर्तता में योगदान होता है। स्टेटिक और नॉन-स्टैटिक नेस्टेड क्लास में क्या अंतर है? 1. स्थैतिक Drawingवर्ग की वस्तु बाहरी वर्ग के विशिष्ट उदाहरण के संदर्भ को संग्रहीत नहीं करती है। पिछले पाठ से साइकिल का उदाहरण याद रखें:

public class Bicycle {

   private String model;
   private int maxWeight;

   public Bicycle(String model, int maxWeight) {
       this.model = model;
       this.maxWeight = maxWeight;
   }
  
   public void start() {
       System.out.println("Let's go!");
   }

   public class Handlebar {

       public void right() {
           System.out.println("Steer right!");
       }

       public void left() {

           System.out.println("Steer left!");
       }
   }

}
उस पाठ में, हमने इस तथ्य के बारे में बात की थी कि आंतरिक वर्ग का प्रत्येक उदाहरण , हमारे लिए अगोचर रूप से, बाहरी वर्ग Handlebarके उदाहरण का संदर्भ देता है। Bicycleबाहरी वर्ग के उदाहरण के बिना, आंतरिक वर्ग की वस्तु का अस्तित्व ही नहीं हो सकता। स्थैतिक नेस्टेड कक्षाओं के लिए, यह मामला नहीं है। स्टैटिक नेस्टेड क्लास का एक ऑब्जेक्ट अपने दम पर मौजूद रहने में पूरी तरह से सक्षम है। इस संबंध में, स्थैतिक वर्ग गैर स्थैतिक से अधिक "स्वतंत्र" हैं। आपको केवल यह जानने की आवश्यकता है कि ऐसी वस्तु बनाते समय, आपको बाहरी वर्ग का नाम निर्दिष्ट करना होगा:

public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
हमने Drawingकक्षा को स्थिर क्यों बनाया जबकि पिछले पाठ में हमनेSeatकक्षा (साइकिल सीट का प्रतिनिधित्व) गैर स्थैतिक? पिछली बार की तरह, आइए उदाहरण को समझने के लिए थोड़ा "दर्शन" जोड़ें :) एक साइकिल की सीट के विपरीत, एक इंजीनियरिंग ड्राइंग की अवधारणा एक विमान की अवधारणा से कठोरता से बंधी नहीं है। साइकिल के बिना, एक अलग साइकिल सीट वस्तु अक्सर अर्थहीन होगी (हालांकि हमेशा नहीं, हमने इसके बारे में पिछले पाठ में बात की थी)। एक इंजीनियरिंग ड्राइंग की अवधारणा अपने आप समझ में आती है। उदाहरण के लिए, यह हवाई जहाज के रखरखाव की योजना बनाने वाले इंजीनियरों के लिए उपयोगी हो सकता है। योजना बनाने के लिए हवाई जहाज की जरूरत नहीं है और इसे कहीं भी स्थित किया जा सकता है। केवल इंजीनियरिंग ड्राइंग की जरूरत है। इसके अलावा, एक ही मॉडल के सभी विमानों में एक ही इंजीनियर ड्राइंग होगी, इसलिए साइकिल की सीट के साथ ऐसा कोई कड़ा संबंध नहीं है। इसलिए, एDrawingऑब्जेक्ट को किसी विशिष्ट हवाई जहाज ऑब्जेक्ट के संदर्भ की आवश्यकता नहीं होती है। 2. बाहरी वर्ग के चर और तरीकों की अलग-अलग पहुंच। एक स्थिर नेस्टेड वर्ग केवल बाहरी वर्ग के स्थिर क्षेत्रों तक ही पहुँच सकता है। हमारे उदाहरण में, Drawingकक्षा में एक विधि है जो बाहरी वर्ग के getMaxPassengersCount()स्थिर चर का मान लौटाती है । हालाँकि, हम का मान वापस करने के लिए कक्षा में maxPassengersCountकोई विधि नहीं बना सकते हैं । आखिरकार, चर गैर-स्थैतिक है, जिसका अर्थ है कि यह एक विशिष्ट उदाहरण से संबंधित होना चाहिए । और जैसा कि हम पहले ही खोज चुके हैं, स्थिर नेस्टेड कक्षाओं के मामले में, बाहरी वर्ग की वस्तु आसानी से अनुपस्थित हो सकती है। इसलिए, सीमा :) इससे कोई फर्क नहीं पड़ता कि बाहरी कक्षा में एक स्थिर चर के पास कौन सा एक्सेस संशोधक है। यहां तक ​​कि अगर यह होता हैgetManufactureYear()DrawingmanufactureYearmanufactureYearBoeing737private, स्थिर नेस्टेड वर्ग के पास अभी भी पहुंच होगी। उपरोक्त सभी न केवल स्थैतिक चर तक पहुँचने के लिए लागू होते हैं, बल्कि स्थैतिक तरीकों पर भी लागू होते हैं। महत्वपूर्ण! आंतरिक वर्ग की घोषणा में, staticकीवर्ड का अर्थ यह नहीं है कि आप केवल एक वस्तु बना सकते हैं। वस्तुओं को चर के साथ भ्रमित न करें। यदि हम स्थैतिक चर के बारे में बात कर रहे हैं, तो, हाँ, स्थैतिक वर्ग चर का एक ही उदाहरण मौजूद है, उदाहरण के लिए, maxPassangersCount. लेकिन जब staticनेस्टेड क्लास पर लागू किया जाता है, तो इसका मतलब केवल यह है कि इसकी वस्तुओं में बाहरी वर्ग की वस्तुओं के संदर्भ नहीं होते हैं। और हम जितने चाहें उतने ऑब्जेक्ट स्वयं बना सकते हैं:

public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

       private int id;

       public Drawing(int id) {
           this.id = id;
       }

       public static int getPassengersCount() {

           return maxPassengersCount;
       }

       @Override
       public String toString() {
           return "Drawing{" +
                   "id=" + id +
                   '}';
       }

       public static void main(String[] args) {

           for (int i = 1; i < 6; i++) {

               Boeing737.Drawing drawing = new Boeing737.Drawing(i);
               System.out.println(drawing);
           }
       }
   }
}
हमने main()विधि को सीधे नेस्टेड क्लास में घोषित किया (इसका कोई विशेष कारण नहीं है - केवल आपको यह बताने के लिए कि यह संभव है), और 5 Drawingऑब्जेक्ट बनाए। इस तथ्य के बावजूद कि हमारे पास बाहरी वर्ग की एक भी वस्तु नहीं है। जैसा कि आप देख सकते हैं, इससे कोई समस्या नहीं हुई :) कंसोल आउटपुट:

Drawing{id=1} 
Drawing{id=2} 
Drawing{id=3} 
Drawing{id=4} 
Drawing{id=5}
और इससे हमारा पाठ समाप्त होता है! किसी भी स्थिति में, मैं आपको Oracle दस्तावेज़ीकरण में उनके बारे में अनुभाग के लिए एक लिंक छोड़ दूँगा । यदि अब भी कुछ अस्पष्ट रह गया हो तो उसे पढ़ लें। अब मेरे लिए कुछ कार्यों को हल करने का समय आ गया है! :)