Java ugniježđena i unutarnja klasa (s primjerima)

U ovom ćete tutorijalu uz primjere naučiti o ugniježđenoj klasi u Javi i njezinim vrstama.

U Javi možete definirati klasu unutar druge klase. Takva klasa poznata je kao nested class. Na primjer,

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

Postoje dvije vrste ugniježđenih klasa koje možete stvoriti u Javi.

  • Nestatična ugniježđena klasa (unutarnja klasa)
  • Statična ugniježđena klasa

Preporučena literatura :

  • Java Modifikatori pristupa
  • Statična ključna riječ Java

Pogledajmo prvo nestetičke ugniježđene klase.

Nestatična ugniježđena klasa (unutarnja klasa)

Nestatična ugniježđena klasa je klasa u drugoj klasi. Ima pristup članovima klase koja zatvara (vanjska klasa). Općenito je poznat kao inner class.

Budući da inner classpostoji unutar vanjske klase, prvo morate instantirati vanjsku klasu da biste napravili instancu za unutarnju klasu.

Evo primjera kako možete proglasiti unutarnje klase u Javi.

Primjer 1: Unutarnja klasa

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

Izlaz :

 Predmemorija procesora = 4,3 Takt brzine RAM-a = 5,5

U gornjem programu postoje dvije ugniježđene klase: Procesor i RAM unutar vanjske klase: CPU. Unutarnju klasu možemo proglasiti zaštićenom. Stoga smo klasu RAM proglasili zaštićenom.

Unutar glavne klase,

  • prvo smo stvorili instancu CPU-a vanjske klase nazvane cpu.
  • Koristeći instancu vanjske klase, tada smo kreirali objekte unutarnjih klasa:
     CPU.Processor processor = cpu.new Processor; CPU.RAM ram = cpu.new RAM();

Napomena : Koristimo .operator dot ( ) za stvaranje instance unutarnje klase pomoću vanjske klase.

Pristup članovima vanjske klase unutarnje klase

Članovima vanjske klase možemo pristupiti pomoću ove ključne riječi. Ako želite saznati više o ovoj ključnoj riječi, posjetite Javu ovu ključnu riječ.

Primjer 2: Pristup članovima

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

Izlaz :

 Tip motora za 8WD = Veći tip motora za 4WD = Manji

U gornjem programu imamo unutarnju klasu nazvanu Motor unutar vanjske klase Car. Evo, primijetite crtu,

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

Koristimo thisključnu riječ za pristup varijabli carType vanjske klase. Možda ste primijetili da smo umjesto korištenja koristili this.carTypemi Car.this.carType.

To je zato što ako nismo spomenuli ime vanjske klase Car, tada thisće ključna riječ predstavljati člana unutarnje klase.

Slično tome, pristupamo i metodi vanjske klase iz unutarnje klase.

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

Važno je napomenuti da, iako getCarName()je privatemetoda, možemo joj pristupiti iz unutarnje klase.

Statična ugniježđena klasa

U Javi također možemo definirati staticklasu unutar druge klase. Takva klasa poznata je kao static nested class. Statične ugniježđene klase ne nazivaju se statičkim unutarnjim klasama.

Za razliku od unutarnje klase, statička ugniježđena klasa ne može pristupiti varijablama člana vanjske klase. To je zato što statička ugniježđena klasa ne zahtijeva da kreirate instancu vanjske klase.

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

Ovdje stvaramo objekt statične ugniježđene klase jednostavnim korištenjem naziva klase vanjske klase. Stoga se vanjska klasa ne može referencirati pomoću OuterClass.this.

Primjer 3: Statička unutarnja klasa

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

Izlaz :

 Ukupno luka = ​​3

U gornjem programu stvorili smo statičnu klasu nazvanu USB unutar klase MotherBoard. Primijetite crtu,

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

Ovdje stvaramo objekt USB koristeći naziv vanjske klase.

Sada, da vidimo što bi se dogodilo ako pokušate pristupiti članovima vanjske klase:

Primjer 4: Pristup članovima vanjske klase unutar statičke unutarnje klase

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

Kad pokušamo pokrenuti program, dobit ćemo pogrešku:

 pogreška: nestatična varijabla na koju se ne može referencirati iz statičkog 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čne ugniježđene klase (unutarnje klase) imaju pristup ostalim članovima vanjske / zatvorene klase, čak i ako su proglašene privatnim.

Zanimljivi članci...