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 Тактова честота на RAM = 5,5

В горната програма има два вложени класа: Процесор и RAM във външния клас: CPU. Можем да обявим вътрешния клас за защитен. Следователно ние обявихме класа RAM като защитен.

В основния клас,

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

Интересни статии...