Чем отличаются анонимные классы созданные на основе интерфейса и на основе класса в Java?
чем отличаются анонимные классы созданные на основе интерфейса и на основе класса в Java?
чем отличаются анонимные классы созданные на основе интерфейса и на основе класса в Java?
Анонимный класс согласно JLS 15.9.5 представляют собой выражение, в котором объявление нового класса и его инициализация совмещены:
Таким образом, единственное отличие в анонимных классах, созданных на основе интерфейса и класса, заключается в количестве абстракных методов, которые необходимо реализовать.
Именно для этого для интерфейсов с большим количеством методов могут создаваться адаптеры с пустыми реализациями методов. Например, в Swing есть интерфейс MouseListener
и класс MouseAdapter
.
Инициализации анонимного класса на основе интерфейса потребует реализации каждого метода, в то время как при инициализации анонимного класса на основе абстрактного/конкретного класса позволит изменить поведение за счет перегрузки методов и потребует реализации абстракных методов.
Практически ничем.
То есть разница между
new BaseClass() { public void f() { /* ... */ } }
и
new BaseInterface() { public void g() { /* ... */ } }
такая же, как и между
class DerivedClass extends BaseClass
{
public void f() { /* ... */ }
}
и
class DerivedClass implements BaseInterface
{
public void g() { /* ... */ }
}
(отвлекаясь от того, что в первом случае у вас объекты, а во втором — классы).
Не соглашусь с @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();
}
В то же время для интерфейсы мы обязаны реализовать все методы, и более того если в базовом классе какие-то методы реализованы мы можем их использовать в анонимном.