Вложенный и внутренний класс 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

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

Внутри основного класса

  • сначала мы создали экземпляр ЦП внешнего класса с именем cpu.
  • Затем, используя экземпляр внешнего класса, мы создали объекты внутренних классов:
     CPU.Processor processor = cpu.new Processor; CPU.RAM ram = cpu.new RAM();

Примечание . Мы используем .оператор dot ( ) для создания экземпляра внутреннего класса с использованием внешнего класса.

Доступ к членам внешнего класса внутри внутреннего класса

Мы можем получить доступ к членам внешнего класса с помощью этого ключевого слова. Если вы хотите узнать об этом ключевом слове, посетите Java this keyword.

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

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