English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

ملخص استخدام الفئات الداخلية في Java

1. ما هي الفئات الداخلية؟

الصفات المحددة داخل الفئة، تُدعى الفئات الداخلية

 public class Out{
   class In{ // في هذه الحالة In هي الفئة الداخلية
   } 
}

2. لماذا يجب استخدام الفئات الداخلية؟

1) تعزيز التجميع، إخفاء الفئات الداخلية داخل الفئة الخارجية، وعدم السماح لأي فئة أخرى بزيارة الفئة الداخلية

2) يمكن للفئات الداخلية تحسين قراءة وتحسين صيانة الكود

3. تصنيف الفئات الداخلية

بالنسبة لتصنيف الفئات الداخلية، يمكن مقارنتها بتصنيف المتغيرات الأعضاء.

We can divide the member variables according to different modifiers or different positions of definition into: class member variables, instance member variables, and local variables.

The inner class is considered as a member of the outer class, so the inner class can use public/default/protected/private modifiers. It can also be static.

Similarly, the inner class is divided into 4 categories according to the use of different modifiers or the different positions of definition:

1) Instance inner class: inner class does not use static modifier

2) Static inner class: inner class uses static modifier

3) Local inner class: an inner class defined in a method

4) Anonymous inner class: can only be used once, a special case of inner class

3.1 Instance inner class:

1) Definition: Instance inner class, that is, an inner class that does not use static modifier. This means that the instance inner class belongs to the object of the outer class, not to the outer class itself (compare to field).

2) Create an instance inner class

// الفئة الخارجية
class Outter {
 // Instance inner class: without using static modifier
 class Inner {
 }
}
public class InnerDemo1 {
 public static void main(String[] args) {
 // Create an instance inner class, without using static modifier, belongs to the object of the outer class, so, before creating an instance inner class, an object of the outer class must exist
 Outter out = new Outter();
 // Create an inner class object through an outer class object
 Outter.Inner in = out.new Inner();
 }
}

3) خصائص:

a. From the process of creating an instance inner class, it can be known that when there is an object of the inner class, there must be an object of the outer class.

b. The instance inner class holds a reference to the instance of the outer class automatically, and the instance inner class can access all fields and methods of the outer class unconditionally

Note: When the member inner class has a member variable or method with the same name as the outer class, hiding occurs

c. The outer class cannot directly access the members of the inner class; you must first create an object of the member inner class and then access it through the reference pointing to this object

// الفئة الخارجية
class Outter {
 private String name = "out";
 private Integer age = 17;
 // Instance inner class: without using static modifier
 class Inner {
 private Integer age = 18; // Hiding phenomenon, hides the age of the outer class
 Inner() {
  // Features: 1. The instance inner class can directly access the members of the outer class
  // 2. When an instance inner class and an outer class have fields or methods with the same name, hiding occurs
  System.out.println(name + this.age);// outputs out18
  // If you need to use the age of the outer class at this time, the syntax is: outer class.this.age
  System.out.println(Outter.this.age);// outputs 17
 }
 }
}

الخلاصة: ببساطة، ننظر إلى نطاق المتغيرات، نطاق متغيرات أعضاء الفئة الخارجية هو الفئة الخارجية ككل، بينما تكون الفئة الداخلية في الفئة الخارجية (يمكن رؤيتها كحقل للفئة الخارجية)، ولذلك يمكن للفئة الداخلية الوصول إلى الفئة الخارجية. بينما إذا كان يتعين على الفئة الخارجية الوصول إلى أعضاء الفئة الداخلية، يمكن فهم ذلك كالتالي: أعضاء الفئة الداخلية تعتبر أعضاء للفئة الداخلية، ويكونون فعالين في الفئة الداخلية، إذا لم تكن الفئة الداخلية موجودة، فإن متغيراتها لن تكون موجودة أيضًا، لذا لا يمكن للفئة الخارجية الوصول إلى أعضاء الفئة الداخلية مباشرة، بل يجب إنشاء مثال للفئة الداخلية المحلية أولاً، ثم الوصول إليها من خلال مرجع هذا المثال.

3.2 الفئة الداخلية الثابتة

1) تعريف: الفئة الداخلية المحددة باستخدام修饰ة static. لذا، تعتبر هذه الفئة جزءًا من الفئة الخارجية نفسها وليس جزءًا من مثال الفئة الخارجية

2) إنشاء الفئة الداخلية الثابتة

// الفئة الخارجية
class Outter {
 // الفئة الداخلية الثابتة: تستخدم修饰ة static
 static class Inner {
 }
}
public class InnerDemo2 {
 public static void main(String[] args) {
 // لأن الفئة الداخلية الثابتة تعتبر جزءًا من الفئة الخارجية نفسها، يمكن الوصول إليها مباشرة من خلال اسم الفئة الخارجية (مقارنة بالميدان)
 Outter.Inner in = new Outter.Inner();
 }
}

3) خصائص:

a. عند إنشاء مثال للفئة الداخلية، لا تحتاج إلى إنشاء مثال للفئة الخارجية.

b. يمكن للفئة الداخلية الثابتة الوصول إلى أعضاء الثابتة للفئة الخارجية مباشرة، وإذا كنت ترغب في زيارة أعضاء المثال للفئة الخارجية، يجب زيارة من خلال مثال الفئة الخارجية.

فهم بسيط: الأعضاء الثابتة تعتبر أعضاء للفئة، والأعضاء غير الثابتة تعتبر أعضاء للمثال، إذا كنت ترغب في زيارة أعضاء المثال للفئة الخارجية (غير الثابتة)، فبالطبع يجب أن تكون قد حفظت مثال الفئة الخارجية. لأن إنشاء الفئة الداخلية الثابتة لا يتطلب مثالاً للفئة الخارجية، لذا إذا كنت ترغب في زيارة أعضاء الفئة الخارجية، يجب زيارة من خلال مثال الفئة الخارجية.

c. يمكن تعريف أعضاء ثابتين وأعضاء محليين في الفئة الداخلية الثابتة.

d. يمكن للفئة الاختبارية الوصول إلى أعضاء الفئة الداخلية الثابتة مباشرة من خلال اسم الفئة الكامل.

// الفئة الخارجية
class Outter {
 static String name = "outter";
 public Integer age = 17;
 // الفئة الداخلية الثابتة: تستخدم修饰ة static
 static class Inner {
 Inner() {
  // يمكن للفئة الداخلية الثابتة الوصول إلى أعضاء الثابتة للفئة الخارجية مباشرة.
  System.out.println(name);// يخرج outter
  // لزيارة أعضاء المثال للفئة الخارجية، يجب زيارة من خلال مثال الفئة الخارجية.
  System.out.println(new Outter().age);// يخرج 17
 }
 }
}

3.3 الفئة الداخلية المحلية (تستخدم قليلاً)

1) تعريف: الفئة الداخلية المحددة في الطريقة، منطقة الرؤية الخاصة بها هي الطريقة الحالية، وهي في نفس المستوى كالمتغيرات المحلية، لذا لا يمكن استخدام الفئة الداخلية المحلية إلا في الطريقة.

تنبيه، لا يمكن للكائن الداخلي المحلي أن يحتوي على معرفات مثل public،protected،private أو static.}

public class InnerDemo3 {
 public static void main(String[] args) {
 // الكائن الداخلي المحلي
 class Inner {
 }
 }
}

2) خصائص:

a. لا يمكن للكائن الداخلي المحلي والكائن الداخلي المحدد أن يحتوي على أعضاء ثابتة.(الكائن الداخلي المحلي ينتمي إلى الطريقة، بينما تنتمي الأعضاء الثابتة إلى الكائن)

b. يمكن للكائن الداخلي المحلي والكائن الداخلي المحدد الوصول إلى جميع أعضاء الكائن الخارجي.

c. يجب استخدام修饰ر final على المتغيرات المحلية التي يستخدمها الكائن الداخلي المحلي، في Java8 يتم إضافة final بشكل تلقائي (مزيج من السكريبت).

السبب: عند انتهاء تشغيل الطريقة، يتم تدمير إطارات الطريقة الحالية، ويتم تدمير مساحة جميع المتغيرات المحلية داخل الطريقة. ولكن قد يكون هناك كائن داخلي محلي في ذاكرة التخزين المؤقت، ويبقى حتى يتم استخدامه مرة أخرى. في هذه الحالة، قد يحدث ما يلي: يحتاج الكائن الداخلي المجهول إلى الوصول إلى متغير محلي غير موجود. لتجنب هذا المشكلة، نستخدم修饰ر final على المتغيرات المحلية، مما يجعلها ثابتة، ويبقى في مساحة الذاكرة حتى بعد تدمير الطريقة، يمكن للكائن أن يستمر في التمسك بها.

public class InnerDemo3 {
 public static void main(String[] args) {
 int age = 17;
 final int num = 15;
 // الكائن الداخلي المحلي
 class Inner {
  public void test() {
  // خطأ:Cannot refer to a non-final variable age inside an inner class defined in a different method
  System.out.println(age);
  System.out.println(num);// صحيح
  }
 }
 }
}

3.4 الكائن الداخلي المجهول (أكثر استخدامه)

1): التعريف: الكائن الداخلي المجهول هو كائن داخلي محلي لا يحمل اسمًا، يناسب الاستخدام مرة واحدة فقط.

2) إنشاء الكائن الداخلي المجهول:

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

النص: تنبيه: يجب أن يستمر الكائن الداخلي المجهول في استنساخ أم أو تنفيذ واجهة، لكن يمكن أن يستمر في استنساخ أم أو تنفيذ واجهة واحدة فقط.

//定义一个接口
interface Person {
 public void eat();
}
public class AnonymousDemo {
 public static void main(String[] args) {
 // استخدام الكائنات الداخلية المجهولة
 Person p = new Person() {
  public void eat() {
  System.out.println("eat something");
  }
 };
 p.eat();
 }
}

4. النهاية

5. أسئلة المقابلة

public class Outer {
 public void someOuterMethod() {
 // Line 3
 }
 public class Inner {
 }
 public static void main(String[] argv) {
 Outer o = new Outer();
 // Line 8
 }
}
/*
 * أي مما يُكوّن مثالاً على Inner?
A. new Inner(); // At line 3
B. new Inner(); // At line 8
C. new o.Inner(); // At line 8
D. new Outer.Inner(); // At line 8
 */

الإجابة A.new Inner(); تساوي this.new Inner(); هناك بالفعل كائن من فئة Outer.

الخط 8 الكتابة الصحيحة، يجب أن تكون: o.new Inner();

هذا هو محتوى المقال الكامل، آمل أن يوفر هذا المقال بعض المساعدة في تعلم أو عمل الجميع، كما آمل أن يتم دعم دروس النطق!

البيان: محتويات هذا المقال تم جمعها من الإنترنت، حقوق النشر مملوكة للمساهمين، تم تحميل المحتوى من قبل مستخدمي الإنترنت بذاتهم، هذا الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتوى يدويًا، ولا يتحمل أي مسؤولية قانونية مرتبطة. إذا اكتشفت محتوى يشتبه في حقوق النسخ، فلا تتردد في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال '#' ب '@'). للاشتباه في حقوق النسخ، يرجى تقديم الدليل، وستقوم الموقع بإزالة المحتوى المشبوه فورًا.

أنت قد تحب