JavaRush /Java blogi /Random-UZ /Statik ichki o'rnatilgan sinflar

Statik ichki o'rnatilgan sinflar

Guruhda nashr etilgan
Salom! Biz Java-da ichki o'rnatilgan sinflar mavzusini o'rganishda davom etamiz. Oxirgi darsda biz statik bo'lmagan ichki sinflar yoki ular ham deyilganidek, ichki sinflar haqida gaplashdik. Statik o'rnatilgan sinflar - 2Bugun boshqa guruhga o'tamiz va statik o'rnatilgan sinflarni batafsil ko'rib chiqamiz. Statik o'rnatilgan sinflar - 3Ular boshqa guruhlardan qanday farq qiladi? Bunday sinfni e'lon qilishda biz allaqachon tanish bo'lgan statik kalit so'zdan foydalanamiz:
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 o'rnatilgan sinflar - 4Ushbu misolda bizda Boeing737ushbu modeldagi samolyotni yaratadigan tashqi sinf mavjud. Va u bitta parametrga ega bo'lgan konstruktorga ega: ishlab chiqarilgan yili ( int manufactureYear). Bundan tashqari, bitta statik o'zgaruvchi mavjud int maxPassengersCount- maksimal yo'lovchilar soni. Xuddi shu modeldagi barcha samolyotlar uchun bir xil bo'ladi, shuning uchun bizga faqat bitta nusxa kerak. Bundan tashqari, u statik ichki sinfga ega Drawing- samolyot rejasi. Ushbu sinfda biz samolyot haqidagi barcha xizmat ma'lumotlarini qamrab olishimiz mumkin. Bizning misolimizda, soddalik uchun, biz uni ishlab chiqarilgan yili bilan chekladik, ammo u boshqa ko'plab ma'lumotlarni o'z ichiga olishi mumkin. Statik o'rnatilgan sinflar - 5Oxirgi ma'ruzada muhokama qilganimizdek, bunday ichki sinfni yaratish inkapsulyatsiyani oshiradi va yanada realroq abstraksiyaga yordam beradi. Statik va statik bo'lmagan ichki o'rnatilgan sinflar o'rtasidagi farq nima? 1. Statik sinf ob'ekti Drawingtashqi sinfning ma'lum bir misoliga havolani saqlamaydi. Velosiped bilan oxirgi ma'ruzadagi misolni eslang:
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!");
       }
   }

}
SteeringWheelU erda biz tashqi sinf (velosiped) ob'ektiga havola qanday qilib ichki sinfning (rulning) har bir misoliga o'zimizga e'tibor bermasdan uzatilishi haqida gaplashdik Bicycle. Tashqi sinf ob'ekti bo'lmasa, ichki sinf ob'ekti mavjud bo'lolmaydi. Bu statik ichki o'rnatilgan sinflar uchun to'g'ri emas. Statik ichki sinf ob'ekti osongina o'z-o'zidan mavjud bo'lishi mumkin. Shu munosabat bilan, statik sinflar statik bo'lmagan sinflarga qaraganda ko'proq "mustaqil". Bitta nuqta shundaki, bunday ob'ektni yaratishda siz tashqi sinf nomini ko'rsatishingiz kerak:
public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
Nima uchun biz sinfni Drawingstatik qildik, lekin oxirgi ma'ruzada sinf Seat(velosiped o'rindig'i) statik emas edi? O'tgan safargidek, misolni tushunish uchun biroz "falsafa" qo'shamiz :) Velosiped o'rindig'idan farqli o'laroq, chizmaning mohiyati samolyotning mohiyatiga unchalik qattiq bog'lanmagan. Velosipedsiz alohida o'rindiq ob'ekti ko'pincha ma'nosiz bo'ladi (har doim ham emas - biz bu haqda oxirgi darsda gaplashgan edik). Chizmaning mohiyati o'z-o'zidan ma'noga ega. Masalan, samolyotlarni ta'mirlashni rejalashtirayotgan muhandislar uchun foydali bo'lishi mumkin. Rejalashtirish uchun ularga samolyotning o'zi kerak emas va ularni istalgan joyda joylashtirish mumkin - shunchaki chizma kifoya qiladi. Bundan tashqari, bir xil modeldagi barcha samolyotlar uchun chizma hali ham bir xil bo'ladi, shuning uchun velosiped bilan o'rindiq kabi qattiq aloqa yo'q. Shuning uchun ob'ektga Drawingma'lum bir samolyot ob'ektiga havola kerak emas. 2. Tashqi sinfning o'zgaruvchilari va usullariga turlicha kirish. Statik ichki sinf faqat tashqi sinfning statik maydonlariga kirishi mumkin. Bizning misolimizda sinfda tashqi sinfdan statik o'zgaruvchining qiymatini qaytaradigan Drawingusul mavjud . Biroq, biz qiymatni qaytarish uchun usul yarata olmaymiz . Axir, o'zgaruvchi statik emas, ya'ni u ma'lum bir misolga tegishli bo'lishi kerak . Va biz allaqachon aniqlaganimizdek, statik ichki sinflar holatida tashqi sinf ob'ekti osongina yo'qolishi mumkin. Demak, cheklov :) Tashqi sinfdagi statik o'zgaruvchiga qanday kirish modifikatori bo'lishi muhim emas. Agar shunday bo'lsa ham , statik o'rnatilgan sinfdan kirish hali ham mavjud bo'ladi. Yuqorida aytilganlarning barchasi nafaqat statik o'zgaruvchilarga, balki statik usullarga ham tegishli. MUHIM! Ichki sinf deklaratsiyasidagi so'z faqat bitta ob'ekt yaratilishi mumkinligini anglatmaydi. Ob'ektlarni o'zgaruvchilar bilan aralashtirmang. Agar biz statik o'zgaruvchilar haqida gapiradigan bo'lsak, ha, statik sinf o'zgaruvchisi, masalan, bitta nusxada mavjud. Ammo ichki sinfga qo'llanilganda, bu faqat uning ob'ektlarida tashqi sinf ob'ektlariga havolalar mavjud emasligini anglatadi. Va biz xohlagancha ob'ektlar yaratishimiz mumkin: 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 usulni main()to'g'ridan-to'g'ri o'rnatilgan sinfda e'lon qildik (buning uchun hech qanday sabab yo'q - bu mumkinligini bilish uchun) va 5 ta ob'ekt yaratdik Drawing. Bizda tashqi sinfning bitta ob'ekti yo'qligiga qaramay. Ko'rib turganingizdek, hech qanday muammo yo'q edi :) Konsol chiqishi:

Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
Bu bizning darsimizni yakunlaydi! Har holda, men sizga Oracle hujjatlarida ular haqidagi bo'limga havola qoldiraman . Agar tushunarsiz nuqtalar bo'lsa, uni o'qing. Endi bir nechta muammolarni hal qilish vaqti keldi! :)
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION