Java nestet og indre klasse (med eksempler)

I denne vejledning lærer du om den indlejrede klasse i Java og dens typer ved hjælp af eksempler.

I Java kan du definere en klasse inden for en anden klasse. En sådan klasse er kendt som nested class. For eksempel,

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

Der er to typer indlejrede klasser, du kan oprette i Java.

  • Ikke-statisk indlejret klasse (indre klasse)
  • Statisk indlejret klasse

Anbefalet læsning :

  • Java Access Modifiers
  • Statisk Java-nøgleord

Lad os først se på ikke-statiske indlejrede klasser.

Ikke-statisk indlejret klasse (indre klasse)

En ikke-statisk indlejret klasse er en klasse inden for en anden klasse. Det har adgang til medlemmer af den lukkende klasse (ydre klasse). Det er almindeligt kendt som inner class.

Da det inner classeksisterer inden for den ydre klasse, skal du instantiere den ydre klasse først for at instantiere den indre klasse.

Her er et eksempel på, hvordan du kan erklære indre klasser i Java.

Eksempel 1: Indre 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()); ) )

Output :

 Processorcache = 4,3 RAM Urhastighed = 5,5

I ovenstående program er der to indlejrede klasser: Processor og RAM inde i den ydre klasse: CPU. Vi kan erklære den indre klasse som beskyttet. Derfor har vi erklæret RAM-klassen som beskyttet.

Inde i hovedklassen,

  • vi oprettede først en forekomst af en ydre klasse CPU ved navn cpu.
  • Ved hjælp af forekomsten af ​​den ydre klasse oprettede vi derefter objekter af indre klasser:
     CPU.Processor processor = cpu.new Processor; CPU.RAM ram = cpu.new RAM();

Bemærk : Vi bruger dot ( .) -operatoren til at oprette en forekomst af den indre klasse ved hjælp af den ydre klasse.

Adgang til medlemmer af ydre klasse inden for indre klasse

Vi kan få adgang til medlemmerne af den ydre klasse ved hjælp af dette nøgleord. Hvis du vil lære mere om dette nøgleord, skal du besøge Java dette nøgleord.

Eksempel 2: Adgang til medlemmer

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

Output :

 Motortype til 8WD = Større motortype til 4WD = mindre

I ovenstående program har vi den indre klasse ved navn Motor inde i den ydre klasse Bil. Her bemærker du linjen,

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

Vi bruger thisnøgleord til at få adgang til den ydre klasses carType-variabel. Du har måske bemærket, at i stedet for at bruge, har this.carTypevi brugt Car.this.carType.

Det er fordi, hvis vi ikke havde nævnt navnet på den ydre klasse Car, så thisvil nøgleordet repræsentere medlemmet i den indre klasse.

På samme måde har vi også adgang til metoden til den ydre klasse fra den indre klasse.

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

Det er vigtigt at bemærke, at selvom det getCarName()er en privatemetode, er vi i stand til at få adgang til det fra den indre klasse.

Statisk indlejret klasse

I Java kan vi også definere en staticklasse i en anden klasse. En sådan klasse er kendt som static nested class. Statisk indlejrede klasser kaldes ikke statiske indre klasser.

I modsætning til indre klasse kan en statisk indlejret klasse ikke få adgang til medlemsvariablerne i den ydre klasse. Det er fordi den statiske indlejrede klasse ikke kræver, at du opretter en forekomst af den ydre klasse.

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

Her opretter vi et objekt af den statiske indlejrede klasse ved blot at bruge klassens navn på den ydre klasse. Derfor kan der ikke henvises til den ydre klasse ved hjælp af OuterClass.this.

Eksempel 3: Statisk indre 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()); ) )

Output :

 Samlede porte = 3

I ovenstående program har vi oprettet en statisk klasse ved navn USB inde i klassen MotherBoard. Bemærk linjen,

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

Her opretter vi et USB-objekt ved hjælp af navnet på den ydre klasse.

Lad os nu se, hvad der ville ske, hvis du forsøger at få adgang til medlemmerne af den ydre klasse:

Eksempel 4: Adgang til medlemmer af ydre klasse inden for statisk indre 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()); ) )

Når vi prøver at køre programmet, får vi en fejl:

 fejl: ikke-statisk variabel, dette kan ikke refereres til fra en statisk kontekst

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.
  • Ikke-statiske indlejrede klasser (indre klasser) har adgang til andre medlemmer af den ydre / omsluttende klasse, selvom de erklæres private.

Interessante artikler...