В чем преимущество интерфейса над абстрактными классами?
Абстрактный класс имеет как конкретную, так и абстрактную функцию.
интерфейс имеет только абстрактные функции.
В обоих случаях возможно переопределение. Это
Какое преимущество в реальном времени одно над другим?
Ответы
Ответ 1
Интерфейсы предназначены, когда вы хотите сказать: "Мне все равно, как вы это делаете, но вот что вам нужно сделать".
Абстрактные классы предназначены, когда вы хотите сказать: "Я знаю, что вы должны делать, и я знаю, как вы должны это делать в некоторых или многих случаях".
Абстрактные классы имеют некоторые серьезные недостатки. Например:
class House {
}
class Boat {
}
class HouseBoat extends /* Uh oh!! */ {
// don't get me started on Farmer Insurance "Autoboathome" which is also a helicopter
}
Вы можете пройти через интерфейс:
interface Liveable {
}
interface Floatable {
}
class HouseBoat implements Liveable, Floatable {
}
Теперь абстрактные классы также очень полезны. Например, рассмотрим класс AbstractCollection. Он определяет поведение по умолчанию для очень распространенных методов для всех коллекций, таких как isEmpty()
и contains(Object)
. Вы можете переопределить эти поведения, если хотите, но... является ли поведение для определения того, действительно ли коллекция пуста, вероятно, изменится? Обычно это будет size == 0
.
И поскольку он не будет часто меняться, действительно ли стоит время разработчика, чтобы реализовать этот метод каждый... один... время... для каждого метода в этой "решаемой" категории? Не говоря уже о том, когда вам нужно внести изменения в это, вы будете иметь дублирование кода и пропущенные ошибки, если вам придется повторно внедрять его везде.
Ответ 2
Интерфейсы полезны, потому что Java не имеет множественного наследования (но вы можете реализовать столько интерфейсов, сколько хотите).
Абстрактные классы полезны, когда вам нужно конкретное поведение из базового класса.
Ответ 3
Факты -
- Java не поддерживает множественное наследование
- Можно реализовать несколько интерфейсов.
- Несколько методов в абстрактном классе могут быть реализованы
Эти факты могут использоваться для наклона преимущества в пользу интерфейсов или абстрактных классов.
Если существует более одного поведения, которое класс должен совместно использовать с другими классами, интерфейсы выигрывают.
Если определение метода должно делиться/переопределяться с другими классами, то абстрактные классы выигрывают.
Ответ 4
Класс может реализовывать несколько интерфейсов, тогда как он может распространять только один класс (абстрактный или конкретный), потому что Java не поддерживает множественное наследование.
Ответ 5
В ООП (в основном независимый от конкретного языка) абстрактные классы являются механизмом повторного использования иерархии классов для поведения и структуры, которая сама по себе не является полной.
Интерфейсы - это механизм для спецификации требований к модулю (например, класс) независимо от конкретной реализации.
Все другие отличия - это технические детали, важно другое использование.
Ответ 6
Вы не переопределяете интерфейс. Вы его реализуете.
Написание интерфейса дает разработчикам возможность реализовать свой интерфейс, а также другие интерфейсы в дополнение к наследованию от базового класса.
Абстрактные классы могут быть частично или полностью реализованы. Обозначение абстрактного класса просто мешает вам создавать экземпляр объекта такого типа.
Ответ 7
-Method без какой-либо реализации является абстрактным методом, всякий раз, когда класс содержит один или несколько абстрактных методов, тогда он должен быть объявлен как абстрактный класс
-Interface полностью абстрат, который не может иметь конструктор, экземпляр и статические блоки и содержит только два типа членов
1.публичный абстрактный метод
2.public-static-final переменная
* Оба экземпляра не могут быть созданы, но ссылка может быть создана.
* Какой из них лучше подходит, зависит от приложения
-Интерфейсы полезны, потому что классы Java не будут поддерживать множественное наследование, но интерфейсы.
-Абстрактные классы полезны, когда вам нужно конкретное поведение из базового класса.
Ответ 8
Основными преимуществами интерфейса над абстрактным классом являются преодоление появления алмаза
проблемы и добиться множественного наследования.
В java нет решения для проблемы с алмазами с использованием классов. По этой причине множественное наследование - это блок, использующий классы в java.
Поэтому для достижения множественного наследования мы используем интерфейс.
Ответ 9
class Animal
{ void move(){} }
class Bird
{ void move(){fly} }
class Fish
{ void move(){swim} }
Теперь, если класс Animal является абстрактным классом, например
Animal a;
a= new Bird(); or a = new Fish()
Здесь абстракция работает хорошо, но если есть 100 объектов, таких как Animal a[100]
;
Вы не можете писать new Bird().move
или new Fish().move
100 раз
Используйте интерфейс и напишите a[i].move
. Он будет дифференцироваться как птица или рыба и что move()
будет вызываться
Во-вторых, он поддерживает множественное наследование, поскольку класс A
может реализовать как можно больше интерфейсов.