Looking for java Answers? Try Ask4KnowledgeBase
Looking for java Keywords? Try Ask4Keywords

Java LanguageВложенные и внутренние классы


Вступление

Используя Java, разработчики могут определять класс в другом классе. Такой класс называется вложенным классом . Вложенные классы называются внутренними классами, если они были объявлены как нестатические, если нет, их просто называют статическими вложенными классами. Эта страница предназначена для документирования и предоставления подробных сведений о том, как использовать Java Nested и Inner Classes.

Синтаксис

  • public class OuterClass {public class InnerClass {}} // Внутренние классы также могут быть приватными
  • public class OuterClass {public static class StaticNestedClass {}} // Статические вложенные классы также могут быть приватными
  • public void method () {private class LocalClass {}} // Локальные классы всегда приватные
  • SomeClass anonymousClassInstance = new SomeClass () {}; // Анонимные внутренние классы нельзя назвать, следовательно, доступ является спорным. Если «SomeClass ()» является абстрактным, тело должно реализовать все абстрактные методы.
  • SomeInterface anonymousClassInstance = new SomeInterface () {}; // Тело должно реализовать все методы интерфейса.

замечания

Терминология и классификация

Спецификация языка Java (JLS) классифицирует различные типы Java-классов следующим образом:

Класс верхнего уровня - это класс, который не является вложенным классом.

Вложенным классом является любой класс, чье объявление происходит внутри тела другого класса или интерфейса.

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

Внутренний класс может быть не статическим классом-членом , локальным классом или анонимным классом . Класс-член интерфейса неявно статичен, поэтому он никогда не считается внутренним классом.

На практике программисты ссылаются на класс верхнего уровня, который содержит внутренний класс как «внешний класс». Кроме того, существует тенденция использовать «вложенный класс» для обозначения только (явно или неявно) статических вложенных классов.

Обратите внимание, что между анонимными внутренними классами и лямбдами существует тесная связь, но лямбды - это классы.

Семантические различия

  • Классы верхнего уровня - это «базовый случай». Они видны другим частям программы, подчиненным нормальным правилам видимости, основанным на семантике модификатора доступа. Если они не являются абстрактными, они могут быть созданы каким-либо кодом, где соответствующие конструкторы видны на основе модификаторов доступа.

  • Статические вложенные классы следуют тем же правилам доступа и создания экземпляров, что и классы верхнего уровня, за двумя исключениями:

    • Вложенный класс может быть объявлен как private , что делает его недоступным вне его класса верхнего уровня.
    • Вложенный класс имеет доступ к private членам охватывающего класса верхнего уровня и всего его тестируемого класса.

    Это делает статические вложенные классы полезными, когда вам нужно представлять несколько «типов сущностей» в пределах границы жесткой абстракции; например, когда вложенные классы используются для скрытия «деталей реализации».

  • Внутренние классы добавляют возможность доступа к нестационарным переменным, объявленным в охватываемых областях:

    • Нестатический класс-член может ссылаться на переменные экземпляра.
    • Локальный класс (объявленный внутри метода) также может ссылаться на локальные переменные метода, при условии, что они являются final . (Для Java 8 и более поздних версий они могут быть фактически окончательными .)
    • Анонимный внутренний класс может быть объявлен как в классе, так и в методе и может обращаться к переменным в соответствии с теми же правилами.

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

Вложенные и внутренние классы Связанные примеры