Существует две основные оси «наследования» в объектно-ориентированных языках, таких как Java.Наследование «реализация» - это то, где подкласс наследует фактическую реализацию кода от родителя.Наследование «интерфейса» - это то место, где «подкласс» придерживается открытого интерфейса «родителя».
Увы, Java на самом деле немного смешивает два понятия ... Интерфейсы Java хороши и чисты -- когда вы «внедряете» интерфейс, вы указываете, что ваш класс придерживается «контракта» интерфейса, который вы указали.Наследование классов Java не так чисто - когда вы подкласс в Java, вы получаете и наследование кода, но вы также оговариваете, что ваш подкласс придерживается «контракта» интерфейса родительского класса.
Абстрактные классы в Java похожи на обычные классы Java, но с добавленным ограничением, что вы не можете создавать их экземпляры напрямую.С точки зрения этого добавленного ограничения, это в основном классы, которые на самом деле не реализуют весь код, указанный в их «контракте».
Итак, обычно считается хорошей практикой ОО указывать «контракт», который выхочу придерживаться через интерфейсы Java.Затем используйте обычное наследование Java-классов в основном для повторного использования кода.Используйте абстрактные классы Java, когда вы хотите предоставить некоторый стандартный базовый код, но хотите / должны заставить пользователя вашего класса завершить реализацию (т. Е. Вы создаете каркасную реализацию, а подклассы должны ее конкретизировать).