Абстрактный класс против интерфейса в Java
Чтобы понять различия между абстрактным классом и интерфейсом в Java, важно, прежде всего, понять каждый из них независимо. Абстрактный класс в Java используется при объявлении подклассов с набором общих характеристик. Обычное использование абстрактного класса - это суперкласс других классов, который, по сути, позволяет ему расширять абстрактный класс. Абстрактное ключевое слово используется в объявлении абстрактного класса. Как и у любого другого класса, абстрактный класс имеет поля, которые описывают методы и характеристики, которые может выполнять класс. Простым объявлением абстрактного класса класс не может быть инициирован
Интерфейс Java можно приравнять к протоколу. Он представляет собой заранее заданное и согласованное поведение, которое позволяет облегчить взаимодействие не связанных между собой объектов. В зависимости от пользователя интерфейс содержит ключ к выполнению различных действий. Интерфейс, следовательно, служит связующим звеном между производителем и потребителем. Таким образом, интерфейсы в Java - это группа методов, содержащих пустые тела, которые могут иметь постоянные объявления. Предоставление класса интерфейсу Java означает, что ожидаемое поведение класса является реализацией всех методов интерфейса..
Различия
Во-первых, абстрактный класс допускает поля, которые не являются статическими или конечными, в отличие от статических и конечных полей, используемых в интерфейсах. Интерфейсы не могут иметь никакого кода реализации, используемого в них, и может быть код реализации, используемый в абстрактном классе. Коды реализации, развернутые в абстрактном классе, могут иметь несколько или все реализованные методы. По умолчанию все методы интерфейса являются «абстрактными».
Видимость также возможна для методов или членов абстрактного класса, которые могут различаться, например public, protected, private или none. Видимость интерфейса, с другой стороны, может быть настроена только на один режим видимости, который является «общедоступным».
Абстрактный класс автоматически наследует класс объекта. По сути, это означает, что такие методы, как clone () и equals () включены. В интерфейсе наследование класса объекта невозможно. После этого абстрактный класс может иметь конструктор, но интерфейс не может его иметь.
Интерфейс в Java также имеет очень важную функцию при реализации множественного наследования, поскольку у класса может быть только один суперкласс. Хотя может присутствовать только один суперкласс, он может быть реализован в любом количестве интерфейсов. Невозможно иметь множественное наследование в абстрактном классе.
В производительности интерфейсы, как правило, медленнее в реализации, чем абстрактный класс, в основном из-за дополнительного направления поиска соответствующего метода в классе. Разница, однако, стала медленнее из-за современных виртуальных машин Java, которые постоянно обновляются.
Добавление метода в интерфейс требует отслеживания всех реализующих классов, которые реализуют определенный интерфейс. Кроме того, вы можете расширить интерфейс так, чтобы он имел дополнительные методы. Если вы имеете дело с абстрактным классом, все, что требуется, это добавить реализацию метода по умолчанию, и код продолжит функционировать. Поскольку существуют различия между абстрактными классами и интерфейсами, важно отметить, что они не являются конкурентами, но упомянутые здесь различия служат для дополнения друг друга.
Резюме
Поля абстрактного класса не являются статическими или финальными, в отличие от интерфейса, который имеет статические и финальные таблицы.
Код реализации не может использоваться в интерфейсах, в то время как он может использоваться в абстрактном классе.
Видимость интерфейса может быть только публичной, тогда как видимость абстрактного класса может изменяться.
Абстрактный класс будет автоматически наследовать класс объекта, но это невозможно в интерфейсе.
Абстрактный класс быстрее, чем интерфейс в реализации.