Чем отличаются анонимные классы созданные на основе интерфейса и на основе класса в Java?

Рейтинг: 1Ответов: 3Опубликовано: 10.04.2015

чем отличаются анонимные классы созданные на основе интерфейса и на основе класса в Java?

Ответы

▲ 5Принят

Анонимный класс согласно JLS 15.9.5 представляют собой выражение, в котором объявление нового класса и его инициализация совмещены:

  1. При объявлении класса будет создан новый класс, производный от указанного класса при использовании в качестве базы другого класса, или реализующий интерфейс при использовании в качестве базы интерфейса.
  2. При инициализации будет создан новый объект и на него будет возвращения ссылка: анонимный класс является конкретным.

Таким образом, единственное отличие в анонимных классах, созданных на основе интерфейса и класса, заключается в количестве абстракных методов, которые необходимо реализовать.

Именно для этого для интерфейсов с большим количеством методов могут создаваться адаптеры с пустыми реализациями методов. Например, в Swing есть интерфейс MouseListener и класс MouseAdapter.

Инициализации анонимного класса на основе интерфейса потребует реализации каждого метода, в то время как при инициализации анонимного класса на основе абстрактного/конкретного класса позволит изменить поведение за счет перегрузки методов и потребует реализации абстракных методов.

▲ 2

Практически ничем.

То есть разница между

new BaseClass() { public void f() { /* ... */ } }

и

new BaseInterface() { public void g() { /* ... */ } }

такая же, как и между

class DerivedClass extends BaseClass
{
    public void f() { /* ... */ }
}

и

class DerivedClass implements BaseInterface
{
    public void g() { /* ... */ }
}

(отвлекаясь от того, что в первом случае у вас объекты, а во втором — классы).

▲ 2

Не соглашусь с @VladD разница есть.

Например есть класс:

public abstract class RequestResult {

    public Exception getException() {
        return null;
    }

    public abstract String getResult();

}  

Мы когда объявляем анонимный класс обязаны переопределить только абстрактный метод getResult(), getException() можем переопределить, можем нет.

public interface RequestResult {

    public Exception getException();

    public abstract String getResult();

}

В то же время для интерфейсы мы обязаны реализовать все методы, и более того если в базовом классе какие-то методы реализованы мы можем их использовать в анонимном.