JavaRush /Blog Java /Random-MS /Kelas bersarang statik

Kelas bersarang statik

Diterbitkan dalam kumpulan
hello! Kami terus meneroka topik kelas bersarang di Jawa. Dalam pelajaran lepas kita bercakap tentang kelas bersarang bukan statik atau, kerana ia juga dipanggil, kelas dalaman. Kelas bersarang statik - 2Hari ini mari kita beralih kepada kumpulan lain dan lihat dengan lebih dekat kelas bersarang statik. Kelas bersarang statik - 3Bagaimanakah mereka berbeza daripada kumpulan lain? Apabila mengisytiharkan kelas sedemikian, kami menggunakan kata kunci statik yang sudah biasa:
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;
       }
   }
}
Kelas bersarang statik - 4Dalam contoh ini, kami mempunyai kelas luaran Boeing737yang mencipta kapal terbang model ini. Dan dia mempunyai pembina dengan satu parameter: tahun pembuatan ( int manufactureYear). Terdapat juga satu pembolehubah statik int maxPassengersCount- bilangan maksimum penumpang. Ia akan menjadi sama untuk semua pesawat model yang sama, jadi kami hanya memerlukan satu salinan. Di samping itu, ia mempunyai kelas dalaman statik Drawing- pelan tindakan kapal terbang. Dalam kelas ini kita boleh merangkum semua maklumat perkhidmatan tentang pesawat. Dalam contoh kami, untuk kesederhanaan, kami mengehadkannya kepada tahun pembuatan, tetapi ia boleh mengandungi banyak maklumat lain. Kelas bersarang statik - 5Seperti yang kita bincangkan dalam kuliah lepas, mencipta kelas bersarang seperti itu meningkatkan enkapsulasi dan menggalakkan abstraksi yang lebih realistik. Apakah perbezaan antara kelas bersarang statik dan bukan statik? 1. Objek kelas statik Drawingtidak menyimpan rujukan kepada contoh khusus kelas luar. Ingat contoh dari kuliah terakhir dengan basikal:
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!");
       }
   }

}
Di sana kita bercakap tentang bagaimana SteeringWheelrujukan kepada objek kelas luar (basikal) dihantar ke setiap contoh kelas dalam (roda stereng) tanpa kita perasan Bicycle. Tanpa objek kelas luar, objek kelas dalam tidak mungkin wujud. Ini tidak benar untuk kelas bersarang statik. Objek kelas bersarang statik boleh wujud dengan mudah sendiri. Dalam hal ini, kelas statik lebih "bebas" daripada kelas bukan statik. Satu-satunya perkara ialah apabila mencipta objek sedemikian, anda perlu menentukan nama kelas luaran:
public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
Mengapa kami menjadikan kelas Drawingstatik, tetapi dalam kuliah terakhir kelas Seat(kerusi basikal) adalah tidak statik? Seperti yang lepas, mari kita tambah sedikit "falsafah" untuk memahami contoh :) Berbeza dengan tempat duduk basikal, intipati lukisan tidak begitu rapat dengan intipati kapal terbang. Objek tempat duduk yang berasingan, tanpa basikal, selalunya tidak bermakna (walaupun tidak selalu - kita bercakap tentang ini dalam pelajaran lepas). Intipati lukisan itu masuk akal dengan sendirinya. Sebagai contoh, ia mungkin berguna kepada jurutera yang merancang pembaikan pesawat. Mereka tidak memerlukan pesawat itu sendiri untuk perancangan, dan boleh didapati di mana-mana - hanya lukisan sudah memadai. Di samping itu, untuk semua pesawat model yang sama, lukisan akan tetap sama, jadi tiada sambungan tegar seperti tempat duduk dengan basikal. Oleh itu, objek Drawingtidak memerlukan pautan ke objek pesawat tertentu. 2. Akses berbeza kepada pembolehubah dan kaedah kelas luaran. Kelas bersarang statik hanya boleh mengakses medan statik kelas luar. Dalam contoh kami, kelas Drawingmempunyai kaedah getMaxPassengersCount()yang mengembalikan nilai pembolehubah statik maxPassengersCountdaripada kelas luaran. Walau bagaimanapun, kami tidak boleh mencipta kaedah getManufactureYear()untuk Drawingmengembalikan nilai manufactureYear. Lagipun, pembolehubah manufactureYearadalah bukan statik, yang bermaksud ia mesti tergolong dalam contoh tertentu Boeing737. Dan seperti yang telah kita ketahui, dalam kes kelas bersarang statik, objek kelas luar boleh hilang dengan mudah. Oleh itu batasannya :) Tidak kira apa pengubah suai akses yang dimiliki oleh pembolehubah statik dalam kelas luar. Walaupun ia private, masih akan ada akses daripada kelas bersarang statik. Semua perkara di atas bukan sahaja melibatkan akses kepada pembolehubah statik, tetapi juga kepada kaedah statik. PENTING! Perkataan staticdalam pengisytiharan kelas dalaman tidak bermakna bahawa hanya satu objek boleh dibuat. Jangan mengelirukan objek dengan pembolehubah. Jika kita bercakap tentang pembolehubah statik, ya, pembolehubah kelas statik, sebagai contoh, maxPassangersCountwujud dalam satu salinan. Tetapi apabila digunakan pada kelas bersarang, staticia hanya bermakna objeknya tidak mengandungi rujukan kepada objek kelas luar. Dan kita boleh mencipta seberapa banyak objek yang kita suka:
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);
           }
       }
   }
}
Kami mengisytiharkan kaedah main()secara terus dalam kelas bersarang (tiada sebab tertentu untuk ini - hanya supaya anda tahu ia mungkin), dan mencipta 5 objek Drawing. Walaupun fakta bahawa kita tidak mempunyai objek tunggal kelas luaran. Seperti yang anda lihat, tiada masalah :) Output konsol:

Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
Ini menyimpulkan pelajaran kita! Untuk berjaga-jaga, saya akan meninggalkan anda pautan ke bahagian tentang mereka dalam dokumentasi Oracle . Bacalah jika ada perkara yang kurang jelas. Kini tiba masanya untuk menyelesaikan beberapa masalah! :)
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION