Tuesday, June 25, 2013

Interface vs Abstract Class

Всем привет! Сегодня поговорим о больной теме всех Junior-разработчиков на языке Java. Когда стоит использовать interface, а когда abstract class. Весь нижеизложенный текст является переосмыслением всех грабель, которые встречались мне за всю мою карьеру. Итак, начнем.

Чем же все-таки отличаются эти две абстракции?

abstact class. Во-первых, нельзя создавать объект абстрактного класса. Т.е. вот так делать категорически нельзя
AbstaractClass inst = new AbstractClass();

Однако переменную создать можно через класс, который наследует абстрактный класс
AbstractClass inst = new AbstractExtendClass();

где AbstractExtendClass extend AbstractClass.
А вот во-вторых, внутри абстрактного класса можно работать с полями и методами, как внутри обычного класса. Есть еще такая "фишка" у абстрактного класса, когда мы пишем в обычном классе что-то вроде
public abstract class AbstractClass {
    public Object getObject() { return null; }
}

В абстрактном класс можно заюзать метод вот так public abstract Object getObject(); - это означает, что этот метод не определен и вызывать его нельзя, но он должен быть перекрыт во всех наследниках класса.

interface. Ну это еще более абстрактный класс. И только. Также, здесь не может быть конструкторов, а все методы автоматически являются public abstract, а поля public final. В интерфейсах не public методы создавать не имеет смысла.

Когда мы наследуем класс от интерфейса, то используем implements
public class MyClass implements MyInterface { ... }

Когда же наследуем интерфейс от интерфейса, то используем extends
interface MyInterface extends MyI2, MyI3... { ... }

В Java каждый класс, кроме Object, имеет ровно одного родителя. И основное отличие в том, что класс мы можем наследовать только один раз, а интерфейс сколько угодно. Вот и все. Что и в какой момент лучше применять - зависит от вас и выбранной архитектуры абстрагирования. Можно на эту тему даже подискутировать, кому интересно!

No comments: