Статические вложенные классы в Java: использование, отличия и примеры
Статические вложенные классы в Java
Узнайте, как работают статические вложенные классы в Java, чем они отличаются от внутренних классов и когда их использовать с практическими примерами кода.
В Java класс может быть определен внутри другого класса. Они называются вложенными классами и бывают двух форм:
- Нестатические вложенные классы (внутренние классы)
- Статические вложенные классы
Внутренние классы были рассмотрены в нашем предыдущем руководстве, эта статья фокусируется на статических вложенных классах.
Статический вложенный класс в Java
Чтобы объявить вложенный класс как статический, просто добавьте ключевое слово static:
class Animal { static class Mammal { // статические и нестатические члены Mammal } // члены Animal }
Как и любой класс, статический вложенный класс может содержать как статические, так и экземплярные члены.
Поскольку он является статическим членом своего внешнего класса, вы можете получить доступ к статическому вложенному классу без создания экземпляра внешнего класса.
Пример: Статический вложенный класс
class Animal { // внутренний класс class Reptile { public void displayInfo() { System.out.println("I am a reptile."); } } // статический вложенный класс static class Mammal { public void displayInfo() { System.out.println("I am a mammal."); } } } class Main { public static void main(String[] args) { // создание экземпляра внешнего класса Animal animal = new Animal(); // создание экземпляра нестатического внутреннего класса Animal.Reptile reptile = animal.new Reptile(); reptile.displayInfo(); // создание экземпляра статического вложенного класса Animal.Mammal mammal = new Animal.Mammal(); mammal.displayInfo(); } }
Вывод:
I am a reptile. I am a mammal.
В коде выше Mammal — статический вложенный класс, а Reptile — внутренний класс.
Обратите внимание на разный синтаксис инстанцирования:
- Нестатический внутренний класс:
Animal.Reptile reptile = animal.new Reptile(); - Статический вложенный класс:
Animal.Mammal mammal = new Animal.Mammal();
Доступ к членам внешнего класса
Поскольку статический вложенный класс ассоциирован со своим внешним классом, он может обращаться только к статическим членам внешнего класса. Попытки ссылки на экземплярные члены приведут к ошибке компиляции.
Пример: Попытка вызова нестатического метода
class Animal { static class Mammal { public void displayInfo() { System.out.println("I am a mammal."); } } class Reptile { public void displayInfo() { System.out.println("I am a reptile."); } } public void eat() { System.out.println("I eat food."); } } class Main { public static void main(String[] args) { Animal animal = new Animal(); Animal.Reptile reptile = animal.new Reptile(); reptile.displayInfo(); Animal.Mammal mammal = new Animal.Mammal(); mammal.displayInfo(); mammal.eat(); // ❌ Ошибка компиляции } }
Вывод:
Main.java:28: error: cannot find symbol mammal.eat(); ^ symbol: method eat() location: variable mammal of type Mammal 1 error compiler exit status 1
Ошибка возникает, потому что mammal является экземпляром статического вложенного класса и не может вызвать нестатический метод eat() класса Animal.
Статический верхнеуровневый класс?
Java запрещает статические верхнеуровневые классы. Только вложенные классы могут быть объявлены static. Следующий код демонстрирует ошибку компилятора:
static class Animal { public static void displayInfo() { System.out.println("I am an animal"); } } class Main { public static void main(String[] args) { Animal.displayInfo(); } }
Вывод:
Main.java:1: error: modifier static not allowed here static class Animal { ^ 1 error compiler exit status 1
Это подтверждает, что только вложенные классы могут быть static.
java
- Ключевое слово static в C#: статические переменные, методы и классы
- Вложенные классы в C#: определение, использование и наследование
- Ключевое слово final в Java: переменные, методы и классы
- Оператор instanceof в Java: полное руководство с примерами
- Вложенные и внутренние классы в Java: типы, примеры и лучшие практики
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Паттерн Singleton в Java: как реализовать и безопасно использовать
- Рефлексия в Java: инспекция классов, методов и полей во время выполнения
- Освоение Java ObjectOutputStream: сериализация, методы и практические примеры
- Освоение Java Generics: создание переиспользуемого, типобезопасного кода