CodeGym /Blog Java /rawak /Kelas bersarang statik
John Squirrels
Tahap
San Francisco

Kelas bersarang statik

Diterbitkan dalam kumpulan
Hai! Kami terus meneroka topik kelas bersarang di Jawa. Dalam latihan terakhir, kita bercakap tentang kelas bersarang bukan statik, yang juga dikenali sebagai kelas dalaman Kelas bersarang statik - 1Hari ini kita beralih kepada kumpulan kelas lain. Kami akan mempertimbangkan kelas bersarang statik. Kelas bersarang statik - 3Bagaimanakah mereka berbeza daripada kelas lain? Apabila mengisytiharkan kelas jenis ini, kami menggunakan kata kunci statik, yang anda sudah biasa dengan:

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, kita mempunyai Boeing737kelas luar, yang mewakili kapal terbang jenis ini. Ia mempunyai pembina dengan satu parameter: tahun pembuatan ( int manufactureYear). Terdapat juga satu pembolehubah statik: bilangan maksimum penumpang ( int maxPassengersCount). Ia akan mempunyai nilai yang sama untuk semua satah model yang sama, jadi kami hanya memerlukan satu contoh. Selain itu, ia mempunyai kelas bersarang statik: Drawing(mewakili pelan tindakan kejuruteraan pesawat). Kami menggunakan kelas ini untuk merangkum semua maklumat rasmi tentang pesawat. Dalam contoh kami, untuk kesederhanaan, kami telah mengehadkan kelas ini kepada tahun pembuatan, tetapi ia boleh mengandungi banyak maklumat lain. Kelas bersarang statik - 5Seperti yang kami katakan dalam pelajaran lepas, mencipta kelas bersarang seperti itu meningkatkan enkapsulasi dan menyumbang kepada abstraksi yang lebih realistik. Apakah perbezaan antara kelas bersarang statik dan bukan statik? 1. Objek Drawingkelas statik tidak menyimpan rujukan kepada contoh khusus kelas luar. Ingat contoh basikal dari pelajaran lepas:

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 bercakap tentang fakta bahawa setiap contoh kelas Handlebardalam, secara tidak dapat dilihat oleh kita, memberikan rujukan kepada contoh Bicyclekelas luar. Tanpa contoh kelas luar, objek kelas dalam tidak mungkin wujud. Untuk kelas bersarang statik, ini tidak berlaku. Objek kelas bersarang statik sepenuhnya mampu wujud dengan sendirinya. Dalam hal ini, kelas statik lebih "bebas" daripada tidak statik. Satu-satunya perkara yang perlu anda ketahui ialah apabila mencipta objek sedemikian, anda mesti 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();
   }
}
Mengapakah kita membuat Drawingkelas statik sedangkan dalam pelajaran lepas kita membuatSeatkelas (mewakili tempat duduk basikal) tidak statik? Macam lepas, mari tambah sedikit "falsafah" untuk memahami contoh :) Berbeza dengan tempat duduk basikal, konsep lukisan kejuruteraan tidak terikat secara tegar dengan konsep pesawat. Tanpa basikal, objek tempat duduk basikal yang berasingan selalunya tidak bermakna (walaupun tidak selalu, kita bercakap tentang perkara ini dalam pelajaran lepas). Konsep lukisan kejuruteraan masuk akal dengan sendirinya. Sebagai contoh, ia boleh berguna kepada jurutera yang merancang penyelenggaraan kapal terbang. Kapal terbang tidak diperlukan untuk membuat rancangan dan boleh didapati di mana-mana sahaja. Hanya lukisan kejuruteraan diperlukan. Di samping itu, semua pesawat dengan model yang sama akan mempunyai lukisan jurutera yang sama, jadi tidak ada hubungan rapat seperti yang wujud dengan tempat duduk basikal. Oleh itu, aDrawingobjek tidak memerlukan rujukan kepada objek kapal terbang tertentu. 2. Akses yang berbeza kepada pembolehubah dan kaedah kelas luar. Kelas bersarang statik hanya boleh mengakses medan statik kelas luar. Dalam contoh kami, Drawingkelas mempunyai getMaxPassengersCount()kaedah yang mengembalikan nilai maxPassengersCountpembolehubah statik kelas luar. Walau bagaimanapun, kita tidak boleh mencipta getManufactureYear()kaedah dalam Drawingkelas untuk mengembalikan nilai manufactureYear. Lagipun, manufactureYearpembolehubah itu bukan statik, yang bermaksud ia mesti tergolong dalam contoh tertentu Boeing737. Dan seperti yang telah kita temui, dalam kes kelas bersarang statik, objek kelas luar mungkin tidak hadir dengan mudah. Oleh itu, hadnya :) Tidak kira pengubahsuai akses mana yang ada pada pembolehubah statik dalam kelas luar. Walaupun begituprivate, kelas bersarang statik masih akan mempunyai akses. Semua perkara di atas digunakan bukan sahaja untuk akses kepada pembolehubah statik, tetapi juga kepada kaedah statik. PENTING! Dalam pengisytiharan kelas dalaman, statickata kunci tidak bermakna anda boleh mencipta satu objek sahaja. Jangan mengelirukan objek dengan pembolehubah. Jika kita bercakap tentang pembolehubah statik, maka, ya, wujud satu contoh pembolehubah kelas statik, sebagai contoh, maxPassangersCount. Tetapi apabila staticdigunakan pada kelas bersarang, ia hanya bermakna objeknya tidak mengandungi rujukan kepada objek kelas luar. Dan kita boleh mencipta seberapa banyak objek itu sendiri seperti yang kita mahu:

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 main()kaedah secara terus dalam kelas bersarang (tiada sebab khas untuk ini - hanya untuk memberitahu anda bahawa ini mungkin), dan mencipta 5 Drawingobjek. Walaupun pada hakikatnya kita tidak mempunyai satu objek pun dari kelas luar. Seperti yang anda lihat, ini tidak menimbulkan sebarang masalah :) Output konsol:

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