Является ли интерфейс Java абстрактным классом?

Я работаю над домашней работой, и на предыдущем экзаменационном материале задается вопрос о названии всех абстрактных классов в данной диаграмме UML. Довольно прямо, я полагаю. Существует один абстрактный класс и три интерфейса. Как правило, эти интерфейсы квалифицируются как абстрактные классы?

Ответ 1

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

Абстрактный? Да, черт возьми. Класс? Нет.

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

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

Ответ 2

Весь интерфейс действительно абстрактный

На самом деле вы можете объявить метод абстрактным в интерфейсе... кроме того, что инструмент "checkstyle" скажет вам, что ключевое слово abstract является избыточным. И все методы общедоступны.

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

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

Интерфейс - это ссылочный тип, аналогичный классу, который может содержать только константы, сигнатуры методов и вложенные типы. Органов методов нет. Интерфейсы не могут быть инстанцированы - они могут быть реализованы только классами или расширены другими интерфейсами.

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

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


Чтобы лучше объяснить, почему интерфейс не является классом, рассмотрите следующее:

1/интерфейс тип, используемый значениями

2/a класс для объектов

3/:

Object a = new Date();
String s = a.toString();
  • тип переменной 'a' - это Object (на самом деле это нотация типа в исходном коде Java, означающая ссылку на объект),
  • но класс объекта, на который он указывает, - Date.

Тип (Object) влияет только на то, какой код действителен в соответствии с проверкой типа компилятора, но не на самом деле.

Класс объекта влияет на то, что делает код, так что вызов a.toString() во второй строке возвращает строку, которая выглядит как Date, а не та, которая выглядит как "[email protected]".

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

Ответ 3

В Java, тем не менее, это поворот к сказке - все интерфейсы в Java расширяют java.lang.Object! Попробуйте добавить метод:

public void notify();

в интерфейсе и посмотреть, что произойдет.

Интерфейс, расширяющий класс - делает ли это интерфейс классом? Или класс интерфейса? Uhh-huh.. Угадайте, что это был взлом, который должен был быть сделан, чтобы предотвратить интерфейс, переопределяющий определения в java.lang.Object, которые в любом случае должны были расширять возможности интерфейса.

Ответ 4

Да, интерфейс неявно Абстрактный. Посмотрите за кулисами относительно того, как он закодирован в файл .class.

Семантика - забавная вещь; в условиях экзамена "абстрактный класс" должен быть буквально скомпилирован из исходного файла .java, используя abstract class в объявлении класса.

Ответ 5

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

Ответ 6

Интерфейс содержит прототип методов (например, декларация), а не defination, но абстрактный класс может содержать дефиницию метода и по крайней мере один абстрактный метод (метод только с прототипом)

Ответ 7

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

Ответ 8

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

Тогда возникает вопрос. Можно ли назвать абстрактный класс интерфейсом, если у них есть только сигнатуры методов?

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