English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом руководстве вы узнаете о статических вложенных классах с помощью примеров. Вы также узнаете о различиях между статическими классами и внутренними классами.
Как было сказано в предыдущем руководстве, мы можем иметь класс в другом классе Java. Такой класс называется вложенным классом. В Java есть два типа вложенных классов:
Вложенные нестатические классы (внутренние классы)
Вложенные статические классы.
В предыдущем руководстве мы уже обсуждали внутренние классы. Если вы хотите узнать о внутренние классы, пожалуйста, посетитеВложенные классы Java.
В этом руководстве мы будем изучать статические вложенные классы.
Мы используем ключевое слово static для статизации нашего вложенного класса.
Внимание:В Java разрешается только статические вложенные классы.
Как и обычные классы, статические вложенные классы могут содержать как статические, так и нестатические поля и методы. Например:
Class Animal { static class Mammal { // Статические и статические члены класса Mammal } // Члены класса Animal }
Статические вложенные классы связаны с внешним классом.
Чтобы получить доступ к статическим вложенным классам, нам не нужно объекта внешнего класса.
class Animal { // Внутренний класс class Reptile { public void displayInfo() { System.out.println("Я рептилия."); } } // Статический класс static class Mammal { public void displayInfo() { System.out.println("Я млекопитающее."); } } } 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 и Reptile в классе Animal.
Чтобы создать объект класса Reptile, который является нестатическим, мы используем
Animal.Reptile reptile = animal.new Reptile();
Чтобы создать объект класса Mammal, который является статическим, мы используем
Animal.Mammal mammal = new Animal.Mammal();
В Java статические вложенные классы связаны с внешним классом. Поэтому статические вложенные классы могут доступить только классовые члены внешнего класса (статические поля и методы).
Давайте посмотрим, что happens, если пытаться получить доступ к нестатическим членам внешнего класса.
class Animal { static class Mammal { public void displayInfo() { System.out.println("Я млекопитающее."); } } class Reptile { public void displayInfo() { System.out.println("Я рептилия."); } } public void eat() { System.out.println("Я ем еду."); } } 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: symbol не найден mammal.eat(); ^ symbol: метод eat() location: переменная mammal типа Mammal 1 error compiler exit status 1
В предыдущем примере мы создали нестатический метод eat() в классе Animal.
Теперь, если мы попробуем использовать объект mammal для доступа к методу eat(), компилятор покажет ошибку.
Это потому что mammal является объектом статического класса, поэтому мы не можем получить доступ к нестатическим методам из статического класса.
Как указано выше, только вложенные классы могут быть статическими. Мы не можем иметь статический верхний класс.
Давайте посмотрим, что произойдет, если мы попробуем сделать верхний класс статическим.
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
В примере выше мы пытаемся создать статический класс Animal. Поскольку Java не позволяет использовать статические верхние классы, возникает ошибка.