Java Nested dan Inner Class (Dengan Contoh)

Dalam tutorial ini, Anda akan belajar tentang kelas bersarang di Java dan tipenya dengan bantuan contoh.

Di Java, Anda dapat menentukan kelas di dalam kelas lain. Kelas seperti itu dikenal sebagai nested class. Sebagai contoh,

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

Ada dua jenis kelas bertingkat yang dapat Anda buat di Java.

  • Kelas bersarang non-statis (kelas dalam)
  • Kelas bertingkat statis

Bacaan yang direkomendasikan :

  • Pengubah Akses Java
  • Kata Kunci Statis Java

Pertama-tama, mari kita lihat kelas bertingkat non-statis.

Kelas Bersarang Non-Statis (Kelas Dalam)

Kelas bersarang non-statis adalah kelas di dalam kelas lain. Ini memiliki akses ke anggota kelas yang melampirkan (kelas luar). Ini umumnya dikenal sebagai inner class.

Karena sudah inner classada di dalam kelas luar, Anda harus membuat instance kelas luar terlebih dahulu, untuk membuat instance kelas dalam.

Berikut adalah contoh bagaimana Anda bisa mendeklarasikan kelas dalam di Java.

Contoh 1: Kelas batin

 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 :

 Cache Prosesor = 4.3 Ram Kecepatan clock = 5.5

Dalam program di atas, ada dua kelas bersarang: Prosesor dan RAM di dalam kelas luar: CPU. Kita bisa mendeklarasikan kelas dalam sebagai dilindungi. Karenanya, kami telah menyatakan kelas RAM sebagai dilindungi.

Di dalam kelas Utama,

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

Catatan : Kami menggunakan .operator dot ( ) untuk membuat instance kelas dalam menggunakan kelas luar.

Mengakses Anggota Kelas Luar dalam Kelas Dalam

Kita dapat mengakses anggota kelas luar dengan menggunakan kata kunci ini. Jika Anda ingin mempelajari tentang kata kunci ini, kunjungi Java dengan kata kunci ini.

Contoh 2: Mengakses Anggota

 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 :

 Tipe Mesin untuk 8WD = Tipe Mesin Lebih Besar untuk 4WD = Lebih Kecil

Dalam program di atas, kami memiliki kelas dalam bernama Mesin di dalam mobil kelas luar. Di sini, perhatikan barisnya,

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

Kami menggunakan thiskata kunci untuk mengakses variabel carType dari kelas luar. Anda mungkin telah memperhatikan bahwa alih-alih menggunakan this.carTypekami telah menggunakan Car.this.carType.

Karena jika kita belum menyebutkan nama mobil kelas luar, maka thiskata kunci akan mewakili anggota kelas dalam.

Demikian pula, kami juga mengakses metode kelas luar dari kelas dalam.

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

Penting untuk dicatat bahwa, meskipun getCarName()adalah sebuah privatemetode, kami dapat mengaksesnya dari kelas dalam.

Kelas Bersarang Statis

Di Java, kita juga bisa mendefinisikan statickelas di dalam kelas lain. Kelas seperti itu dikenal sebagai static nested class. Kelas bertingkat statis tidak disebut kelas dalam statis.

Tidak seperti kelas dalam, kelas bertingkat statis tidak dapat mengakses variabel anggota kelas luar. Itu karena kelas bertingkat statis tidak mengharuskan Anda membuat instance dari kelas luar.

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

Di sini, kami membuat objek kelas bersarang statis hanya dengan menggunakan nama kelas dari kelas luar. Oleh karena itu, kelas luar tidak dapat dirujuk menggunakan OuterClass.this.

Contoh 3: Kelas Dalam Statis

 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 Port = 3

Dalam program di atas, kami telah membuat kelas statis bernama USB di dalam kelas MotherBoard. Perhatikan garisnya,

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

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

Sekarang, mari kita lihat apa yang akan terjadi jika Anda mencoba mengakses anggota kelas luar:

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

 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()); ) )

Saat kami mencoba menjalankan program, kami akan mendapatkan kesalahan:

 error: variabel non-statis ini tidak dapat dirujuk dari konteks statis

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 non-statis (kelas dalam) memiliki akses ke anggota lain dari kelas luar / penutup, meskipun mereka dinyatakan sebagai pribadi.

Artikel yang menarik...