Абстрактный класс Java и интерфейс

В интервью мне задали следующий вопрос. Я попытался ответить на вопрос, но хочу получить точный ответ на вопрос.

Если я смогу имитировать абстрактный класс как интерфейс, почему Java предоставил интерфейс?

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

Может кто-нибудь объяснить мне вкратце.

Ответ 1

Это очень стандартный вопрос интервью. Ответ таков: поскольку вы можете реализовать несколько интерфейсов, но не можете расширять несколько абстрактных классов.

Пример из JRE: LinkedList - это List и a Deque. Эти интерфейсы определяют поведение класса. Они не предоставляют каких-либо деталей реализации. Хотя абстрактные классы могут предоставить некоторые.

Связанные вопросы: this и this. Последнее не связано напрямую, но показывает, зачем нужны интерфейсы, даже в тех случаях, когда достаточно абстрактного класса.

Ответ 2

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

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

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

Ответ 3

Абстрактные классы хорошо подходят для установки методов по умолчанию и настройки иерархии. Проблема заключается в том, что подклассы могут распространять только один суперкласс один раз. Интерфейсы, с другой стороны, могут многократно расширяться, а подклассы могут реализовывать любое количество интерфейсов. Это обеспечивает большую гибкость и дает возможность для изменения. В идеале, их можно комбинировать, то есть абстрактный класс реализует интерфейс1... interface2, лучший из обоих миров.

Ответ 4

Причина, по которой интервьюеры задают этот вопрос, заключается в том, что ваш ответ отражает ваше глубокое понимание того, что такое язык программирования (и компилятор). В частности, Java определяет концепцию интерфейса поверх (чистых) абстрактных классов, чтобы (частично) поддерживать множественное наследование (между интерфейсами). Если бы этот механизм не был введен, у нас не было бы никакого способа добиться своего рода множественного наследования или большого беспорядка, созданного полноценным множественным наследованием на С++.

Ответ 5

Ответ

1) МНОЖЕСТВЕННОЕ НАСЛЕДОВАНИЕ в Java достигается через интерфейсы.

2) Если есть ситуация, когда требуется некоторое объяснение метода, но не полноценное, лучший способ - использовать абстрактный класс.

3) Интерфейсы просто предоставляют СОГЛАШЕНИЕ для типа возврата и типов аргументов.