2013-05-06 1 views
1

Когда я попытался сделать образец на abstract class в Java, я случайно получил нечто вроде анонимного внутреннего класса в Eclipse.Что такое анонимный внутренний класс?

Я наклеил кусок кода ниже. Я не понимаю, как abstract class связан с анонимным классом.

package com.Demo; 

abstract class OuterClass { 
    abstract void OuterClassMethod(); 
} 

public abstract class InnerClass extends OuterClass { 
    public static void main(String[] args) { 
     InnerClass myInnerClass = new InnerClass() { 
      @Override 
      void OuterClassMethod() { 
       int OuterClassVariable = 10; 
       System.out.println("OuterClassVariable" + " " + OuterClassVariable); 
      } 
     }; 
    } 
} 
+0

Это не связано никакими специальными средствами. Это просто «нормальный абстрактный класс». Анонимные классы реализуются с помощью «нормального» Java-класса под ним и наследования (включая абстрактные типы), и интерфейсные контракты работают одинаково. – user2246674

ответ

1

анонимный класс является конкретной реализацией «в линии» класс, как правило (но не обязательно) абстрактный класса или интерфейс. Это технически подкласс расширенного/реализованного суперкласса.

Google для получения дополнительной информации.

0

В вашем примере ваш класс (InnerClass) расширяет класс (OuterClass) и реализует абстрактные методы, которые являются типичным поведением расширения абстрактного класса. Точно так же, если ваш класс реализует какие-либо интерфейсы, вы должны переопределить их абстрактные методы. Это способ реализовать анонимный внутренний класс.

0

В принципе, анонимный класс представляет собой реализацию, которая не имеет имени - отсюда и «анонимный» бит.

Этот конкретный бит, что делает ваш класс анонимный:

InnerClass myInnerClass = new InnerClass() { 
     @Override 
     void OuterClassMethod() { 
      int OuterClassVariable = 10; 
      System.out.println("OuterClassVariable" + " " + OuterClassVariable); 
     } 
    }; 

В нормальных конкретизации класса, вы бы просто использовать:

InnerClass myInnerClass = new InnerClass(); 

, но в этом случае вы задаете новую реализацию этот класс, переопределив в нем функцию (OuterClassMethod()). В других случаях InnerClass, OuterClassMethod() по-прежнему будет иметь свою первоначальную реализацию, поскольку вы только адаптировали этот конкретный экземпляр InnerClass и не сохранили эту новую реализацию в новом классе.

Если вы не хотите, анонимные классы, делать это вместо:

Где, укажите AnotherInnerClass продлить InnerClass и переопределить эту функцию:

class AnotherInnerClass extends InnerClass { 
    @Override 
    void OuterClassMethod() { 
     int OuterClassVariable = 10; 
     System.out.println("OuterClassVariable" + " " + OuterClassVariable); 
    } 
}; 

А затем создать его экземпляр, как, например:

AnotherInnerClass myInnerClass = new AnotherInnerClass();