Kelas Jawa Bersarang dan Dalaman (Dengan Contoh)

Dalam tutorial ini, anda akan belajar mengenai kelas bersarang di Java dan jenisnya dengan bantuan contoh.

Di Java, anda boleh menentukan kelas dalam kelas lain. Kelas sedemikian dikenali sebagai nested class. Sebagai contoh,

 class OuterClass ( //… class NestedClass ( //… ) )

Terdapat dua jenis kelas bersarang yang boleh anda buat di Java.

  • Kelas bersarang tidak statik (kelas dalam)
  • Kelas bersarang statik

Bacaan yang disyorkan :

  • Pengubah Akses Java
  • Kata Kunci Statik Java

Mari lihat dahulu kelas bersarang bukan statik.

Kelas Bersarang Bukan Statik (Kelas Dalam)

Kelas bersarang bukan statik adalah kelas dalam kelas lain. Ia mempunyai akses kepada anggota kelas penutup (kelas luar). Ia biasanya dikenali sebagai inner class.

Oleh kerana inner classwujud dalam kelas luar, anda mesti menunjukkan kelas luar terlebih dahulu, untuk mewujudkan kelas dalam.

Inilah contoh bagaimana anda boleh menyatakan kelas dalaman di Java.

Contoh 1: Kelas dalaman

 class CPU ( double price; // nested class class Processor( // members of nested class double cores; String manufacturer; double getCache()( return 4.3; ) ) // nested protected class protected class RAM( // members of protected nested class double memory; String manufacturer; double getClockSpeed()( return 5.5; ) ) ) public class Main ( public static void main(String() args) ( // create object of Outer class CPU CPU cpu = new CPU(); // create an object of inner class Processor using outer class CPU.Processor processor = cpu.new Processor(); // create an object of inner class RAM using outer class CPU CPU.RAM ram = cpu.new RAM(); System.out.println("Processor Cache = " + processor.getCache()); System.out.println("Ram Clock speed = " + ram.getClockSpeed()); ) )

Keluaran :

 Pemproses Cache = 4.3 Jam kelajuan Jam = 5.5

Dalam program di atas, terdapat dua kelas bersarang: Pemproses dan RAM di dalam kelas luar: CPU. Kita boleh menyatakan kelas dalaman dilindungi. Oleh itu, kami telah menyatakan kelas RAM sebagai dilindungi.

Di dalam kelas Utama,

  • kami pertama kali membuat contoh CPU kelas luar bernama cpu.
  • Dengan menggunakan contoh kelas luar, kami kemudian membuat objek kelas dalaman:
     CPU.Processor processor = cpu.new Processor; CPU.RAM ram = cpu.new RAM();

Catatan : Kami menggunakan .operator titik ( ) untuk membuat contoh kelas dalam menggunakan kelas luar.

Mengakses Anggota Kelas Luar dalam Kelas Dalam

Kita boleh mengakses ahli kelas luar dengan menggunakan kata kunci ini. Sekiranya anda ingin mengetahui tentang kata kunci ini, kunjungi Java kata kunci ini.

Contoh 2: Mengakses Ahli

 class Car ( String carName; String carType; // assign values using constructor public Car(String name, String type) ( this.carName = name; this.carType = type; ) // private method private String getCarName() ( return this.carName; ) // inner class class Engine ( String engineType; void setEngine() ( // Accessing the carType property of Car if(Car.this.carType.equals("4WD"))( // Invoking method getCarName() of Car if(Car.this.getCarName().equals("Crysler")) ( this.engineType = "Smaller"; ) else ( this.engineType = "Bigger"; ) )else( this.engineType = "Bigger"; ) ) String getEngineType()( return this.engineType; ) ) ) public class Main ( public static void main(String() args) ( // create an object of the outer class Car Car car1 = new Car("Mazda", "8WD"); // create an object of inner class using the outer class Car.Engine engine = car1.new Engine(); engine.setEngine(); System.out.println("Engine Type for 8WD= " + engine.getEngineType()); Car car2 = new Car("Crysler", "4WD"); Car.Engine c2engine = car2.new Engine(); c2engine.setEngine(); System.out.println("Engine Type for 4WD = " + c2engine.getEngineType()); ) )

Keluaran :

 Jenis Enjin untuk 8WD = Jenis Mesin Lebih Besar untuk 4WD = Lebih Kecil

Dalam program di atas, kami mempunyai kelas dalam yang dinamakan Engine di dalam kereta kelas luar. Di sini, perhatikan garis,

 if(Car.this.carType.equals("4WD")) (… )

Kami menggunakan thiskata kunci untuk mengakses pemboleh ubah carType dari kelas luar. Anda mungkin menyedari bahawa daripada menggunakan, this.carTypekami telah menggunakan Car.this.carType.

Ini kerana jika kita tidak menyebut nama kereta kelas luar, maka thiskata kunci akan mewakili anggota dalam kelas dalam.

Begitu juga, kita juga mengakses kaedah kelas luar dari kelas dalaman.

 if (Car.this.getCarName().equals("Crysler") (… )

Penting untuk diperhatikan bahawa, walaupun ini getCarName()adalah privatekaedah, kita dapat mengaksesnya dari kelas dalaman.

Kelas Bersarang Statik

Di Jawa, kita juga dapat menentukan statickelas di dalam kelas lain. Kelas sedemikian dikenali sebagai static nested class. Kelas bersarang statik tidak dipanggil kelas dalaman statik.

Tidak seperti kelas dalam, kelas bersarang statik tidak dapat mengakses pemboleh ubah anggota kelas luar. Ini kerana kelas bersarang statik tidak memerlukan anda membuat contoh kelas luar.

 OuterClass.NestedClass obj = new OuterClass.NestedClass();

Di sini, kami membuat objek kelas bersarang statik dengan hanya menggunakan nama kelas kelas luar. Oleh itu, kelas luar tidak boleh dirujuk menggunakan OuterClass.this.

Contoh 3: Kelas Dalam Statik

 class MotherBoard ( // static nested class static class USB( int usb2 = 2; int usb3 = 1; int getTotalPorts()( return usb2 + usb3; ) ) ) public class Main ( public static void main(String() args) ( // create an object of the static nested class // using the name of the outer class MotherBoard.USB usb = new MotherBoard.USB(); System.out.println("Total Ports = " + usb.getTotalPorts()); ) )

Keluaran :

 Jumlah Pelabuhan = 3

Dalam program di atas, kami telah membuat kelas statik bernama USB di dalam Motherboard kelas. Perhatikan garis,

 MotherBoard.USB usb = new MotherBoard.USB();

Di sini, kami membuat objek USB menggunakan nama kelas luar.

Sekarang, mari kita lihat apa yang akan berlaku sekiranya anda cuba mengakses ahli kelas luar:

Contoh 4: Mengakses anggota kelas Luar di dalam Kelas Dalam Statik

 class MotherBoard ( String model; public MotherBoard(String model) ( this.model = model; ) // static nested class static class USB( int usb2 = 2; int usb3 = 1; int getTotalPorts()( // accessing the variable model of the outer classs if(MotherBoard.this.model.equals("MSI")) ( return 4; ) else ( return usb2 + usb3; ) ) ) ) public class Main ( public static void main(String() args) ( // create an object of the static nested class MotherBoard.USB usb = new MotherBoard.USB(); System.out.println("Total Ports = " + usb.getTotalPorts()); ) )

Semasa kita menjalankan program, kita akan mendapat ralat:

 ralat: pemboleh ubah bukan statik ini tidak dapat dirujuk dari konteks statik

This is because we are not using the object of the outer class to create an object of the inner class. Hence, there is no reference to the outer class Motherboard stored in Motherboard.this.

Key Points to Remember

  • Java treats the inner class as a regular member of a class. They are just like methods and variables declared inside a class.
  • Since inner classes are members of the outer class, you can apply any access modifiers like private, protected to your inner class which is not possible in normal classes.
  • Since the nested class is a member of its enclosing outer class, you can use the dot (.) notation to access the nested class and its members.
  • Using the nested class will make your code more readable and provide better encapsulation.
  • Kelas bersarang bukan statik (kelas dalam) mempunyai akses kepada anggota kelas luar / lampiran yang lain, walaupun mereka dinyatakan sebagai peribadi.

Artikel menarik...