الجمعة، 3 يناير 2020

الفئات المتداخلة Java Inner classes

الفئات المتداخلة في جافا 

Java Inner classes

الفئات المتداخلة في جافا Java Inner classes

في هذا الفصل ، سنناقش الفئات  المتداخلة لجافا.

الفئات المتداخلة Nested Classes

في Java ، تمامًا مثل الدوال ، يمكن أن يكون لمتغيرات الدالة أيضًا فئة أخرى كعضو فيها.  يُسمح بكتابة فئة  داخل الفئة  في Java.  تسمى الفئة المكتوبة بداخلها بالفئة المتداخلة ، وتسمى الفئة التي تحمل الفئة الداخلية بالفئة الخارجية.
الصيغة Syntax
فيما يلي بناء الجملة لكتابة فئة متداخلة.  هنا ، تعتبر الطبقة Outer_Demo هي الفئة الخارجية والفئة Inner_Demo هي الفئة المتداخلة.
class Outer_Demo {
   class Inner_Demo {
   }
}

تنقسم الفئات  المتداخلة إلى نوعين -
  • Non-static nested classes −هؤلاء هم الأعضاء غير ثابت  في الفئة . 
  • Static nested classes − .هؤلاء هم أعضاء ثابت في الفئة 
Inner Classes

Inner Classes (Non-static Nested Classes)

الفئات  الداخلية هي آلية أمنية في جافا.  نحن نعلم أن الفئة  لا يمكن ربطه بمحدد الوصول الخاص ، لكن إذا كان لدينا الفئة  كعضو في فئة أخرى ، فيمكن جعل الفئة  الداخلية خاصة.  ويستخدم هذا أيضًا للوصول إلى أعضاء القطاع الخاص.

 تتكون الفئات  الداخلية من ثلاثة أنواع بناءً على كيفية ومكان تحديدها.  هم -
  • الفئات الداخلية Inner Class
  • فئات داخلية مع دوال محلية Method-local Inner Class
  • فئات داخلية مجهولة Anonymous Inner Class

Inner Class

إنشاء فئة  داخلية بسيط للغاية.  تحتاج فقط إلى كتابة فئة  داخل الفئة .  بخلاف فئة ، يمكن أن تكون الفئة  الداخلية خاصة وبمجرد إعلان فئة داخلية خاصة ، لا يمكن الوصول إليها من كائن خارج الفئة .

 فيما يلي برنامج لإنشاء فئة داخلية والوصول إليها.  في المثال المحدد ، نجعل الفئة  الداخلية خاصة ونصل إلى الفئة  من خلال إحدى الطرق.
مثال 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 () هي الدالة التي ننشئ فيها الطبقة الداخلية من داخلها ، وهذه الدالة يتم استحضارها من الطريقة الرئيسية.

 إذا قمت بترجمة وتنفيذ البرنامج أعلاه ، فستحصل على النتيجة التالية -
المخرجات Output
This is an inner class.

الوصول للعناصر الخاصة Accessing the Private Members

كما ذكرنا سابقًا ، تُستخدم الفئات  الداخلية أيضًا للوصول إلى الأعضاء الخاصين في الفئة .  لنفترض أن هناك فئة لديها أعضاء خاصون للوصول إليهم.  اكتب فئة داخلية فيه ، وأرجع الأعضاء الخاصين من دالة ما داخل الفئة الداخلية ، على سبيل المثال ، getValue () ، وأخيراً من فئة أخرى (تريد الوصول إلى الأعضاء من خلالها) ، اتصل بالدالة 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

الدوال المحلية في الفئات الداخلية Method-local Inner Class

في Java ، يمكننا كتابة فصل ضمن طريقة وسيكون هذا نوعًا محليًا.  مثل المتغيرات المحلية ، فإن نطاق الطبقة الداخلية مقيد في الطريقة.

 يمكن إنشاء مثيل للفئة الداخلية المحلية للطريقة فقط داخل الطريقة التي يتم تعريف الفئة الداخلية بها.  يوضح البرنامج التالي كيفية استخدام فئة داخلية محلية للطريقة.
مثال 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
بنفس الدوال ، يمكنك تجاوز أساليب الفئة الملموسة وكذلك الواجهة باستخدام فئة داخلية مجهولة.

 Anonymous Inner Class as Argument

بشكل عام ، إذا قبلت إحدى الدوال كائنًا من الواجهة أو فئة مجردة أو فئة محددة ، فيمكننا حينئذٍ تنفيذ الواجهة وتوسيع فئة الملخصات وتمرير الكائن إلى الدالة.  إذا كان صفًا ، فيمكننا نقله مباشرةً إلى الدوال.

 ولكن في جميع الحالات الثلاث ، يمكنك تمرير فئة داخلية مجهولة إلى هذه الدوال .  فيما يلي بناء جملة تمرير فئة داخلية مجهولة كوسيطة أسلوب -
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

الفئات المتداخلة الثابتة Static Nested Class

الطبقة الداخلية الثابتة هي فئة متداخلة وهي عضو ثابت في الطبقة الخارجية.  يمكن الوصول إليه دون إنشاء مثيل للفئة الخارجية ، باستخدام أعضاء ثابتة أخرى.  تمامًا مثل الأعضاء الساكنة ، لا تتمتع الفئة المتداخلة الثابتة بالوصول إلى متغيرات المثيل وطرق الطبقة الخارجية.  بناء جملة فئة متداخلة ثابت كما يلي -
الصيغة 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






التسميات: