JavaRush /مدونة جافا /Random-AR /فئات متداخلة ثابتة

فئات متداخلة ثابتة

نشرت في المجموعة
مرحبًا! نواصل استكشاف موضوع الفئات المتداخلة في Java. تحدثنا في الدرس الأخير عن الفئات المتداخلة غير الثابتة أو كما يطلق عليها أيضًا الطبقات الداخلية. فئات متداخلة ثابتة - 2اليوم دعنا ننتقل إلى مجموعة أخرى ونلقي نظرة فاحصة على الفئات المتداخلة الثابتة. فئات متداخلة ثابتة - 3كيف يختلفون عن المجموعات الأخرى؟ عند الإعلان عن مثل هذه الفئة، نستخدم الكلمة الأساسية الثابتة المألوفة بالفعل:
public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

       public static int getMaxPassengersCount() {

           return maxPassengersCount;
       }
   }
}
فئات متداخلة ثابتة - 4في هذا المثال، لدينا فئة خارجية Boeing737تقوم بإنشاء طائرة من هذا النموذج. وله منشئ بمعلم واحد: سنة الصنع ( int manufactureYear). يوجد أيضًا متغير ثابت واحد int maxPassengersCount- الحد الأقصى لعدد الركاب. وسيكون الأمر نفسه بالنسبة لجميع الطائرات من نفس الطراز، لذلك نحتاج إلى نسخة واحدة فقط. بالإضافة إلى ذلك، لديها فئة داخلية ثابتة Drawing- مخطط الطائرة. في هذه الفئة يمكننا تغليف جميع معلومات الخدمة الخاصة بالطائرة. في مثالنا، من أجل التبسيط، اقتصرنا على سنة الصنع، لكنه يمكن أن يحتوي على الكثير من المعلومات الأخرى. فئات متداخلة ثابتة - 5كما ناقشنا في المحاضرة الأخيرة، فإن إنشاء مثل هذه الفئة المتداخلة يزيد من التغليف ويعزز التجريد الأكثر واقعية. ما الفرق بين الفئات المتداخلة الثابتة وغير الثابتة؟ 1. لا يقوم كائن الفئة الثابتة Drawingبتخزين مرجع إلى مثيل محدد للفئة الخارجية. تذكر المثال من المحاضرة الأخيرة بالدراجة:
public class Bicycle {

   private String model;
   private int mawWeight;

   public Bicycle(String model, int mawWeight) {
       this.model = model;
       this.mawWeight = mawWeight;
   }

   public void start() {
       System.out.println("Go!");
   }

   public class SteeringWheel {

       public void right() {
           System.out.println("Steering wheel to the right!");
       }

       public void left() {

           System.out.println("Steering wheel to the left!");
       }
   }

}
تحدثنا هناك عن كيفية SteeringWheelتمرير إشارة إلى كائن من الطبقة الخارجية (الدراجة) إلى كل مثيل للفئة الداخلية (عجلة القيادة) دون أن نلاحظ Bicycle. بدون كائن من الطبقة الخارجية، ببساطة لا يمكن أن يوجد كائن من الطبقة الداخلية. هذا غير صحيح بالنسبة للفئات المتداخلة الثابتة. يمكن أن يوجد كائن من فئة متداخلة ثابتة بمفرده بسهولة. في هذا الصدد، تعتبر الفئات الثابتة أكثر "استقلالية" من الفئات غير الثابتة. النقطة الوحيدة هي أنه عند إنشاء مثل هذا الكائن تحتاج إلى تحديد اسم الفئة الخارجية:
public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
لماذا جعلنا الفصل Drawingثابتًا، لكن في المحاضرة الأخيرة كان الفصل Seat(مقعد الدراجة) غير ثابت؟ مثل المرة الأخيرة، دعونا نضيف القليل من "الفلسفة" لفهم المثال :) على عكس مقعد الدراجة، فإن جوهر الرسم ليس مرتبطًا بإحكام بجوهر الطائرة. غالبًا ما يكون كائن المقعد المنفصل، بدون دراجة، بلا معنى (وإن لم يكن دائمًا - تحدثنا عن هذا في الدرس الأخير). جوهر الرسم منطقي في حد ذاته. على سبيل المثال، قد يكون من المفيد للمهندسين الذين يخططون لإصلاح الطائرات. لا يحتاجون إلى الطائرة نفسها للتخطيط، ويمكن تحديد موقعها في أي مكان - يكفي الرسم فقط. بالإضافة إلى ذلك، بالنسبة لجميع الطائرات من نفس الطراز، سيظل الرسم هو نفسه، لذلك لا يوجد مثل هذا الاتصال الصارم كمقعد بالدراجة. لذلك، لا يحتاج الكائن Drawingإلى ارتباط بكائن طائرة محدد. 2. الوصول إلى المتغيرات والأساليب المختلفة للفصل الخارجي. يمكن للفئة المتداخلة الثابتة الوصول فقط إلى الحقول الثابتة للفئة الخارجية. في مثالنا، Drawingلدى الفئة طريقة getMaxPassengersCount()تقوم بإرجاع قيمة متغير ثابت maxPassengersCountمن فئة خارجية. ومع ذلك، لا يمكننا إنشاء طريقة getManufactureYear()لإرجاع Drawingقيمة manufactureYear. بعد كل شيء، المتغير manufactureYearغير ثابت، مما يعني أنه يجب أن ينتمي إلى نسخة محددة Boeing737. وكما اكتشفنا بالفعل، في حالة الفئات المتداخلة الثابتة، يمكن أن يكون كائن الطبقة الخارجية مفقودًا بسهولة. ومن هنا القيد :) لا يهم معدل الوصول الذي يمتلكه المتغير الثابت في الفئة الخارجية. حتى لو كان الأمر كذلك private، فسيظل هناك إمكانية الوصول من فئة متداخلة ثابتة. كل ما سبق لا يتعلق فقط بالوصول إلى المتغيرات الثابتة، ولكن أيضًا إلى الأساليب الثابتة. مهم! staticلا تعني الكلمة الموجودة في إعلان الفئة الداخلية أنه يمكن إنشاء كائن واحد فقط. لا تخلط بين الكائنات والمتغيرات. إذا كنا نتحدث عن المتغيرات الثابتة، فنعم، متغير الفئة الثابتة، على سبيل المثال، maxPassangersCountموجود في نسخة واحدة. ولكن عند تطبيقها على فئة متداخلة، staticفهذا يعني فقط أن كائناتها لا تحتوي على مراجع لكائنات الفئة الخارجية. ويمكننا إنشاء العديد من الكائنات كما نحب:
public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

       private int id;

       public Drawing(int id) {
           this.id = id;
       }

       public static int getPassengersCount() {

           return maxPassengersCount;
       }

       @Override
       public String toString() {
           return "Drawing{" +
                   "id=" + id +
                   '}';
       }

       public static void main(String[] args) {

           for (int i = 1; i < 6; i++) {

               Boeing737.Drawing drawing = new Boeing737.Drawing(i);
               System.out.println(drawing);
           }
       }
   }
}
لقد أعلنا عن الطريقة main()مباشرة في الفئة المتداخلة (لا يوجد سبب محدد لذلك - فقط لتعرف أن ذلك ممكن)، وقمنا بإنشاء 5 كائنات Drawing. على الرغم من أنه ليس لدينا كائن واحد من فئة خارجية. كما ترون، لم تكن هناك مشاكل :) إخراج وحدة التحكم:

Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
هذا يختتم درسنا! تحسبًا لذلك، سأترك لك رابطًا للقسم المتعلق بها في وثائق Oracle . اقرأها إذا كان هناك أي نقاط غير واضحة. الآن حان الوقت لحل بعض المشاكل! :)
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION