Абстрактный класс имеет как конкретную, так и абстрактную функцию. интерфейс имеет только абстрактные функции.
В обоих случаях возможно переопределение. Это
Какое преимущество в реальном времени одно над другим?
Абстрактный класс имеет как конкретную, так и абстрактную функцию. интерфейс имеет только абстрактные функции.
В обоих случаях возможно переопределение. Это
Какое преимущество в реальном времени одно над другим?
Интерфейсы предназначены, когда вы хотите сказать: "Мне все равно, как вы это делаете, но вот что вам нужно сделать".
Абстрактные классы предназначены, когда вы хотите сказать: "Я знаю, что вы должны делать, и я знаю, как вы должны это делать в некоторых или многих случаях".
Абстрактные классы имеют некоторые серьезные недостатки. Например:
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
.
И поскольку он не будет часто меняться, действительно ли стоит время разработчика, чтобы реализовать этот метод каждый... один... время... для каждого метода в этой "решаемой" категории? Не говоря уже о том, когда вам нужно внести изменения в это, вы будете иметь дублирование кода и пропущенные ошибки, если вам придется повторно внедрять его везде.
Интерфейсы полезны, потому что Java не имеет множественного наследования (но вы можете реализовать столько интерфейсов, сколько хотите).
Абстрактные классы полезны, когда вам нужно конкретное поведение из базового класса.
Факты -
Эти факты могут использоваться для наклона преимущества в пользу интерфейсов или абстрактных классов.
Если существует более одного поведения, которое класс должен совместно использовать с другими классами, интерфейсы выигрывают. Если определение метода должно делиться/переопределяться с другими классами, то абстрактные классы выигрывают.
Класс может реализовывать несколько интерфейсов, тогда как он может распространять только один класс (абстрактный или конкретный), потому что Java не поддерживает множественное наследование.
В ООП (в основном независимый от конкретного языка) абстрактные классы являются механизмом повторного использования иерархии классов для поведения и структуры, которая сама по себе не является полной. Интерфейсы - это механизм для спецификации требований к модулю (например, класс) независимо от конкретной реализации. Все другие отличия - это технические детали, важно другое использование.
Вы не переопределяете интерфейс. Вы его реализуете.
Написание интерфейса дает разработчикам возможность реализовать свой интерфейс, а также другие интерфейсы в дополнение к наследованию от базового класса.
Абстрактные классы могут быть частично или полностью реализованы. Обозначение абстрактного класса просто мешает вам создавать экземпляр объекта такого типа.
-Method без какой-либо реализации является абстрактным методом, всякий раз, когда класс содержит один или несколько абстрактных методов, тогда он должен быть объявлен как абстрактный класс
-Interface полностью абстрат, который не может иметь конструктор, экземпляр и статические блоки и содержит только два типа членов 1.публичный абстрактный метод 2.public-static-final переменная
* Оба экземпляра не могут быть созданы, но ссылка может быть создана.
* Какой из них лучше подходит, зависит от приложения -Интерфейсы полезны, потому что классы Java не будут поддерживать множественное наследование, но интерфейсы.
-Абстрактные классы полезны, когда вам нужно конкретное поведение из базового класса.
Основными преимуществами интерфейса над абстрактным классом являются преодоление появления алмаза проблемы и добиться множественного наследования. В java нет решения для проблемы с алмазами с использованием классов. По этой причине множественное наследование - это блок, использующий классы в java. Поэтому для достижения множественного наследования мы используем интерфейс.
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
может реализовать как можно больше интерфейсов.