JavaRush /Java Blogu /Random-AZ /Statik iç-içə siniflər

Statik iç-içə siniflər

Qrupda dərc edilmişdir
Salam! Java-da iç-içə siniflər mövzusunu araşdırmağa davam edirik. Keçən dərsdə biz qeyri-statik yuvalanmış siniflər və ya onları da adlandırdıqları kimi daxili siniflər haqqında danışdıq. Statik daxili siniflər - 2Bu gün gəlin başqa qrupa keçək və statik yuvalanmış siniflərə daha yaxından nəzər salaq. Statik daxili siniflər - 3Onlar digər qruplardan nə ilə fərqlənirlər? Belə bir sinfi elan edərkən biz artıq tanış olan statik açar sözündən istifadə edirik:
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;
       }
   }
}
Statik daxili siniflər - 4Bu nümunədə Boeing737bu modelin təyyarəsini yaradan xarici sinifimiz var. Və onun bir parametri olan bir konstruktoru var: istehsal ili ( int manufactureYear). Bir statik dəyişən də var int maxPassengersCount- maksimum sərnişin sayı. Eyni modelin bütün təyyarələri üçün eyni olacaq, ona görə də bizə yalnız bir nüsxə lazımdır. Bundan əlavə, onun statik daxili sinfi var Drawing- təyyarə planı. Bu sinifdə biz təyyarə haqqında bütün xidmət məlumatlarını əhatə edə bilərik. Bizim nümunəmizdə sadəlik üçün onu istehsal ili ilə məhdudlaşdırdıq, lakin bir çox başqa məlumatları ehtiva edə bilər. Statik daxili siniflər - 5Keçən mühazirədə müzakirə etdiyimiz kimi, belə bir iç-içə sinfin yaradılması inkapsulyasiyanı artırır və daha real abstraksiyanı təşviq edir. Statik və qeyri-statik yuvalanmış siniflər arasındakı fərq nədir? 1. Statik sinif obyekti Drawingxarici sinfin konkret nümunəsinə istinad saxlamır. Velosipedlə son mühazirədən nümunəni xatırlayın:
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!");
       }
   }

}
SteeringWheelOrada xarici sinif (velosiped) obyektinə istinadın daxili sinifin (sükan çarxı) hər bir nümunəsinə bizə fərq etmədən necə ötürülməsindən danışdıq Bicycle. Xarici sinfin obyekti olmadan daxili sinfin obyekti sadəcə mövcud ola bilməzdi. Bu, statik yuvalanmış siniflər üçün doğru deyil. Statik yuvalanmış sinfin obyekti asanlıqla öz-özünə mövcud ola bilər. Bu baxımdan, statik siniflər qeyri-statik siniflərdən daha çox "müstəqildir". Yeganə məqam ondan ibarətdir ki, belə bir obyekt yaratarkən xarici sinfin adını göstərməlisiniz:
public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
Niyə biz sinfi Drawingstatik etdik, amma sonuncu mühazirədə sinif Seat(velosiped oturacağı) qeyri-statik idi? Keçən dəfə olduğu kimi, nümunəni başa düşmək üçün bir az da “fəlsəfə” əlavə edək :) Velosiped oturacağından fərqli olaraq, rəsmin mahiyyəti təyyarənin mahiyyətinə o qədər də sıx bağlı deyil. Velosipedsiz ayrıca oturacaq obyekti çox vaxt mənasız olacaq (həmişə olmasa da - bu barədə keçən dərsdə danışdıq). Rəsmin mahiyyəti özlüyündə məna kəsb edir. Məsələn, təyyarə təmirini planlaşdıran mühəndislər üçün faydalı ola bilər. Planlaşdırma üçün təyyarənin özünə ehtiyacı yoxdur və hər yerdə yerləşdirilə bilər - sadəcə bir rəsm kifayətdir. Bundan əlavə, eyni modelin bütün təyyarələri üçün rəsm hələ də eyni olacaq, buna görə də velosipedlə oturacaq kimi sərt bir əlaqə yoxdur. Buna görə də, obyektin Drawingxüsusi bir təyyarə obyektinə keçidə ehtiyacı yoxdur. 2. Xarici sinfin dəyişənlərinə və metodlarına müxtəlif giriş. Statik daxili sinif yalnız xarici sinfin statik sahələrinə daxil ola bilər. Bizim nümunəmizdə sinifdə xarici sinifdən statik dəyişənin dəyərini qaytaran Drawingbir metod var . Bununla belə, dəyəri qaytarmaq üçün metod yarada bilmirik . Axı, dəyişən qeyri-statikdir, yəni o, müəyyən bir nümunəyə aid olmalıdır . Artıq aşkar etdiyimiz kimi, statik yuvalanmış siniflər vəziyyətində xarici sinfin obyekti asanlıqla itə bilər. Məhdudiyyət buna görədir :) Xarici sinifdəki statik dəyişənin hansı giriş modifikatorunun olmasının fərqi yoxdur. Olsa belə , yenə də statik yuvalanmış sinifdən giriş olacaq. Yuxarıda göstərilənlərin hamısı təkcə statik dəyişənlərə deyil, həm də statik metodlara aiddir. ƏHƏMİYYƏTLİ! Daxili sinif bəyannaməsindəki söz yalnız bir obyektin yaradıla biləcəyi demək deyil. Obyektləri dəyişənlərlə qarışdırmayın. Əgər biz statik dəyişənlərdən danışırıqsa, bəli, məsələn, bir nüsxədə statik sinif dəyişəni mövcuddur. Lakin yuvalanmış sinifə tətbiq edildikdə, bu, yalnız onun obyektlərində xarici sinif obyektlərinə istinadların olmaması deməkdir. İstədiyimiz qədər obyekt yarada bilərik: getMaxPassengersCount()maxPassengersCountgetManufactureYear()DrawingmanufactureYearmanufactureYearBoeing737privatestaticmaxPassangersCountstatic
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);
           }
       }
   }
}
Biz metodu main()birbaşa yuvalanmış sinifdə elan etdik (bunun üçün heç bir səbəb yoxdur - bunun mümkün olduğunu bildiyiniz üçün) və 5 obyekt yaratdıq Drawing. Baxmayaraq ki, bizdə bir xarici sinif obyekti yoxdur. Gördüyünüz kimi heç bir problem yoxdu :) Konsol çıxışı:

Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
Bununla dərsimiz yekunlaşır! Hər halda, mən sizə Oracle sənədlərində onlar haqqında bölməyə keçid buraxacağam . Aydın olmayan məqamlar varsa oxuyun. İndi bir neçə problemi həll etməyin vaxtı gəldi! :)
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION