Найти тему
JavAKnazzz

Интересный вопрос на заметку (если забыл)

В чем разница когда мы создаем объект типа абстрактного класса и инициализируем его конкретной реализацией и когда интерфейсу присваиваем его конкретную реализацию ???

Когда создается объект типа абстрактного класса и инициализируется конкретной реализацией, это означает, что объект будет иметь доступ к методам и свойствам, определенным в абстрактном классе, а также к любым переопределенным методам или свойствам в конкретной реализации. Объект будет обладать всеми возможностями, предоставленными абстрактным классом и его конкретной реализацией.

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

Таким образом, основное различие заключается в том, что при использовании абстрактного класса объект получает доступ ко всем методам и свойствам класса и его конкретной реализации, а при использовании интерфейса объект ограничивается только методами, определенными в интерфейсе.

Interface vs Abstract class

Сходство между абстрактным классом и интерфейсом очевидно. Но все-таки это разные сущности и используются по-разному. Оба они служат для реализации полиморфизма (см. урок по ООП), но это две совершенно разные концепции.

1. Наследование. Класс может реализовывать несколько интерфейсов сразу, но наследоваться только от одного класса (в том числе и абстрактного).

2. Реализация методов (до Java 8). В абстрактном классе можно сразу описать реализованный метод, что позволяет наследникам пользоваться или переопределять эти методы. Начиная с Java 8 появились default методы в интерфейсах с реализацией:

public interface Elf {

default void whoAmI() {
System.out.println("Elf!");
}
}

По сути это то же самое, что определить метод в абстрактном классе.

3. Поля. Абстрактный класс может иметь поля и методы, которые наследуются всеми его потомками. Интерфейс может иметь только public static final поля (константы).

4. Конструкторы. Абстрактный класс может иметь конструкторы, а интерфейс не может. Конструкторы в абстрактном классе могут использоваться для инициализации его полей и выполнения других инициализаций, которые могут быть общими для всех подклассов.

5. Использование. Абстрактные классы лучше использовать когда:

  • Нужно предоставить базовую реализацию для группы связанных классов.
  • Нужно предоставить общие поля и методы, которые наследуются подклассами.

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

Интерфейс:

  • Если нужно определить контракт или спецификацию, которую должны реализовать различные классы.
  • Если нужно достичь множественного наследования, чтобы классы могли реализовывать несколько интерфейсов.

То есть, если вам не нужно хранить состояние, то лучше выбрать интерфейс.