Java ugnezden in notranji razred (s primeri)

V tej vadnici boste s pomočjo primerov spoznali ugnezdeni razred v Javi in ​​njegove vrste.

V Javi lahko definirate razred znotraj drugega razreda. Tak razred je znan kot nested class. Na primer

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

V Javi lahko ustvarite dve vrsti ugnezdenih razredov.

  • Nestatični ugnezdeni razred (notranji razred)
  • Statični ugnezdeni razred

Priporočeno branje :

  • Modifikatorji dostopa Java
  • Statična ključna beseda Java

Najprej si oglejmo nestatične ugnezdene razrede.

Nestatični ugnezdeni razred (notranji razred)

Nestatični ugnezdeni razred je razred v drugem razredu. Ima dostop do članov zaprtega razreda (zunanji razred). Znano je kot inner class.

Ker inner classobstaja znotraj zunanjega razreda, morate najprej instantirati zunanji razred, da ustvarite notranji razred.

Tu je primer, kako lahko prijavite notranje razrede v Javi.

Primer 1: Notranji razred

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

Izhod :

 Predpomnilnik procesorja = 4,3 hitrosti RAM-a = 5,5

V zgornjem programu sta dva ugnezdena razreda: Procesor in RAM znotraj zunanjega razreda: CPU. Notranji razred lahko razglasimo za zaščiten. Zato smo razred RAM razglasili za zaščiten.

V glavnem razredu,

  • najprej smo ustvarili primerek CPU zunanjega razreda z imenom cpu.
  • Z uporabo primerka zunanjega razreda smo nato ustvarili predmete notranjih razredov:
     CPU.Processor processor = cpu.new Processor; CPU.RAM ram = cpu.new RAM();

Opomba : Z .operatorjem dot ( ) ustvarimo primerek notranjega razreda z uporabo zunanjega razreda.

Dostop do članov zunanjega razreda znotraj notranjega razreda

S to ključno besedo lahko dostopamo do članov zunanjega razreda. Če želite izvedeti več o tej ključni besedi, obiščite Javo.

Primer 2: Dostop do članov

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

Izhod :

 Tip motorja za 8WD = Večji tip motorja za 4WD = Manjši

V zgornjem programu imamo notranji razred z imenom Engine znotraj zunanjega razreda Car. Tukaj, opazite vrstico,

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

Za thisdostop do spremenljivke carType zunanjega razreda uporabljamo ključno besedo. Morda ste opazili, da smo namesto uporabe uporabili this.carTypemi Car.this.carType.

Če ne bi omenili imena zunanjega razreda Car, bo thisključna beseda predstavljala člana znotraj notranjega razreda.

Podobno dostopamo tudi do metode zunanjega razreda iz notranjega razreda.

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

Pomembno je omeniti, da čeprav getCarName()je to privatemetoda, lahko do nje dostopamo iz notranjega razreda.

Statični ugnezdeni razred

V Javi lahko definiramo tudi staticrazred znotraj drugega razreda. Tak razred je znan kot static nested class. Statični ugnezdeni razredi se ne imenujejo statični notranji razredi.

Za razliko od notranjega razreda statični ugnezdeni razred ne more dostopati do spremenljivk člana zunanjega razreda. To je zato, ker statični ugnezdeni razred ne zahteva, da ustvarite primerek zunanjega razreda.

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

Tu ustvarjamo objekt statičnega ugnezdenega razreda z uporabo imena razreda zunanjega razreda. Zato na zunanji razred ni mogoče sklicevati z uporabo OuterClass.this.

Primer 3: Statični notranji razred

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

Izhod :

 Skupno število pristanišč = 3

V zgornjem programu smo znotraj razreda MotherBoard ustvarili statični razred z imenom USB. Opazite vrstico,

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

Tu ustvarjamo objekt USB z imenom zunanjega razreda.

Zdaj pa poglejmo, kaj bi se zgodilo, če poskusite dostopati do članov zunanjega razreda:

Primer 4: Dostop do članov zunanjega razreda znotraj statičnega notranjega razreda

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

Ko bomo poskusili zagnati program, bomo dobili napako:

 napaka: nestatična spremenljivka, na katero ni mogoče sklicevati iz statičnega konteksta

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.
  • Nestatični ugnezdeni razredi (notranji razredi) imajo dostop do drugih članov zunanjega / zaprtega razreda, tudi če so razglašeni za zasebne.

Zanimive Članki...