Java Inner Classes

Ammar AlTahhanمنذ 7 سنوات

السلام عليكم ورحمة الله وبركاته

في هذه المقاله سنناقش انواع الInner classes في الجافا

 

في الجافا، كتابة class داخل class آخر مسموح، الكلاس الداخلي يسمى Nested class والخارجي يسمى Outer class.

كمثال على الNested class:


class Outer {
   class Nested {
   }
}

 

يمكن تقسيم الNested classes الى نوعين:

  • Non-static nested classes
  • Static nested classes

 

inner_classes.jpg

 

نبدأ أولا بالInner classes

Inner Classes (Non-static Nested Classes)

يمكن التفكير ب الInner classes كحماية اضافية للكلاس الداخلي. 

من المعروف أن الكلاس لا يمكن ربطه باحد الaccess modifiers مثل (public, private, etc...)، ولكن يمكننا فعل ذلك اذا كان Inner class

للInner classes ثلاثة أنواع:

  • Inner classes
  • Method-local inner classes
  • Anonymous inner classes

 

1- Inner classes

انشاء Inner class بسيط جدا، كل ما عليك فعله هو أن تعرف كلاس بداخل كلاس آخر كما رأينا بالأعلى

سنعرف Private inner class بالمثال التالي:


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

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

Output:

This is an inner class.

في هذا المثال استعملنا method اضافية [()display_Inner] لعمل object من الprivate inner class ومن ثم استدعاء الميثود بداخله.

 

باختصار، الطريقة الصحيحة لعمل Instantiating للInner class كالتالي:


Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();

 

2- Method-local Inner Classes

في الجافا، يمكننا أيضا ان نعرف كلاس داخل ميثود معينة، ولكن هذا الكلاس لا يمكن تعريفه أو استخدامه الا داخل نفس الميثود.

المثال التالي يشرح كيفية استخدام الmethod-local inner class:


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

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

Output:

This is method inner class 23

 

3- Anonymous Inner Class

هو كلاس يتم انشاؤه بدون اسم محدد له (Anonymous). عموما نستخدم هذا النوع من الكلاسات عندما نريد أن نعمل override لميثود في كلاس او انترفيس.

مثال لكيفية انشاء Anonymous inner class:


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

 

البرنامج التالي يوضح استخدام الAnonymous inner class لعمل override لميثود موجودة بabstract class:


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

 

4- Static Nested Classes

عندما نعرف الInner class ك Static، يمكننا أن ننشئ object منه بدون الحاجه لإنشاء object من الouter class

كذلك الStatic inner class لا يمكنه الوصول او استخدام الinstance variables or methods الموجودة بالouter class

مثال لهذا النوع من الinner classes:


class MyOuter {
   static class Nested {
   }
}

 

البرنامج التالي يوضح الفروقات بين انشاء object من static inner class و inner class:


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

output:

This is my nested class

 

الى هنا نصل الى ختام موضوعنا.

وفق الله الحميع لما يحبه ويرضاه.

كلمات دليلية:
1
إعجاب
5443
مشاهدات
0
مشاركة
1
متابع
متميز
محتوى رهيب

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !