जावा - आंतरिक कक्षाएं

इस अध्याय में, हम जावा के आंतरिक वर्गों पर चर्चा करेंगे।

नेस्टेड क्लासेस

जावा में, तरीकों की तरह, एक वर्ग के चर भी इसके सदस्य के रूप में एक और वर्ग हो सकते हैं। जावा में किसी अन्य के लिए एक वर्ग लिखने की अनुमति है। भीतर लिखी कक्षा को कहा जाता हैnested class, और आंतरिक वर्ग को धारण करने वाले वर्ग को कहा जाता है outer class

Syntax

नेस्टेड क्लास लिखने के लिए सिंटैक्स निम्नलिखित है। इधर, क्लासOuter_Demo बाहरी वर्ग और वर्ग है Inner_Demo नेस्टेड क्लास है।

class Outer_Demo {
   class Inner_Demo {
   }
}

नेस्टेड वर्गों को दो प्रकारों में विभाजित किया जाता है -

  • Non-static nested classes - ये एक वर्ग के गैर-स्थैतिक सदस्य हैं।

  • Static nested classes - ये एक वर्ग के स्थिर सदस्य हैं।

इनर क्लासेस (नॉन-स्टैटिक नेस्टेड क्लासेस)

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

आंतरिक वर्ग तीन प्रकार के होते हैं जो इस बात पर निर्भर करते हैं कि आप उन्हें कैसे और कहां परिभाषित करते हैं। वे हैं -

  • भीतरी वर्ग
  • विधि-स्थानीय इनर क्लास
  • अनाम भीतरी वर्ग

भीतरी वर्ग

एक आंतरिक वर्ग बनाना काफी सरल है। आपको बस एक वर्ग के भीतर एक वर्ग लिखने की आवश्यकता है। एक वर्ग के विपरीत, एक आंतरिक वर्ग निजी हो सकता है और एक बार जब आप एक आंतरिक वर्ग को निजी घोषित करते हैं, तो इसे कक्षा के बाहर किसी ऑब्जेक्ट से एक्सेस नहीं किया जा सकता है।

निम्नलिखित एक आंतरिक कक्षा बनाने और इसे एक्सेस करने का कार्यक्रम है। दिए गए उदाहरण में, हम आंतरिक वर्ग को निजी बनाते हैं और एक विधि के माध्यम से कक्षा तक पहुंच बनाते हैं।

Example

class Outer_Demo {
   int num;
   
   // inner class
   private class Inner_Demo {
      public void print() {
         System.out.println("This is an inner class");
      }
   }
   
   // Accessing he inner class from the method within
   void display_Inner() {
      Inner_Demo inner = new Inner_Demo();
      inner.print();
   }
}
   
public class My_class {

   public static void main(String args[]) {
      // Instantiating the outer class 
      Outer_Demo outer = new Outer_Demo();
      
      // Accessing the display_Inner() method.
      outer.display_Inner();
   }
}

यहां आप उसका अवलोकन कर सकते हैं Outer_Demo बाहरी वर्ग है, Inner_Demo भीतरी वर्ग है, display_Inner() वह विधि है जिसके भीतर हम भीतर के वर्ग को तात्कालिक कर रहे हैं, और यह विधि भीतर से आक्रांत है main तरीका।

यदि आप उपरोक्त कार्यक्रम को संकलित और निष्पादित करते हैं, तो आपको निम्न परिणाम प्राप्त होंगे -

Output

This is an inner class.

निजी सदस्यों तक पहुँचना

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

आंतरिक कक्षा को तुरंत शुरू करने के लिए, शुरुआत में आपको बाहरी वर्ग को त्वरित करना होगा। इसके बाद, बाहरी वर्ग की वस्तु का उपयोग करते हुए, निम्नलिखित वह तरीका है जिसमें आप आंतरिक वर्ग को त्वरित कर सकते हैं।

Outer_Demo outer = new Outer_Demo();
Outer_Demo.Inner_Demo inner = outer.new Inner_Demo();

निम्न कार्यक्रम दिखाता है कि आंतरिक वर्ग का उपयोग करके किसी वर्ग के निजी सदस्यों तक कैसे पहुंचा जाए।

Example

class Outer_Demo {
   // private variable of the outer class
   private int num = 175;  
   
   // inner class
   public class Inner_Demo {
      public int getNum() {
         System.out.println("This is the getnum method of the inner class");
         return num;
      }
   }
}

public class My_class2 {

   public static void main(String args[]) {
      // Instantiating the outer class
      Outer_Demo outer = new Outer_Demo();
      
      // Instantiating the inner class
      Outer_Demo.Inner_Demo inner = outer.new Inner_Demo();
      System.out.println(inner.getNum());
   }
}

यदि आप उपरोक्त कार्यक्रम को संकलित और निष्पादित करते हैं, तो आपको निम्न परिणाम प्राप्त होंगे -

Output

This is the getnum method of the inner class: 175

विधि-स्थानीय इनर क्लास

जावा में, हम एक विधि के भीतर एक वर्ग लिख सकते हैं और यह एक स्थानीय प्रकार होगा। स्थानीय चर की तरह, विधि के भीतर आंतरिक वर्ग का दायरा प्रतिबंधित है।

एक विधि-स्थानीय आंतरिक वर्ग केवल उस पद्धति के भीतर त्वरित किया जा सकता है जहां आंतरिक वर्ग को परिभाषित किया गया है। निम्न प्रोग्राम दिखाता है कि विधि-स्थानीय आंतरिक वर्ग का उपयोग कैसे करें।

Example

public class Outerclass {
   // instance method of the outer class 
   void my_Method() {
      int num = 23;

      // method-local inner class
      class MethodInner_Demo {
         public void print() {
            System.out.println("This is method inner class "+num);	   
         }   
      } // end of inner class
	   
      // Accessing the inner class
      MethodInner_Demo inner = new MethodInner_Demo();
      inner.print();
   }
   
   public static void main(String args[]) {
      Outerclass outer = new Outerclass();
      outer.my_Method();	   	   
   }
}

यदि आप उपरोक्त कार्यक्रम को संकलित और निष्पादित करते हैं, तो आपको निम्न परिणाम प्राप्त होंगे -

Output

This is method inner class 23

अनाम भीतरी वर्ग

वर्ग नाम के बिना घोषित एक आंतरिक वर्ग को एक के रूप में जाना जाता है anonymous inner class। अनाम आंतरिक वर्गों के मामले में, हम उन्हें एक ही समय में घोषित और त्वरित करते हैं। जब भी आपको क्लास या इंटरफ़ेस की विधि को ओवरराइड करने की आवश्यकता होती है, तो आमतौर पर उनका उपयोग किया जाता है। अनाम आंतरिक वर्ग का वाक्य विन्यास इस प्रकार है -

Syntax

AnonymousInner an_inner = new AnonymousInner() {
   public void my_method() {
      ........
      ........
   }   
};

निम्न प्रोग्राम दिखाता है कि अनाम आंतरिक वर्ग का उपयोग करके किसी वर्ग की पद्धति को कैसे ओवरराइड किया जाए।

Example

abstract class AnonymousInner {
   public abstract void mymethod();
}

public class Outer_class {

   public static void main(String args[]) {
      AnonymousInner inner = new AnonymousInner() {
         public void mymethod() {
            System.out.println("This is an example of anonymous inner class");
         }
      };
      inner.mymethod();	
   }
}

यदि आप उपरोक्त कार्यक्रम को संकलित और निष्पादित करते हैं, तो आपको निम्न परिणाम प्राप्त होंगे -

Output

This is an example of anonymous inner class

उसी तरह, आप कंक्रीट वर्ग के तरीकों के साथ-साथ एक अनाम आंतरिक वर्ग का उपयोग करके इंटरफ़ेस को ओवरराइड कर सकते हैं।

अनाम आंतरिक कक्षा तर्क के रूप में

आमतौर पर, यदि कोई विधि किसी इंटरफ़ेस, एब्स्ट्रैक्ट क्लास, या कंक्रीट क्लास के ऑब्जेक्ट को स्वीकार करती है, तो हम इंटरफ़ेस को लागू कर सकते हैं, एब्सट्रैक्ट क्लास का विस्तार कर सकते हैं और ऑब्जेक्ट को विधि में पास कर सकते हैं। यदि यह एक वर्ग है, तो हम इसे सीधे विधि में पारित कर सकते हैं।

लेकिन तीनों मामलों में, आप एक अनाम आंतरिक वर्ग को विधि में पास कर सकते हैं। एक अनाम आंतरिक वर्ग को विधि तर्क के रूप में पास करने का सिंटैक्स है -

obj.my_Method(new My_Class() {
   public void Do() {
      .....
      .....
   }
});

निम्नलिखित कार्यक्रम दिखाता है कि एक अनाम आंतरिक वर्ग को विधि तर्क के रूप में कैसे पास किया जाए।

Example

// interface
interface Message {
   String greet();
}

public class My_class {
   // method which accepts the object of interface Message
   public void displayMessage(Message m) {
      System.out.println(m.greet() +
         ", This is an example of anonymous inner class as an argument");  
   }

   public static void main(String args[]) {
      // Instantiating the class
      My_class obj = new My_class();

      // Passing an anonymous inner class as an argument
      obj.displayMessage(new Message() {
         public String greet() {
            return "Hello";
         }
      });
   }
}

यदि आप उपरोक्त कार्यक्रम को संकलित और निष्पादित करते हैं, तो यह आपको निम्नलिखित परिणाम देता है -

Output

Hello, This is an example of anonymous inner class as an argument

स्टेटिक नेस्टेड क्लास

एक स्थिर आंतरिक वर्ग एक नेस्टेड वर्ग है जो बाहरी वर्ग का एक स्थिर सदस्य है। इसे अन्य स्थिर सदस्यों का उपयोग करते हुए, बाहरी वर्ग को इंस्टेंट किए बिना पहुँचा जा सकता है। स्थैतिक सदस्यों की तरह, एक स्थिर नेस्टेड वर्ग में बाहरी वर्ग के उदाहरण चर और तरीकों तक पहुंच नहीं होती है। स्टेटिक नेस्टेड क्लास का सिंटैक्स इस प्रकार है -

Syntax

class MyOuter {
   static class Nested_Demo {
   }
}

स्टैटिक नेस्टेड क्लास को इंस्टेंट करना, इनर क्लास को इंस्टेंट करने से थोड़ा अलग है। निम्न प्रोग्राम दिखाता है कि स्थिर नेस्टेड क्लास का उपयोग कैसे करें।

Example

public class Outer {
   static class Nested_Demo {
      public void my_method() {
         System.out.println("This is my nested class");
      }
   }
   
   public static void main(String args[]) {
      Outer.Nested_Demo nested = new Outer.Nested_Demo();	 
      nested.my_method();
   }
}

यदि आप उपरोक्त कार्यक्रम को संकलित और निष्पादित करते हैं, तो आपको निम्न परिणाम प्राप्त होंगे -

Output

This is my nested class