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.
Hari ini kita beralih ke kelompok kelas lain. Kami akan mempertimbangkan kelas bersarang statis.
Bagaimana mereka berbeda dari kelas lain? Saat mendeklarasikan kelas semacam ini, kami menggunakan kata kunci statis, yang sudah Anda kenal:
Dalam contoh ini, kita memiliki
Seperti 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


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
outer 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. 
Drawing
kelas 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 Handlebar
kelas dalam, tanpa disadari oleh kita, merujuk pada turunan dari Bicycle
kelas 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 Drawing
kelas statis ketika di pelajaran terakhir kami membuatSeat
kelas (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, aDrawing
objek 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, Drawing
kelas memiliki getMaxPassengersCount()
metode yang mengembalikan nilai maxPassengersCount
variabel statis kelas luar. Namun, kami tidak dapat membuat getManufactureYear()
metode di Drawing
kelas untuk mengembalikan nilai manufactureYear
. Lagi pula, manufactureYear
variabelnya 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, static
kata 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 static
diterapkan 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 Drawing
objek. 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! :)
GO TO FULL VERSION