Внутренний класс
Внутренний, или вложенный класс (англ. inner class) — в объектно-ориентированном программировании класс, целиком определённый внутри другого класса.
Вложенные классы поддерживаются в языке программирования Java, начиная с версии 1.1, С# и других языках на платформе .NET, а также в языке программирования D и в C++.
Обзор
[править | править код]Экземпляр обычного класса может существовать сам по себе. В отличие от него, экземпляр внутреннего класса не может существовать без привязки к включающему его классу верхнего уровня.
Типы внутренних классов
[править | править код]В Java существуют 4 типа внутренних классов:
Статические внутренние классы
[править | править код]Декларируются внутри основного класса и обозначаются ключевым словом 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;
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 (ссылка на страницу книги)