Вебинары Разобраться в IT Реферальная программа Тесты
Программирование Аналитика Дизайн Маркетинг Управление проектами
12 Ноя 2024
2 мин
126

Различия между статическими и нестатическими вложенными классами в Java

В программировании Java возникает необходимость в создании классов, которые будут использоваться только в рамках другого, более крупного класса. Такие

В программировании Java возникает необходимость в создании классов, которые будут использоваться только в рамках другого, более крупного класса. Такие классы называются вложенными классами. Однако при их создании может возникнуть вопрос: сделать его статическим или нет?

Давайте разберемся в разнице между статическими и нестатическими вложенными классами на примере.

Возьмем класс Car, который содержит вложенный класс Engine.

public class Car {

   private String color;
   private Engine engine;

   public class Engine {
      private int power;
   }
}

Engine в данном случае является нестатическим вложенным классом. Это означает, что он связан с конкретным экземпляром класса Car. Для создания объекта Engine требуется существующий объект Car.

Car car = new Car();
Car.Engine engine = car.new Engine();

Таким образом, нестатический вложенный класс имеет доступ ко всем полям и методам объекта внешнего класса, даже если они объявлены как private.

С другой стороны, если вложенный класс Engine объявлен как static, он становится статическим вложенным классом.

public class Car {

   private String color;
   private Engine engine;

   public static class Engine {
      private int power;
   }
}

В этом случае, Engine не связан с конкретным экземпляром Car, а связан с самим классом Car. Такой класс можно создать без создания экземпляра внешнего класса.

Car.Engine engine = new Car.Engine();

Однако статический вложенный класс не имеет доступа к нестатическим полям и методам внешнего класса, так как они привязаны к конкретному экземпляру.

В заключение, можно сказать, что выбор между статическим и нестатическим вложенным классом зависит от того, требуется ли связь с конкретным экземпляром внешнего класса или нет.

Добавить комментарий