Абстрактный класс Java и интерфейс
В интервью мне задали следующий вопрос. Я попытался ответить на вопрос, но хочу получить точный ответ на вопрос.
Если я смогу имитировать абстрактный класс как интерфейс, почему Java предоставил интерфейс?
Это означает, что если в абстрактном классе я могу пометить все методы как абстрактные, а затем абстрактный класс будет работать как интерфейс, поэтому зачем мне нужен интерфейс.
Может кто-нибудь объяснить мне вкратце.
Ответы
Ответ 1
Это очень стандартный вопрос интервью. Ответ таков: поскольку вы можете реализовать несколько интерфейсов, но не можете расширять несколько абстрактных классов.
Пример из JRE: LinkedList
- это List
и a Deque
. Эти интерфейсы определяют поведение класса. Они не предоставляют каких-либо деталей реализации. Хотя абстрактные классы могут предоставить некоторые.
Связанные вопросы: this и this. Последнее не связано напрямую, но показывает, зачем нужны интерфейсы, даже в тех случаях, когда достаточно абстрактного класса.
Ответ 2
Интерфейсы определяют контракты и могут определять константы, но не обеспечивают реализацию на всех контрактных методах.
Абстрактные классы могут обеспечивать реализацию методов, а также переменных-членов - если вы хотите, вы можете создать абстрактный класс, который определяет все, кроме тонкой настройки, которую вы хотите в своих конкретных подклассах. Вы не можете сделать это с помощью интерфейсов, но вы можете реализовать несколько интерфейсов и расширить только один родительский класс.
Оба интерфейса и абстрактные классы могут использоваться, чтобы использовать конкретные классы полиморфно.
Ответ 3
Абстрактные классы хорошо подходят для установки методов по умолчанию и настройки иерархии. Проблема заключается в том, что подклассы могут распространять только один суперкласс один раз. Интерфейсы, с другой стороны, могут многократно расширяться, а подклассы могут реализовывать любое количество интерфейсов. Это обеспечивает большую гибкость и дает возможность для изменения. В идеале, их можно комбинировать, то есть абстрактный класс реализует интерфейс1... interface2, лучший из обоих миров.
Ответ 4
Причина, по которой интервьюеры задают этот вопрос, заключается в том, что ваш ответ отражает ваше глубокое понимание того, что такое язык программирования (и компилятор). В частности, Java определяет концепцию интерфейса поверх (чистых) абстрактных классов, чтобы (частично) поддерживать множественное наследование (между интерфейсами). Если бы этот механизм не был введен, у нас не было бы никакого способа добиться своего рода множественного наследования или большого беспорядка, созданного полноценным множественным наследованием на С++.
Ответ 5
Ответ
1) МНОЖЕСТВЕННОЕ НАСЛЕДОВАНИЕ в Java достигается через интерфейсы.
2) Если есть ситуация, когда требуется некоторое объяснение метода, но не полноценное, лучший способ - использовать абстрактный класс.
3) Интерфейсы просто предоставляют СОГЛАШЕНИЕ для типа возврата и типов аргументов.