- Вложенный класс
-
Внутренний, или вложенный класс (англ. inner class) — в объектно-ориентированном программировании класс, целиком определённый внутри другого класса.
Вложенные классы поддерживаются в языке программирования С# и других языках на платформе .NET, а также в языке программирования D и в C++.
Содержание
Обзор
Экземпляр обычного класса может существовать сам по себе. В отличие от него, экземпляр внутреннего класса не может существовать без привязки к объекту включающего его класса верхнего уровня.
Типы внутренних классов
В
Статические внутренние классы
Декларируются внутри основного класса и обозначаются ключевым словом static. Не имеют доступа к членам внешнего класса за исключением статических. Пример:
class OuterClass() { public OuterClass() {} private int outerField; static int staticOuterField; static class InnerClass { int getOuterField() { return OuterClass.this.outerField; // Эта линия кода образует ошибку при компиляции } int getStaticOuterField() { return OuterClass.staticOuterField; // Эта линия кода синтаксически корректна } } }
Внутренние классы
Декларируются внутри основного класса. В отличиии от статических внутренних классов, имеют доступ к членам внешнего класса. Пример:
class OuterClass() { public OuterClass() {} private int outerField; class InnerClass { int getOuterField() { return OuterClass.this.outerField; // Эта линия кода синтаксически корректна } } }
Локальные классы
Декларируются внутри методов основного класса. Могут быть использованы только внутри этих методов. Имеют доступ к членам внешнего класса. Имеют доступ как к локальным переменным, так и к параметрам метода при одном условии - переменные и параметры используемые локальным классом должны быть задекларированы final. Пример:
class OuterClass() { public OuterClass() {} private int outerField; private InnerClass inner; // Эта линия кода образует ошибку при компиляции void methodWithLocalClass (final int parameter) { InnerClass innerInsideMehod; // Эта линия кода синтаксически корректна int notFinal = 0; class InnerClass { int getOuterField() { return OuterClass.this.outerField; // Эта линия кода синтаксически корректна } notFinal++; // Эта линия кода образует ошибку при компиляции int getParameter() { return parameter; // Эта линия кода синтаксически корректна } } } }
Анонимные (безымянные) классы
Декларируются внутри методов основного класса. Могут быть использованы только внутри этих методов. В отличии от локальных классов, анонимные классы не имеют названия. Главное требование к анонимному классу - он должен наследовать существующий класс или реализовывать существующий интерфейс. Пример:
class OuterClass() { public OuterClass() {} void methodWithLocalClass (final int interval) { // При определении анонимного класса применен полиморфизм - переменная listener // содержит экземпляр анонимного класса, реализующего существующий // интерфейс ActionListener ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent event) { System.out.println("Эта строка выводится на экран каждые " + interval + " секунд"); } }; Timer t = new Timer(interval, listener); // Обьект анонимного класса использован внутри метода t.start(); } }
См. также
Литература
Cay S. Horstmann and Gary Cornell, Core Java, eighth edition (Volume I). Prentice Hall, 2003. ISBN 978-0132354769 (ссылка на страницу книги)
Ссылки
Wikimedia Foundation. 2010.