English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في هذا الدرس، ستتعلم عن طريق الأمثلة فئات المدمجة في Java وأنواعها.
في Java، يمكنك تعريف فئة داخل فئة أخرى. وتُدعى هذه الفئة nested class (الفئة المدمجة). على سبيل المثال،
class OuterClass { // ... class NestedClass { // ... } }
يمكنك استخدام Java لإنشاء نوعين من الفئات المدمجة.
الفئة المدمجة غير الثابتة (الفئة الداخلية)
الفئة المدمجة الثابتة
قراءة مرتبطة:
دعونا نبدأ بمعرفة الفئة المدمجة غير الثابتة.
الفئة المدمجة غير الثابتة هي فئة داخل فئة أخرى. لها الحق في الوصول إلى أعضاء الفئة المحكمة (الفئة الخارجية). وتُدعى عادةً classُداخلية (الفئة الداخلية).
بما أن الفئة الداخلية موجودة داخل فئة أخرى، لابد من تفعيل الفئة الخارجية أولاً من أجل تفعيل الفئة الداخلية.
هذا مثال على كيفية إعلان فئة داخلية في Java.
class CPU { priceُمرتين; //مدمج class Processor{ //أعضاء الكلاس المدمج double cores; String manufacturer; double getCache(){ return 4.3; } } //مدمج معتمد protected class RAM{ //أعضاء الكلاس المدمج المعتمدة double memory; String manufacturer; double getClockSpeed(){ return 5.5; } } } public class Main { public static void main(String[] args) { //إنشاء مثيل للكلاس الخارجي CPU CPU cpu = new CPU(); //استخدام الكلاس الخارجي لإنشاء مثيل للكلاس الداخلي Processor CPU.Processor processor = cpu.new Processor(); //استخدام الكلاس الخارجي CPU لإنشاء مثيل للكلاس الداخلي RAM CPU.RAM ram = cpu.new RAM(); System.out.println("Processor Cache = " + processor.getCache()); System.out.println("Ram Clock speed = " + ram.getClockSpeed()); } }
الإخراج:
Processor Cache = 4.3 Ram Clock speed = 5.5
في البرنامج المذكور أعلاه، هناك كلاسين مدمجين: Processor و RAM داخل الكلاس الخارجي CPU:. يمكننا إعلان الكلاس الداخلي كمعتمد. لذلك، قمنا بإعلان كلاس RAM كمعتمد.
داخل كلاس Main
نقوم أولاً بإنشاء مثيل للكلاس الخارجي CPU باسم cpu.
ثم، باستخدام مثيل الكلاس الخارجي، نقوم بإنشاء مثيل للكلاس الداخلي:
CPU.Processor processor = cpu.new Processor(); CPU.RAM ram = cpu.new RAM();
ملاحظةنستخدم عمودية (.) لإنشاء مثيل للكلاس الداخلي باستخدام الكلاس الخارجي.
يمكننا استخدام كلمة المفتاح this للوصول إلى أعضاء الكلاس الخارجي. إذا كنت ترغب في معرفة هذه الكلمة المفتاح، يرجى زيارةكلمات المفتاح Java this。
class Car { String carName; String carType; //استخدام بناء المصفوفة لتعيين القيم public Car(String name, String type) { this.carName = name; this.carType = type; } // الخاص بخصوص private String getCarName() {}} return this.carName; } //فئة داخلية class Engine { String engineType; void setEngine() { //استخدام خاصية carType من Car if(Car.this.carType.equals("4WD")){ //تطبيق طريقة getCarName() من Car if(Car.this.getCarName().equals("Crysler")) { this.engineType = "أصغر"; } this.engineType = "أكبر"; } } this.engineType = "أكبر"; } } String getEngineType(){ return this.engineType; } } } public class Main { public static void main(String[] args) { //إنشاء عنصر الفئة الخارجية Car Car car1 = new Car("Mazda", "8WD"); //استخدام الفئة الخارجية لإنشاء عنصر الفئة الداخلية Car.Engine engine = car1.new Engine(); engine.setEngine(); System.out.println("نوع محرك 8WD = " + engine.getEngineType()); Car car2 = new Car("Crysler", "4WD"); Car.Engine c2engine = car2.new Engine(); c2engine.setEngine(); System.out.println("نوع محرك 4WD = " + c2engine.getEngineType()); } }
الإخراج:
نوع محرك 8WD = أكبر نوع محرك 4WD = أصغر
في البرنامج السابق، لدينا فئة داخلية تُدعى Engine في الفئة الخارجية Car. يرجى ملاحظة هذا السطر،
if(Car.this.carType.equals("4WD")) {...}
نستخدم كلمة this لزيارة متغير carType من الفئة الخارجية. قد لاحظت أنك تستخدم Car.this.carType بدلاً من this.carType.
هذا لأن إذا لم نذكر اسم الفئة الخارجية Car، فإن كلمة this ستشير إلى العضو في الفئة الداخلية.
بالتالي، نحن أيضًا نصل إلى طرق الفئة الخارجية من الفئة الداخلية.
if (Car.this.getCarName().equals("Crysler") {...
من المهم ملاحظة أن尽管 getCarName() هي طريقة خاصة (private)، إلا أننا نستطيع الوصول إليها من الفئة الداخلية.
في Java، يمكننا أيضًا تعريف فئة ثابتة (static) داخل فئة أخرى. هذا النوع يُسمى فئة مدمجة ثابتة (static nested class). لا تُسمى الفئة المدمجة الثابتة فئة داخلية ثابتة.
على عكس الفئات الداخلية، لا يمكن للفئات المدمجة الثابتة الوصول إلى أعضاء الفئة الخارجية. هذا بسببالفئة المدمجة الثابتةلا تحتاج إلى إنشاء objكت للفئة الخارجية.
OuterClass.NestedClass obj = new OuterClass.NestedClass();
في هذا المكان، قمنا بإنشاء objكت باستخدام اسم الفئة الخارجية فقطالفئة المدمجة الثابتةلأنه لا يمكن استخدام OuterClass.this للإشارة إلى الفئة الخارجية.
class MotherBoard { //فئة مدمجة ثابتة static class USB{ int usb2 = 2; int usb3 = 1; int getTotalPorts(){ return usb2 + usb3; } } } public class Main { public static void main(String[] args) { //إنشاء objكت للفئة المدمجة الثابتة //استخدام اسم الفئة الخارجية MotherBoard.USB usb = new MotherBoard.USB(); System.out.println("مجموع الموانئ = " + usb.getTotalPorts()); } }
الإخراج:
مجموع الموانئ = 3
في البرنامج المسبق، قمنا بإنشاء فئة مدمجة ثابتة تسمى USB في فئة MotherBoard. انتبه إلى هذا السطر،
MotherBoard.USB usb = new MotherBoard.USB();
في هذا المكان، قمنا بإنشاء objكت USB باستخدام اسم الفئة الخارجية.
الآن، دعونا نرى ما الذي سيحدث إذا حاولنا الوصول إلى أعضاء الفئة الخارجية:
class MotherBoard { String model; public MotherBoard(String model) { this.model = model; } //فئة مدمجة ثابتة static class USB{ int usb2 = 2; int usb3 = 1; int getTotalPorts(){ //استخدام متغير model من الفئة الخارجية if(MotherBoard.this.model.equals("MSI")) { return 4; } else { return usb2 + usb3; } } } } public class Main { public static void main(String[] args) { //إنشاء objكت للفئة المدمجة الثابتة MotherBoard.USB usb = new MotherBoard.USB(); System.out.println("مجموع الموانئ = " + usb.getTotalPorts()); } }
عندما نحاول تشغيل البرنامج، سيظهر خطأ:
خطأ: لا يمكن الاستدلال على المتغير غير الثابت this من سياق ثابت
هذا لأننا لم نستخدم موضوع الفئة الخارجية لإنشاء موضوع الفئة الداخلية. لذلك، لا يوجد استدلال على الفئة الخارجية Motherboard.this في الفئة الخارجية Motherboard.
تعتبر Java الفئات الداخلية كأعضاء عاديين للفئات. إنها تشبه الطرق والمتغيرات المُعلنة في الفئة.
بما أن الفئة الداخلية هي عضو في الفئة الخارجية، يمكن تطبيق أي ميزة وصول (مثل private،protected) على الفئة الداخلية، وهو أمر غير ممكن في الفئات العادية.
بما أن الفئة المحكمة هي عضو في الفئة الخارجية، يمكنك استخدام طريقة الت��ين بالنقطة (.) للاستدلال على الفئة المحكمة وأعضائها.
نقاط يجب تذكرها
يمكن للفئات المحكمة (المدمجة) الوصول إلى أعضاء الفئة الخارجية / المحكمة، حتى لو كانت مُعلنة كسرية.