В этом руководстве вы узнаете о вложенном статическом классе с помощью примеров. Вы также узнаете, чем статические классы отличаются от внутренних классов.
Как было показано в предыдущих руководствах, в Java можно создать класс внутри другого класса. Такие классы известны как вложенные классы. В Java вложенные классы бывают двух типов:
- Вложенный нестатический класс (внутренний класс)
- Вложенный статический класс.
Мы уже обсуждали внутренние классы в предыдущем уроке. Посетите Java Nested Class, если хотите узнать о внутренних классах.
В этом руководстве мы узнаем о вложенных статических классах.
Вложенный статический класс Java
Мы используем ключевое слово, static
чтобы сделать наш вложенный класс статическим.
Примечание. В Java статическими могут быть только вложенные классы.
Как и обычные классы, статические вложенные классы могут включать как статические, так и нестатические поля и методы. Например,
Class Animal ( static class Mammal ( // static and non-static members of Mammal ) // members of Animal )
Статические вложенные классы связаны с внешним классом.
Для доступа к статическому вложенному классу нам не нужны объекты внешнего класса.
Пример: статический вложенный класс
class Animal ( // inner class class Reptile ( public void displayInfo() ( System.out.println("I am a reptile."); ) ) // static class static class Mammal ( public void displayInfo() ( System.out.println("I am a mammal."); ) ) ) class Main ( public static void main(String() args) ( // object creation of the outer class Animal animal = new Animal(); // object creation of the non-static class Animal.Reptile reptile = animal.new Reptile(); reptile.displayInfo(); // object creation of the static nested class Animal.Mammal mammal = new Animal.Mammal(); mammal.displayInfo(); ) )
Вывод
Я рептилия. Я млекопитающее.
В приведенной выше программе у нас есть два вложенных класса Mammal и Reptile внутри класса Animal.
Для создания объекта нестатического класса Reptile мы использовали
Animal.Reptile reptile = animal.new Reptile()
Для создания объекта статического класса Mammal мы использовали
Animal.Mammal mammal = new Animal.Mammal()
Доступ к членам внешнего класса
В Java статические вложенные классы связаны с внешним классом. Вот почему статические вложенные классы могут обращаться только к членам класса (статическим полям и методам) внешнего класса.
Посмотрим, что произойдет, если мы попытаемся получить доступ к нестатическим полям и методам внешнего класса.
Пример: доступ к нестатическим членам
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: ошибка: не удается найти символ mammal.eat (); символ: метод eat () расположение: переменная млекопитающее типа Mammal 1 ошибка статус выхода компилятора 1
В приведенном выше примере мы создали нестатический метод eat()
внутри класса Animal.
Теперь, если мы попытаемся получить доступ eat()
с помощью объекта млекопитающего, компилятор выдаст ошибку.
Это потому, что млекопитающее является объектом статического класса, и мы не можем получить доступ к нестатическим методам из статических классов.
Статический класс верхнего уровня
Как упоминалось выше, статическими могут быть только вложенные классы. У нас не может быть статических классов верхнего уровня.
Посмотрим, что будет, если мы попытаемся сделать класс верхнего уровня статическим.
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: ошибка: модификатор static здесь не разрешен статический класс Animal (1 ошибка компилятора статус выхода 1
В приведенном выше примере мы попытались создать статический класс Animal. Поскольку Java не допускает использование статических классов верхнего уровня, мы получим ошибку.