Внутренний класс | это... Что такое Внутренний класс? (original) (raw)

Внутренний, или вложенный класс (англ. 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 (ссылка на страницу книги)

Ссылки