CodeGym /Java Blog /Acak /Kelas bersarang statis
John Squirrels
Level 41
San Francisco

Kelas bersarang statis

Dipublikasikan di grup Acak
Hai! Kami terus mengeksplorasi topik kelas bersarang di Jawa. Pada latihan terakhir, kita berbicara tentang kelas bersarang non-statis, yang juga dikenal sebagai kelas dalam. Kelas bersarang statis - 1Hari ini kita beralih ke kelompok kelas lain. Kami akan mempertimbangkan kelas bersarang statis. Kelas bersarang statis - 3Bagaimana mereka berbeda dari kelas lain? Saat mendeklarasikan kelas semacam ini, kami menggunakan kata kunci statis, yang sudah Anda kenal:

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 Boeing737outer class, yang merepresentasikan pesawat jenis ini. Ini memiliki konstruktor dengan satu parameter: tahun pembuatan ( int manufactureYear). Ada juga satu variabel statis: jumlah penumpang maksimum ( int maxPassengersCount). Ini akan memiliki nilai yang sama untuk semua pesawat dengan model yang sama, jadi kita hanya memerlukan satu instance. Selain itu, ia memiliki kelas bersarang statis: Drawing(mewakili cetak biru teknik pesawat). Kami menggunakan kelas ini untuk merangkum semua informasi resmi tentang pesawat. Dalam contoh kami, untuk penyederhanaan, kami membatasi kelas ini pada tahun pembuatan, tetapi dapat berisi banyak informasi lainnya. Kelas bersarang statis - 5Seperti yang kami katakan di pelajaran terakhir, membuat kelas bersarang seperti itu meningkatkan enkapsulasi dan berkontribusi pada abstraksi yang lebih realistis. Apa perbedaan antara kelas bersarang statis dan non-statis? 1. Objek dari Drawingkelas statis tidak menyimpan referensi ke instance spesifik dari kelas luar. Ingat contoh sepeda dari pelajaran terakhir:

public class Bicycle {

   private String model;
   private int maxWeight;

   public Bicycle(String model, int maxWeight) {
       this.model = model;
       this.maxWeight = maxWeight;
   }
  
   public void start() {
       System.out.println("Let's go!");
   }

   public class Handlebar {

       public void right() {
           System.out.println("Steer right!");
       }

       public void left() {

           System.out.println("Steer left!");
       }
   }

}
Dalam pelajaran itu, kita berbicara tentang fakta bahwa setiap turunan dari Handlebarkelas dalam, tanpa disadari oleh kita, merujuk pada turunan dari Bicyclekelas luar. Tanpa turunan dari kelas luar, objek dari kelas dalam tidak akan ada. Untuk kelas bersarang statis, ini bukan masalahnya. Objek dari kelas bersarang statis sepenuhnya mampu ada dengan sendirinya. Dalam hal ini, kelas statis lebih "independen" daripada non-statis. Satu-satunya hal yang perlu Anda ketahui adalah saat membuat objek seperti itu, Anda harus menentukan nama kelas luar:

public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
Mengapa kami membuat Drawingkelas statis ketika di pelajaran terakhir kami membuatSeatkelas (mewakili kursi sepeda) non-statis? Seperti yang terakhir kali, mari tambahkan sedikit "filosofi" untuk memahami contoh :) Tidak seperti jok sepeda, konsep gambar teknik tidak terikat secara kaku dengan konsep pesawat terbang. Tanpa sepeda, objek jok sepeda yang terpisah seringkali tidak ada artinya (meski tidak selalu, kita membicarakannya di pelajaran terakhir). Konsep gambar teknik masuk akal dengan sendirinya. Sebagai contoh, mungkin bermanfaat bagi para insinyur yang merencanakan pemeliharaan pesawat. Pesawat tidak diperlukan untuk membuat rencana dan dapat ditemukan di mana saja. Hanya gambar teknik yang diperlukan. Selain itu, semua pesawat dengan model yang sama akan memiliki gambar insinyur yang sama, sehingga tidak ada hubungan yang erat dengan kursi sepeda. Oleh karena itu, aDrawingobjek tidak memerlukan referensi ke objek pesawat tertentu. 2. Akses berbeda ke variabel dan metode kelas luar. Kelas bersarang statis hanya dapat mengakses bidang statis dari kelas luar. Dalam contoh kita, Drawingkelas memiliki getMaxPassengersCount()metode yang mengembalikan nilai maxPassengersCountvariabel statis kelas luar. Namun, kami tidak dapat membuat getManufactureYear()metode di Drawingkelas untuk mengembalikan nilai manufactureYear. Lagi pula, manufactureYearvariabelnya adalah non-statis, yang artinya harus dimiliki oleh instance tertentu dari Boeing737. Dan seperti yang telah kita temukan, dalam kasus kelas bersarang statis, objek kelas luar mungkin dengan mudah tidak ada. Karenanya, batasannya :) Tidak masalah pengubah akses mana yang dimiliki variabel statis di kelas luar. Bahkan jika ituprivate, kelas bersarang statis akan tetap memiliki akses. Semua hal di atas tidak hanya berlaku untuk akses ke variabel statis, tetapi juga untuk metode statis. PENTING! Dalam deklarasi kelas dalam, statickata kunci tidak berarti bahwa Anda hanya dapat membuat satu objek. Jangan bingung objek dengan variabel. Jika kita berbicara tentang variabel statis, maka, ya, ada satu contoh variabel kelas statis, misalnya, maxPassangersCount. Tetapi ketika staticditerapkan ke kelas bersarang, itu hanya berarti objeknya tidak mengandung referensi ke objek kelas luar. Dan kita dapat membuat objek itu sendiri sebanyak yang kita inginkan:

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 main()metode secara langsung di kelas bersarang (tidak ada alasan khusus untuk ini — hanya untuk memberi tahu Anda bahwa ini mungkin), dan membuat 5 Drawingobjek. Terlepas dari kenyataan bahwa kami tidak memiliki satu objek pun dari kelas luar. Seperti yang Anda lihat, ini tidak menimbulkan masalah :) Keluaran konsol:

Drawing{id=1} 
Drawing{id=2} 
Drawing{id=3} 
Drawing{id=4} 
Drawing{id=5}
Dan itu mengakhiri pelajaran kita! Untuk jaga-jaga, saya akan meninggalkan Anda tautan ke bagian tentang mereka di dokumentasi Oracle . Jika ada sesuatu yang masih belum jelas, bacalah. Sekarang saatnya bagi saya untuk menyelesaikan beberapa tugas! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION