Јава угнежђена и унутрашња класа (са примерима)

У овом упутству ћете научити о угнежђеној класи у Јави и њеним типовима уз помоћ примера.

У Јави можете дефинисати класу у оквиру друге класе. Таква класа је позната као nested class. На пример,

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

Постоје две врсте угнежђених класа које можете креирати у Јави.

  • Нестатична угнежђена класа (унутрашња класа)
  • Статична угнежђена класа

Препоручена литература :

  • Јава Модификатори приступа
  • Статична кључна реч Јава

Погледајмо прво не-статичке угнежђене класе.

Нестатична угнежђена класа (унутрашња класа)

Нестатична угнежђена класа је класа у другој класи. Има приступ члановима затворене класе (спољне класе). Опште је познато као inner class.

Будући да inner classпостоји унутар спољне класе, прво морате да направите инстанцу спољне класе да бисте направили инстанцу за унутрашњу класу.

Ево примера како можете да пријавите унутрашње класе у Јави.

Пример 1: Унутрашња класа

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

Излаз :

 Кеш меморије процесора = 4,3 РАМ Такт брзине = 5,5

У горњем програму постоје две угнежђене класе: Процесор и РАМ унутар спољне класе: ЦПУ. Унутрашњу класу можемо прогласити заштићеном. Стога смо класу РАМ прогласили заштићеном.

Унутар главне класе,

  • прво смо креирали инстанцу централне процесорске јединице класе назване цпу.
  • Користећи инстанцу спољне класе, тада смо креирали објекте унутрашњих класа:
     CPU.Processor processor = cpu.new Processor; CPU.RAM ram = cpu.new RAM();

Напомена : Користимо .оператор дот ( ) за креирање инстанце унутрашње класе помоћу спољне класе.

Приступ члановима спољне класе унутар унутрашње класе

Члановима спољне класе можемо приступити помоћу ове кључне речи. Ако желите да сазнате више о овој кључној речи, посетите Јаву.

Пример 2: Приступ члановима

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

Излаз :

 Тип мотора за 8ВД = Већи тип мотора за 4ВД = Мањи

У горе наведеном програму имамо унутрашњу класу названу Енгине унутар спољне класе Цар. Ево, примети ред,

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

Користимо thisкључну реч за приступ променљивој царТипе спољне класе. Можда сте приметили да смо уместо да користимо this.carTypeми Car.this.carType.

То је зато што ако нисмо споменули име спољне класе Цар, тада thisће кључна реч представљати члана унутар унутрашње класе.

Слично томе, приступамо и методи спољне класе из унутрашње класе.

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

Важно је напоменути да, иако getCarName()је то privateметода, можемо јој приступити из унутрашње класе.

Статична угнежђена класа

У Јави такође можемо дефинисати staticкласу унутар друге класе. Таква класа је позната као static nested class. Статичне угнежђене класе се не називају статичким унутрашњим класама.

За разлику од интерне класе, статичка угнежђена класа не може приступити променљивим чланова спољне класе. То је зато што статична угнежђена класа не захтева да креирате инстанцу спољне класе.

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

Овде креирамо објекат статичке угнежђене класе једноставним коришћењем имена класе спољне класе. Стога се на спољну класу не може референцирати коришћењем OuterClass.this.

Пример 3: Статичка унутрашња класа

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

Излаз :

 Укупно портова = 3

У горенаведеном програму створили смо статичку класу под називом УСБ унутар класе МотхерБоард. Обратите пажњу на линију,

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

Овде креирамо УСБ објекат користећи име спољне класе.

Сада, да видимо шта би се догодило ако покушате да приступите члановима спољне класе:

Пример 4: Приступ члановима спољне класе унутар статичке унутрашње класе

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

Када покушамо да покренемо програм, добићемо грешку:

 грешка: нестатична променљива на ово се не може позивати из статичког контекста

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.
  • Нестатичне угнежђене класе (унутрашње класе) имају приступ осталим члановима спољне / затворене класе, чак и ако су проглашене приватним.

Занимљиви Чланци...