Внутренний класс

Материал из Seo Wiki - Поисковая Оптимизация и Программирование
Перейти к навигацииПерейти к поиску

Внутренний, или вложенный класс (англ. inner class) — в объектно-ориентированном программировании класс, целиком определённый внутри другого класса.

Вложенные классы поддерживаются в языке программирования Java, начиная с версии 1.1, С# и других языках на платформе .NET, а также в языке программирования D и в C++.

Обзор

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

Типы внутренних классов

В Java существуют 4 типа внутренних классов:

Статические внутренние классы

Декларируются внутри основного класса и обозначаются ключевым словом static. Не имеют доступа к членам внешнего класса за исключением статических. Может содержать статические поля, методы и классы, в отличие от других типов внутренних классов. Пример: <source lang="java"> class OuterClass() {

  public OuterClass() {}
  private int outerField;
  static int staticOuterField;
  static class InnerClass
  {
     int getOuterField()
     {
        return OuterClass.this.outerField; // Эта линия кода образует ошибку при компиляции
     }
     int getStaticOuterField()
     {
        return OuterClass.staticOuterField; // Эта линия кода синтаксически корректна
     }
  }

} </source>

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

Декларируются внутри основного класса. В отличие от статических внутренних классов, имеют доступ к членам внешнего класса. Не могут содержать определение (но могут наследовать) статических полей, методов и классов (кроме констант). Пример: <source lang="java"> class OuterClass() {

  public: 
  OuterClass(){}
  private: 
  int outerField;
  class InnerClass
  {
     int getOuterField()
     {
        return OuterClass.this.outerField; // Эта линия кода синтаксически корректна
     }
  };

}; </source>

Локальные классы

Декларируются внутри методов основного класса. Могут быть использованы только внутри этих методов. Имеют доступ к членам внешнего класса. Имеют доступ как к локальным переменным, так и к параметрам метода при одном условии - переменные и параметры используемые локальным классом должны быть задекларированы final. Не могут содержать определение (но могут наследовать) статических полей, методов и классов (кроме констант). Пример: <source lang="java"> 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; // Эта линия кода синтаксически корректна
        }
     };
  }

}; </source>

Анонимные (безымянные) классы

Декларируются внутри методов основного класса. Могут быть использованы только внутри этих методов. В отличие от локальных классов, анонимные классы не имеют названия. Главное требование к анонимному классу - он должен наследовать существующий класс или реализовывать существующий интерфейс. Не могут содержать определение (но могут наследовать) статических полей, методов и классов (кроме констант). Пример: <source lang="java"> 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();
  }

} </source>

См. также

Литература

Cay S. Horstmann and Gary Cornell, Core Java, eighth edition (Volume I). Prentice Hall, 2003. ISBN 978-0132354769 (ссылка на страницу книги)

Ссылки

en:inner class

Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....