Java

Чем абстрактный класс отличается от интерфейса?

По ходу ничем, разве что абстрактный класс можно наследовать только один, а интерфейсов кучу. Экземпляр интерфейса, как и абстрактного класса создать нельзя.
Странно это всё и непонятно. Зачем это всё наворотили?
затем и создали интерфейс, чтобы проблем с наследованием не было: отказались от полей и прочих частей, под которые нужно выделять память, в пользу множественного наследования
Илья Осадчий
Илья Осадчий
51 164
Лучший ответ
нифига себе "ничем"....

"абстрактный класс можно наследовать только один, а интерфейсов кучу." -- этого мало?...

может вы не за тем в джаве копаетесь?
Абстрактный класс может содержать реализованные методы.
Zikrulloh Asadulloev
Zikrulloh Asadulloev
51 213
Арал Спорт Бөлімі Интерфейс тоже может содержать реализацию методов (если идёт речь о Java)
Если базовый класс содержит всю нужную логику, за исключением пары методов, реализация которых может быть разной, то логичнее его сделать абстрактным, а в наследниках дополнить логикой. Если логика всех методов отлична, то логичнее юзать интерфейс, и переопределять все эти методы у всех классов, реализующих интерфейс.
Qudret Memmedov
Qudret Memmedov
13 926
Николай Иванов Чисто для удобства?
Interface - заставляет тебя давать отдельные инструкции для каждого метода.

Abstract - не заставляет тебя давать отдельные функций для каждого метода.

---
Пример:
У тебя есть интерфейс fighter и он имеет метод attack.

Ты хочешь что бы все твой герои умели атаковать но логику того как они атакуют должна быть разная. И нельзя что бы они не умели атаковать.

Пример:

Маг implements fighter заставит тебя создать метод attack() и дать инструкции того как метод должен работать.

Если ты не напишешь инструкции для метода интерфейса компилятор обидеться и выдаст ошибку.

Такого не случилось бы с абстрактными классом.

Интерфейсы хороши тогда когда тебе нужны похожие методы но с разным поведением.

Другой пример:
Анимация смерти, звук и приз. Для каждого существа он должен быть разный а не одинаковый. И это должно быть в каждом существе.
NB
Nursultan Bakhyt
12 673
Константин Иванович наследование абстрактного класса тоже обязывает...
если не реализуешь абстрактные методы, то не бывать твоем у классу "полноценным"...
Пока абстрактный класс и интерфейс никак не используются, разница не видна. Но на практике их использование различно.

Абстрактный класс подразумевает, что в программе будут существовать объекты-наследники. То есть это некое обобщение реально существующих объектов, оформляется как общий предок. Важно, что всю иерархию абстрактного класса нужно писать с нуля.

Интерфейсы - это общий функционал, который можно добавлять к уже существующим классам. Делается наследник с таким-то интерфейсом, сам класс уже описан, он может даже быть в сторонней библиотеке. Так интерфейсы расширяют функционал, но это именно функционал, то есть набор действий над реальными объектами разных сортов.