Verschachtelte und innere Java-Klasse (mit Beispielen)

In diesem Tutorial lernen Sie anhand von Beispielen die verschachtelte Klasse in Java und ihre Typen kennen.

In Java können Sie eine Klasse innerhalb einer anderen Klasse definieren. Eine solche Klasse ist bekannt als nested class. Beispielsweise,

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

Es gibt zwei Arten verschachtelter Klassen, die Sie in Java erstellen können.

  • Nicht statische verschachtelte Klasse (innere Klasse)
  • Statisch verschachtelte Klasse

Empfohlene Lektüre :

  • Java Access Modifiers
  • Java Static Keyword

Schauen wir uns zunächst nicht statische verschachtelte Klassen an.

Nicht statische verschachtelte Klasse (innere Klasse)

Eine nicht statisch verschachtelte Klasse ist eine Klasse innerhalb einer anderen Klasse. Es hat Zugriff auf Mitglieder der einschließenden Klasse (äußere Klasse). Es ist allgemein bekannt als inner class.

Da das inner classinnerhalb der äußeren Klasse existiert, müssen Sie zuerst die äußere Klasse instanziieren, um die innere Klasse zu instanziieren.

Hier ist ein Beispiel, wie Sie innere Klassen in Java deklarieren können.

Beispiel 1: Innere Klasse

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

Ausgabe :

 Prozessor-Cache = 4,3 RAM-Taktrate = 5,5

Im obigen Programm gibt es zwei verschachtelte Klassen: Prozessor und RAM innerhalb der äußeren Klasse: CPU. Wir können die innere Klasse als geschützt deklarieren. Daher haben wir die RAM-Klasse als geschützt deklariert.

Innerhalb der Hauptklasse,

  • Wir haben zuerst eine Instanz einer CPU der äußeren Klasse namens CPU erstellt.
  • Mit der Instanz der äußeren Klasse haben wir dann Objekte innerer Klassen erstellt:
     CPU.Processor processor = cpu.new Processor; CPU.RAM ram = cpu.new RAM();

Hinweis : Wir verwenden den .Operator dot ( ), um eine Instanz der inneren Klasse mit der äußeren Klasse zu erstellen.

Zugriff auf Mitglieder der äußeren Klasse innerhalb der inneren Klasse

Mit diesem Schlüsselwort können wir auf die Mitglieder der äußeren Klasse zugreifen. Wenn Sie mehr über dieses Schlüsselwort erfahren möchten, besuchen Sie Java dieses Schlüsselwort.

Beispiel 2: Zugriff auf Mitglieder

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

Ausgabe :

 Motortyp für 8WD = größer Motortyp für 4WD = kleiner

Im obigen Programm haben wir die innere Klasse namens Engine in der äußeren Klasse Car. Beachten Sie hier die Linie,

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

Wir verwenden das thisSchlüsselwort, um auf die Variable carType der äußeren Klasse zuzugreifen. Sie haben vielleicht bemerkt, dass this.carTypewir anstelle von verwendet haben Car.this.carType.

Wenn wir den Namen des Autos der äußeren Klasse nicht erwähnt haben, thisrepräsentiert das Schlüsselwort das Mitglied innerhalb der inneren Klasse.

In ähnlicher Weise greifen wir auch von der inneren Klasse auf die Methode der äußeren Klasse zu.

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

Es ist wichtig zu beachten, dass wir , obwohl dies getCarName()eine privateMethode ist, von der inneren Klasse aus darauf zugreifen können.

Statisch verschachtelte Klasse

In Java können wir auch eine staticKlasse innerhalb einer anderen Klasse definieren. Eine solche Klasse ist bekannt als static nested class. Statisch verschachtelte Klassen werden nicht als statische innere Klassen bezeichnet.

Im Gegensatz zur inneren Klasse kann eine statisch verschachtelte Klasse nicht auf die Mitgliedsvariablen der äußeren Klasse zugreifen. Dies liegt daran, dass Sie für die statisch verschachtelte Klasse keine Instanz der äußeren Klasse erstellen müssen.

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

Hier erstellen wir ein Objekt der statisch verschachtelten Klasse, indem wir einfach den Klassennamen der äußeren Klasse verwenden. Daher kann die äußere Klasse nicht mit referenziert werden OuterClass.this.

Beispiel 3: Statische innere Klasse

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

Ausgabe :

 Gesamtzahl der Ports = 3

Im obigen Programm haben wir eine statische Klasse namens USB in der Klasse MotherBoard erstellt. Beachten Sie die Linie,

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

Hier erstellen wir ein USB-Objekt mit dem Namen der äußeren Klasse.

Nun wollen wir sehen, was passieren würde, wenn Sie versuchen, auf die Mitglieder der äußeren Klasse zuzugreifen:

Beispiel 4: Zugriff auf Mitglieder der äußeren Klasse innerhalb der statischen inneren Klasse

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

Wenn wir versuchen, das Programm auszuführen, erhalten wir eine Fehlermeldung:

 Fehler: Nicht statische Variable, auf die in einem statischen Kontext nicht verwiesen werden kann

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.
  • Nicht statische verschachtelte Klassen (innere Klassen) haben Zugriff auf andere Mitglieder der äußeren / umschließenden Klasse, selbst wenn sie als privat deklariert sind.

Interessante Beiträge...