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
Hari ini kita beralih kepada kumpulan kelas lain. Kami akan mempertimbangkan kelas bersarang statik.
Bagaimanakah mereka berbeza daripada kelas lain? Apabila mengisytiharkan kelas jenis ini, kami menggunakan kata kunci statik, yang anda sudah biasa dengan:
Dalam contoh ini, kita mempunyai
Seperti 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


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;
}
}
}

Boeing737
kelas 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. 
Drawing
kelas 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 Handlebar
dalam, secara tidak dapat dilihat oleh kita, memberikan rujukan kepada contoh Bicycle
kelas 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 Drawing
kelas statik sedangkan dalam pelajaran lepas kita membuatSeat
kelas (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, aDrawing
objek 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, Drawing
kelas mempunyai getMaxPassengersCount()
kaedah yang mengembalikan nilai maxPassengersCount
pembolehubah statik kelas luar. Walau bagaimanapun, kita tidak boleh mencipta getManufactureYear()
kaedah dalam Drawing
kelas untuk mengembalikan nilai manufactureYear
. Lagipun, manufactureYear
pembolehubah 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, static
kata 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 static
digunakan 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 Drawing
objek. 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! :)
GO TO FULL VERSION