Вы можете реализовать несколько интерфейсов, но расширить только один класс.
Возможно:
class MyClass extends MyAbstract implements MyInterface1, MyInterface2, MyInterface3 { }
Невозможно:
class MyClass extends MyAbstract1, MyAbstract2 implements MyInterface { }
Кроме того, интерфейс не может иметь реализацию.
Возможно:
abstract class MyClass {
function doSomething() {
echo "I can give this method an implementation as this is an abstract class";
}
}
Невозможно:
interface MyClass {
function doSomething() {
echo "I can NOT give this method an implementation as this is an interface";
}
}
Из Глоссария Java :
Интерфейс позволяет кому-то начинать с нуля, чтобы реализовать ваш интерфейс или внедрить ваш интерфейс в каком-то другом коде, исходное или основное назначение которого сильно отличалось от вашего интерфейса. Для них ваш интерфейс только случайный, то, что нужно добавить в их код, чтобы иметь возможность использовать ваш пакет.
Абстрактный класс, напротив, обеспечивает большую структуру. Обычно он определяет некоторые реализации по умолчанию и предоставляет некоторые инструменты, полезные для полной реализации. Уловка в том, что код, использующий его, должен использовать ваш класс в качестве основы. Это может быть очень неудобно, если другие программисты, желающие использовать ваш пакет, уже самостоятельно разработали свою собственную иерархию классов. В Java класс может наследовать только от одного базового класса.
Вы также должны взглянуть на этот вопрос - Важным моментом Дэмиена о том, как интерфейс является контрактом.