1. आंतरिक वर्ग

आपने हाल ही में सीखा है कि स्थैतिक चर और स्थैतिक विधियाँ हैं। यह पता चला है कि स्थिर वर्ग भी हैं। लेकिन हम इस विषय पर दूर से संपर्क करेंगे।

जावा में, आपको पूरी तरह से कक्षाओं के भीतर कक्षाएं घोषित करने की अनुमति है। और कक्षाओं के भीतर कक्षाएं भी जो कक्षाओं के भीतर कक्षाओं के भीतर हैं। यह सब बहुत आसान लगता है:

class OuterClass
{
   variables of the class
   methods of the class

   class NestedClass
   {
      variables of the class
      methods of the class
   }
}

हम सिर्फ एक वर्ग को दूसरे के अंदर घोषित करते हैं। इतना सरल है।

उदाहरण:

public class Solution
{
   static ArrayList<Point> points = new ArrayList<Point>();

   public static void main(String[] args)
   {
      Point point = new Point();
      point.x = 100;
      point.y = 200;
      points.add(point);
   }

   static class Point
   {
      int x;
      int y;
   }
}

नेस्टेड क्लासेस स्टैटिक या नॉन-स्टैटिक हो सकती हैं। स्टेटिक नेस्टेड क्लासेस को स्टैटिक नेस्टेड क्लासेस कहा जाता है । नॉन-स्टैटिक नेस्टेड क्लासेस को इनर क्लासेस ( इनर क्लासेस ) कहा जाता है।



2. स्थिर वर्ग

स्टेटिक नेस्टेड क्लासेस को उनके बाहरी क्लास के बाहर इस्तेमाल किया जा सकता है। अगर ऐसी क्लास में पब्लिक एक्सेस मॉडिफायर है, तो इसे प्रोग्राम में कहीं भी इस्तेमाल किया जा सकता है। ऐसी कक्षाएं किसी भी सामान्य वर्ग से लगभग अप्रभेद्य होती हैं। लेकिन कुछ अंतर हैं।

कक्षा का नाम

यदि आप किसी स्थिर नेस्टेड वर्ग को उसकी बाहरी कक्षा के अलावा कहीं और से संदर्भित करना चाहते हैं, तो आपको कक्षा का नाम निर्दिष्ट करना होगा, जिसमें बाहरी वर्ग का नाम और नेस्टेड वर्ग का नाम शामिल है। यहाँ इस नाम का सामान्य रूप है:

OuterClass.InnerClass

उदाहरण:

बाहरी वर्ग नेस्टेड क्लास नेस्टेड क्लास का पूरा नाम
com.codegym.Solution
Point
com.codegym.Solution.Point
java.util.Map
Entry
java.util.Map.Entry
java.util.Files
DirectoryStream
java.util.Files.DirectoryStream
java.nio.WindowsPath
Closeable
java.nio.WindowsPath.Closeable

यदि एक नेस्टेड क्लास का अपना नेस्टेड क्लास है, तो उनके नाम केवल डॉट का उपयोग करके जुड़ जाते हैं।

JDK में नेस्टेड क्लास का एक विशिष्ट उदाहरण Entryक्लास के अंदर की Mapक्लास है। यदि आप किसी वस्तु में संग्रहीत की-वैल्यू पेयर का सेट प्राप्त करना चाहते हैं HashMap, तो उस entrySet()विधि का उपयोग करें, जो a लौटाती है ।Set<Map.Entry>

ध्यान दें कि एक बाहरी वर्ग और एक नेस्टेड वर्ग का उदाहरण है।Map.Entry

एक वस्तु बनाना

स्टैटिक नेस्टेड क्लास का ऑब्जेक्ट बनाना बहुत आसान है। यह कैसा दिखता है:

OuterClass.NestedClass name = new OuterClass.NestedClass();

यह सामान्य कक्षाओं के समान ही है, लेकिन नाम में दो भाग होते हैं।

स्थिर विधियों को कॉल करना

यदि किसी स्थिर वर्ग में स्थिर विधियाँ हैं, तो आप उन्हें उसी तरह से एक्सेस कर सकते हैं जैसे साधारण कक्षाओं के स्थिर तरीके (लेकिन वर्ग के नाम में दो भाग होंगे)।

OuterClass.NestedClass.staticMethod();

स्थैतिक चर तक पहुँचना

एक नेस्टेड वर्ग के सार्वजनिक स्थैतिक चर तक पहुँचना भी आसान है:

OuterParent.NestedClass.nameOfStaticVariable


3. स्थिर कक्षाओं की विशेषताएं

स्टेटिक नेस्टेड क्लासेस को स्टैटिक कहलाने का कम से कम कारण है। वे नियमित कक्षाओं की तरह ही व्यवहार करते हैं । गैर स्थैतिक तरीकों से उन्हें एक्सेस करने पर कोई प्रतिबंध नहीं है।

यदि आप इसके बाहरी वर्ग के अंदर एक स्थिर नेस्टेड वर्ग के साथ काम कर रहे हैं, तो आपको सबसे साधारण (नेस्टेड नहीं और स्थिर नहीं) वर्ग से कोई अंतर नहीं दिखाई देगा।

उदाहरण:

स्टेटिक नेस्टेड प्वाइंट क्लास साधारण बिंदु वर्ग।
public class Solution
{
   static ArrayList<Point> points;

   public static void main(String[] args)
   {
      Point point = new Point();
      point.x = 100;
      point.y = 200;
      points = new ArrayList<Point>();
      points.add(point);
   }

   static class Point
   {
      int x;
      int y;
   }
}
public class Solution
{
   static ArrayList<Point> points;

   public static void main(String[] args)
   {
      Point point = new Point();
      point.x = 100;
      point.y = 200;
      points = new ArrayList<Point>();
      points.add(point);
   }
}

class Point
{
   int x;
   int y;
}

यदि आप कुछ स्टैटिक नेस्टेड क्लास लेते हैं और इसे उसके बाहरी वर्ग से बाहर ले जाते हैं, तो केवल एक चीज बदलेगी कि नया वर्ग अब अपने पूर्व बाहरी वर्ग के चर और तरीकों तक नहीं पहुंच पाएगा।private static

उदाहरण:

स्टेटिक नेस्टेड प्वाइंट क्लास साधारण बिंदु वर्ग।
public class Solution
{
   private static ArrayList<Point> points;

   static class Point
   {
      int x;
      int y;

      public static void main(String[] args)
      {
         Point point = new Point();
         point.x = 100;
         point.y = 200;

         // This will work
         points = new ArrayList<Point>();
         points.add(point);
      }
   }
}
public class Solution
{
   private static ArrayList<Point> points;
}

class Point
{
   int x;
   int y;

   public static void main(String[] args)
   {
      Point point = new Point();
      point.x = 100;
      point.y = 200;

      // This will generate an error
      points = new ArrayList<Point>();
      points.add(point);
   }
}

mainसाधारण Pointवर्ग में विधियाँ वर्ग के चर तक नहीं पहुँच सकती हैं !private static pointsSolution

स्थिर नेस्टेड वर्ग और सामान्य वर्ग के बीच यह मुख्य अंतर है। स्टैटिक नेस्टेड क्लास के तरीके सभी स्टैटिक वेरिएबल्स और उनके बाहरी क्लास के तरीकों तक पहुँच सकते हैं, भले ही वे घोषित हों private

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