Страницы

Поиск по вопросам

четверг, 18 октября 2018 г.

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

Внутренние и вложенные классы — это не одно и тоже.
В чем разница, и когда принципиально нужно использовать один, а когда другой?


Ответ

Статические вложенные классы, не имеют доступа к нестатическим полям и методам обрамляющего класса. Поведение точно такое же, как у статических методов класса. Доступ к нестатическим полям и методам может осуществляться только через ссылку на экземпляр обрамляющего класса.
Но static nested классы имеют доступ к любым статическим методам внешнего класса, в том числе и к приватным.
public class Mememe{ private static int m_AccessableInt; // доступно в StaticNestedMememe private int m_NotAccessableInt; // не доступно в StaticNestedMememe [...]
public static class StaticNestedMememe{ [...] } }
Применение? Например, если вложенный класс имеет смысл только в контексте обрамляющего класса.
Так же многие используют такие классы для реализации паттерна Builder
Экземпляр такого класса нужно создавать, используя имя обрамляющего класса:
Mememe.StaticNestedMememe nestedObject = new Mememe.StaticNestedMememe();
Внутренние классы бывают трёх типов:
локальные классы (local classes); анонимные классы (anonymous classes); внутренние классы-члены (member inner classes).
Локальные классы определяются внутри блока кода.
public class Mememe{ public void calc(String requestPath) { class Сalculator{ int calc() { return 0; } } } }
Локальные классы имеют доступ к полям и методам обрамляющего класса. Локальные классы:
видны только в пределах блока, в котором объявлены; не могут быть объявлены как private, public, protected или static не могут иметь внутри себя статических объявлений; исключением являются константы (static final);
Анонимный класс (anonymous class) - это локальный класс без имени.
Типичный пример - реализация Runnable
new Thread(new Runnable() { public void run() { ... } }).start();
Основное ограничение при использовании анонимных классов - это невозможность описания конструктора, так как класс не имеет имени.
Внутренние классы-члены ассоциируются не с самим внешним классом, а с его экземпляром. При этом они имеют доступ ко всем его полям и методам. Например:
public class OuterClass { public void method() { ... }
public class InnerClass { public void method() { ... }
public void anotherMethod() { method(); } } }
InnerClass имеет доступ в членам класса OuterClass, как видно на примере метода anotherMethod, который вызывает метод method
Создать такой класс можно так:
OuterClass outer = new OuterClass(); OuterClass.InnerClass innerClass = OuterClass.new InnerClass ();

Комментариев нет:

Отправить комментарий