Вкладений та внутрішній клас Java (з прикладами)

У цьому підручнику ви дізнаєтесь про вкладений клас у Java та його типи за допомогою прикладів.

У Java ви можете визначити клас у межах іншого класу. Такий клас відомий як nested class. Наприклад,

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

У Java можна створити два типи вкладених класів.

  • Нестатичний вкладений клас (внутрішній клас)
  • Статичний вкладений клас

Рекомендована література :

  • Модифікатори доступу до Java
  • Статичне ключове слово Java

Спочатку розглянемо нестатичні вкладені класи.

Нестатичний вкладений клас (внутрішній клас)

Нестатичний вкладений клас - це клас в іншому класі. Він має доступ до членів класу, що закриває (зовнішній клас). Це загальновідомо як inner class.

Оскільки inner classіснує в зовнішньому класі, ви повинні спочатку створити екземпляр зовнішнього класу, щоб створити екземпляр внутрішнього класу.

Ось приклад того, як ви можете оголосити внутрішні класи в Java.

Приклад 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

У наведеній вище програмі є два вкладені класи: процесор та оперативна пам’ять всередині зовнішнього класу: процесор. Ми можемо оголосити внутрішній клас захищеним. Отже, ми оголосили клас RAM як захищений.

Всередині основного класу,

  • ми спочатку створили екземпляр центрального процесора зовнішнього класу з назвою cpu.
  • Потім, використовуючи екземпляр зовнішнього класу, ми створили об'єкти внутрішніх класів:
     CPU.Processor processor = cpu.new Processor; CPU.RAM ram = cpu.new RAM();

Примітка : Ми використовуємо .оператор dot ( ) для створення екземпляра внутрішнього класу за допомогою зовнішнього класу.

Доступ до членів зовнішнього класу всередині внутрішнього класу

Ми можемо отримати доступ до членів зовнішнього класу, використовуючи це ключове слово. Якщо ви хочете дізнатись про це ключове слово, відвідайте Java це ключове слово.

Приклад 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()); ) )

Вихід :

 Тип двигуна для 8WD = Більший тип двигуна для 4WD = Менший

У наведеній вище програмі ми маємо внутрішній клас з назвою Engine всередині зовнішнього класу Car. Тут зверніть увагу на рядок,

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

Ми використовуємо thisключове слово для доступу до змінної carType зовнішнього класу. Ви могли помітити, що замість використання this.carTypeми використовували Car.this.carType.

Це тому, що якби ми не згадали назву зовнішнього класу Car, тоді thisключове слово буде представляти члена всередині внутрішнього класу.

Подібним чином ми також отримуємо доступ до методу зовнішнього класу з внутрішнього класу.

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

Важливо зазначити, що, хоча getCarName()це privateметод, ми маємо доступ до нього із внутрішнього класу.

Статичний вкладений клас

У Java ми також можемо визначити 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

У наведеній вище програмі ми створили статичний клас з назвою USB всередині класу MotherBoard. Зверніть увагу на рядок,

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

Тут ми створюємо об’єкт 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.
  • Нестатичні вкладені класи (внутрішні класи) мають доступ до інших членів зовнішнього / закритого класу, навіть якщо вони оголошені приватними.

Цікаві статті...