Рубрики

Анонимный внутренний класс в Java

Предварительные условия: — Вложенные классы в Java
Это внутренний класс без имени, для которого создается только один объект. Анонимный внутренний класс может быть полезен при создании экземпляра объекта с некоторыми «дополнительными функциями», такими как методы перегрузки класса или интерфейса, без необходимости фактически создавать подкласс класса.

Анонимные внутренние классы полезны при написании классов реализации для интерфейсов слушателей в графическом программировании.

Анонимный внутренний класс в основном создается двумя способами:

  • Класс (может быть абстрактным или конкретным)
  • Интерфейс

Синтаксис: синтаксис выражения анонимного класса аналогичен вызову конструктора, за исключением того, что в блоке кода содержится определение класса.

// Test can be interface,abstract/concrete class
Test t = new Test() 
{
   // data members and methods
   public void test_method() 
   {
      ........
      ........
    }   
};

Чтобы понять анонимный внутренний класс, давайте возьмем простую программу

// Java-программа для демонстрации потребности в классе Anonymous Inner

interface Age

{

    int x = 21;

    void getAge();

}

class AnonymousDemo

{

    public static void main(String[] args) 

    {

        // Myclass - класс реализации интерфейса Age

        MyClass obj=new MyClass();

  

        // вызов метода getage (), реализованного в Myclass

        obj.getAge();     

    }

}

  
// Myclass реализует методы Age Interface

class MyClass implements Age

{

    @Override

    public void getAge() 

    {

        // печать возраста

        System.out.print("Age is "+x);

    }

}

В программе интерфейс Age создается с помощью метода getAge () и x = 21. Myclass написан как класс реализации интерфейса Age. Как и в программе, нет необходимости писать отдельный класс Myclass. Вместо этого непосредственно скопируйте код Myclass в этот параметр, как показано здесь:

Age oj1 = new Age() {
            @Override
            public void getAge() {
                System.out.print("Age is "+x);
            }
        };

Здесь объект Age не создается, но объект Myclass создается и копируется во весь код класса, как показано выше. Это возможно только с анонимным внутренним классом. Такой класс называется «анонимный внутренний класс», поэтому здесь мы называем «Myclass» как анонимный внутренний класс.

Анонимная внутренняя классовая версия вышеуказанной Программы

// Java-программа для демонстрации анонимного внутреннего класса

interface Age

{

    int x = 21;

    void getAge();

}

class AnonymousDemo

{

    public static void main(String[] args) {

  

        // Myclass - скрытый внутренний класс интерфейса Age

        // чье имя не написано, но объект к нему

        // создано.

        Age oj1 = new Age() {

            @Override

            public void getAge() {

                 // возраст печати

                System.out.print("Age is "+x);

            }

        };

        oj1.getAge();

    }

}

Типы анонимного внутреннего класса: на основе декларации и поведения существует 3 типа анонимных внутренних классов:

    1. Анонимный внутренний класс, который расширяет класс: у нас может быть анонимный внутренний класс, который расширяет класс. Например, мы знаем, что мы можем создать поток, расширяя класс Thread. Предположим, нам нужен непосредственный поток, но мы не хотим создавать класс, который постоянно расширяет класс Thread. С помощью этого типа класса Anonymous Inner мы можем определить готовый поток следующим образом:

      // Java-программа для иллюстрации создания непосредственного потока
      // Использование анонимного внутреннего класса, расширяющего класс

      class MyThread 

      {

          public static void main(String[] args)

          {

              // Здесь мы используем Anonymous Inner class

              // который расширяет класс т.е. вот класс Thread

              Thread t = new Thread()

              {

                  public void run()

                  {

                      System.out.println("Child Thread");

                  }

              };

              t.start();

              System.out.println("Main Thread");

          }

      }

      Выход:

      Main Thread
      Child Thread
      OR
      Child Thread
      Main Thread
      
    2. Анонимный внутренний класс, который реализует интерфейс: у нас также может быть анонимный внутренний класс, который реализует интерфейс. Например, мы также знаем, что, реализуя интерфейс Runnable, мы можем создать поток. Здесь мы используем анонимный класс Inner, который реализует интерфейс.

      // Java-программа для иллюстрации определения потока
      // Использование анонимного внутреннего класса, реализующего интерфейс

      class MyThread 

      {

          public static void main(String[] args)

          {

              // Здесь мы используем Anonymous Inner class

              // который реализует интерфейс т.е. здесь Runnable интерфейс

              Runnable r = new Runnable()

              {

                  public void run()

                  {

                      System.out.println("Child Thread");

                  }

              };

              Thread t = new Thread(r);

              t.start();

              System.out.println("Main Thread");

          }

      }

      Выход:

      Main Thread
      Child Thread
      OR
      Child Thread
      Main Thread
      
    3. Anonymous Внутренний класс, который определяет внутренний аргумент метода / конструктора: Анонимные внутренние классы в аргументах метода / конструктора часто используются в приложениях с графическим пользовательским интерфейсом (GUI). Чтобы познакомиться с синтаксисом, давайте взглянем на следующую программу, которая создает поток, используя этот тип класса Anonymous Inner:

      // Java-программа для иллюстрации определения потока
      // Использование анонимного внутреннего класса, определяющего внутренний аргумент

      class MyThread 

      {

          public static void main(String[] args)

          {

              // Здесь мы используем Anonymous Inner class

              // которые определяют внутри аргумента, здесь аргумент конструктора

              Thread t = new Thread(new Runnable()

              {

                  public void run()

                  {

                      System.out.println("Child Thread");

                  }

              });

                

              t.start();

                

              System.out.println("Main Thread");

          }

      }

      Выход:

      Main Thread
      Child Thread
      OR
      Child Thread
      Main Thread
      

    Разница между классом Normal / Regular и классом Anonymous Inner:

    • Обычный класс может реализовывать любое количество интерфейсов, но анонимный внутренний класс может реализовывать только один интерфейс одновременно.
    • Обычный класс может расширять класс и реализовывать любое количество интерфейсов одновременно. Но анонимный внутренний класс может расширять класс или реализовывать интерфейс, но не оба одновременно.
    • Для обычного / нормального класса мы можем написать любое количество конструкторов, но мы не можем написать любой конструктор для анонимного внутреннего класса, потому что у анонимного класса нет имени, и при определении имени класса конструктора и имени конструктора должны совпадать.

    Доступ к локальным переменным входящей области, а также объявление и доступ к членам анонимного класса
    Как и локальные классы, анонимные классы могут захватывать переменные; они имеют одинаковый доступ к локальным переменным окружения:

    • Анонимный класс имеет доступ к членам своего включающего класса.
    • Анонимный класс не может получить доступ к локальным переменным в своей области видимости, которые не объявлены как окончательные или фактически окончательные.
    • Как и вложенный класс, объявление типа (такого как переменная) в анонимном классе затеняет любые другие объявления во вложенной области видимости, которые имеют то же имя.

    Анонимные классы также имеют те же ограничения, что и локальные классы в отношении своих членов:

    • Мы не можем объявлять статические инициализаторы или интерфейсы-члены в анонимном классе.
    • Анонимный класс может иметь статические члены при условии, что они являются постоянными переменными.

    Обратите внимание, что вы можете объявить следующее в анонимных классах:

    • поля
    • Дополнительные методы (даже если они не реализуют методы супертипа)
    • Инициализаторы экземпляра
    • Местные занятия

    Тем не менее, конструкторы не могут быть объявлены в анонимном классе.

    Эта статья предоставлена Нишант Шарма и Бишал Кумар Дубей . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

    Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

    Рекомендуемые посты:

    Анонимный внутренний класс в Java

    0.00 (0%) 0 votes