Java nestet og indre klasse (med eksempler)

I denne veiledningen lærer du om den nestede klassen i Java og dens typer ved hjelp av eksempler.

I Java kan du definere en klasse i en annen klasse. En slik klasse er kjent som nested class. For eksempel,

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

Det er to typer nestede klasser du kan lage i Java.

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

Anbefalt lesing :

  • Java Access Modifiers
  • Java Static Keyword

La oss først se på ikke-statiske nestede klasser.

Ikke-statisk nestet klasse (indre klasse)

En ikke-statisk nestet klasse er en klasse i en annen klasse. Den har tilgang til medlemmer av den omsluttende klassen (ytre klasse). Det er ofte kjent som inner class.

Siden det inner classeksisterer i den ytre klassen, må du instantiere den ytre klassen først, for å instantiere den indre klassen.

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

Utgang :

 Prosessorbuffer = 4,3 RAM Klokkehastighet = 5,5

I programmet ovenfor er det to nestede klasser: Prosessor og RAM i den ytre klassen: CPU. Vi kan erklære den indre klassen som beskyttet. Derfor har vi erklært RAM-klassen som beskyttet.

Inne i hovedklassen,

  • vi opprettet først en forekomst av en ytre klasse CPU kalt CPU.
  • Ved å bruke forekomsten av den ytre klassen opprettet vi objekter av indre klasser:
     CPU.Processor processor = cpu.new Processor; CPU.RAM ram = cpu.new RAM();

Merk : Vi bruker dot ( .) -operatøren for å opprette en forekomst av den indre klassen ved hjelp av den ytre klassen.

Tilgang til medlemmer av ytre klasse innen indre klasse

Vi kan få tilgang til medlemmene i den ytre klassen ved å bruke dette nøkkelordet. Hvis du vil lære om dette nøkkelordet, kan du gå til Java dette nøkkelordet.

Eksempel 2: Få tilgang 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()); ) )

Utgang :

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

I programmet ovenfor har vi den indre klassen som heter Motor inne i den ytre klassen Bil. Her, legg merke til linjen,

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

Vi bruker thisnøkkelord for å få tilgang til carType-variabelen i den ytre klassen. Du har kanskje lagt merke til at i stedet for å bruke har this.carTypevi brukt Car.this.carType.

Det er fordi hvis vi ikke hadde nevnt navnet på den ytre klassen Bil, vil thisnøkkelordet representere medlemmet i den indre klassen.

På samme måte får vi også tilgang til metoden til den ytre klassen fra den indre klassen.

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

Det er viktig å merke seg at selv om det getCarName()er en privatemetode, har vi tilgang til den fra den indre klassen.

Statisk nestet klasse

I Java kan vi også definere en staticklasse i en annen klasse. En slik klasse er kjent som static nested class. Statisk nestede klasser kalles ikke statiske indre klasser.

I motsetning til indre klasse, kan en statisk nestet klasse ikke få tilgang til medlemsvariablene i den ytre klassen. Det er fordi den statiske nestede klassen ikke krever at du oppretter en forekomst av den ytre klassen.

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

Her lager vi et objekt av den statiske nestede klassen ved å bare bruke klassenavnet til den ytre klassen. Derfor kan ikke den ytre klassen refereres til ved hjelp av 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()); ) )

Utgang :

 Totalt antall porter = 3

I programmet ovenfor har vi opprettet en statisk klasse med navnet USB inne i klassen MotherBoard. Legg merke til linjen,

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

Her lager vi et USB-objekt ved å bruke navnet på den ytre klassen.

La oss nå se hva som ville skje hvis du prøver å få tilgang til medlemmene i den ytre klassen:

Eksempel 4: Få tilgang til medlemmer av ytre klasse i 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 å kjøre programmet, får vi en feil:

 feil: ikke-statisk variabel dette kan ikke refereres fra 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 nestede klasser (indre klasser) har tilgang til andre medlemmer av den ytre / omsluttende klassen, selv om de blir erklært private.

Interessante artikler...