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

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

8 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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


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

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

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

3/:

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

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

Класс объекта влияет на то, что делает код, так что вызов a.toString() во второй строке возвращает String, которая выглядит как Date, а не как "java.lang.Object@XXXXXXXX".

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

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

public void notify ();

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам