JavaRush /Java Blog /Random-ID /Kelas bersarang statis

Kelas bersarang statis

Dipublikasikan di grup Random-ID
Halo! Kami terus mengeksplorasi topik kelas bersarang di Java. Dalam pelajaran terakhir kita berbicara tentang kelas bersarang non-statis atau, sebagaimana disebut juga, kelas dalam. Kelas bersarang statis - 2Hari ini mari kita beralih ke grup lain dan melihat lebih dekat kelas bersarang statis. Kelas bersarang statis - 3Apa bedanya mereka dengan kelompok lain? Saat mendeklarasikan kelas seperti itu, kami menggunakan kata kunci static yang sudah familiar:
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 statis - 4Dalam contoh ini, kita memiliki kelas eksternal Boeing737yang membuat pesawat model ini. Dan dia memiliki konstruktor dengan satu parameter: tahun pembuatan ( int manufactureYear). Ada juga satu variabel statis int maxPassengersCount- jumlah penumpang maksimum. Ini akan sama untuk semua pesawat dengan model yang sama, jadi kita hanya perlu satu salinan. Selain itu, ia memiliki kelas dalam statis Drawing- cetak biru pesawat. Di kelas ini kita dapat merangkum semua informasi layanan tentang pesawat. Dalam contoh kami, untuk kesederhanaan, kami membatasinya pada tahun pembuatannya, namun dapat berisi banyak informasi lainnya. Kelas bersarang statis - 5Seperti yang kita bahas di kuliah terakhir, membuat kelas bersarang akan meningkatkan enkapsulasi dan mendorong abstraksi yang lebih realistis. Apa perbedaan antara kelas bersarang statis dan non-statis? 1. Objek kelas statis Drawingtidak menyimpan referensi ke instance spesifik dari kelas luar. Ingat contoh kuliah terakhir dengan sepeda:
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 berbicara tentang bagaimana SteeringWheelreferensi ke objek kelas luar (sepeda) diteruskan ke setiap instance kelas dalam (roda kemudi) tanpa kita sadari Bicycle. Tanpa objek kelas luar, objek kelas dalam tidak akan ada. Hal ini tidak berlaku untuk kelas bersarang statis. Sebuah objek dari kelas bersarang statis dapat dengan mudah berdiri sendiri. Dalam hal ini, kelas statis lebih “independen” dibandingkan kelas non-statis. Satu-satunya hal adalah saat membuat objek seperti itu, Anda perlu menentukan nama kelas eksternal:
public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
Kenapa kelasnya kita jadikan Drawingstatis, padahal pada perkuliahan kemarin kelas Seat(jok sepeda) tidak statis? Seperti sebelumnya, mari tambahkan sedikit "filosofi" untuk memahami contohnya :) Berbeda dengan jok sepeda, esensi gambarnya tidak terlalu terikat dengan esensi pesawat terbang. Benda tempat duduk yang terpisah, tanpa sepeda, sering kali tidak ada artinya (walaupun tidak selalu - kita telah membicarakan hal ini di pelajaran terakhir). Inti dari gambar itu sendiri masuk akal. Misalnya, mungkin berguna bagi para insinyur yang merencanakan perbaikan pesawat terbang. Mereka tidak memerlukan pesawat itu sendiri untuk perencanaan, dan dapat ditempatkan di mana saja - cukup dengan gambar saja. Selain itu, untuk semua pesawat dengan model yang sama, gambarnya akan tetap sama, sehingga tidak ada sambungan kaku seperti tempat duduk dengan sepeda. Oleh karena itu, objek tersebut Drawingtidak memerlukan link ke objek pesawat tertentu. 2. Akses yang berbeda terhadap variabel dan metode kelas eksternal. Kelas bersarang statis hanya dapat mengakses bidang statis kelas luar. Dalam contoh kita, kelas Drawingmemiliki metode getMaxPassengersCount()yang mengembalikan nilai variabel statis maxPassengersCountdari kelas eksternal. Namun, kami tidak dapat membuat metode getManufactureYear()untuk Drawingmengembalikan nilai manufactureYear. Bagaimanapun, suatu variabel manufactureYearbersifat non-statis, yang berarti variabel tersebut harus milik instance tertentu Boeing737. Dan seperti yang telah kita ketahui, dalam kasus kelas bersarang statis, objek kelas luar dapat dengan mudah hilang. Oleh karena itu batasannya :) Tidak masalah pengubah akses apa yang dimiliki variabel statis di kelas luar. Meskipun demikian private, masih ada akses dari kelas bersarang statis. Semua hal di atas tidak hanya menyangkut akses ke variabel statis, tetapi juga metode statis. PENTING! Kata staticdalam deklarasi inner class tidak berarti hanya satu objek yang dapat dibuat. Jangan bingung antara objek dengan variabel. Jika kita berbicara tentang variabel statis, ya, variabel kelas statis, misalnya, maxPassangersCountada dalam satu salinan. Namun bila diterapkan pada kelas bertingkat, staticitu hanya berarti bahwa objeknya tidak berisi referensi ke objek kelas luar. Dan kita dapat membuat objek sebanyak 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 mendeklarasikan metode main()secara langsung di kelas bersarang (tidak ada alasan khusus untuk ini - supaya Anda tahu itu mungkin), dan membuat 5 objek Drawing. Terlepas dari kenyataan bahwa kita tidak memiliki satu objek pun dari kelas eksternal. Seperti yang Anda lihat, tidak ada masalah :) Output konsol:

Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
Ini mengakhiri pelajaran kita! Untuk berjaga-jaga, saya akan meninggalkan Anda tautan ke bagian tentang mereka di dokumentasi Oracle . Bacalah jika ada poin yang kurang jelas. Sekarang saatnya menyelesaikan beberapa masalah! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION