В Java, когда я должен использовать абстрактный метод в интерфейсе?
-
18-09-2019 - |
Вопрос
У меня есть следующий интерфейс на Java
public interface IFoo
{
public abstract void foo();
public void bar();
}
В чем разница между foo() и bar()?Когда я должен использовать abstract?
Оба, кажется, достигают того, чего я хочу, если только я не упускаю чего-то тонкого?
Обновить Дубликат Зачем объявлять метод интерфейса Java как абстрактный?
Решение
Функциональной разницы нет.В интерфейсе Java никогда не предоставляется никакая реализация, поэтому все объявления методов неявно абстрактны.
См. [1]: http://java.sun.com/docs/books/tutorial/java/IandI/abstract.html
Прямая цитата из приведенного выше:
Примечание:Все методы в интерфейсе (см. раздел «Интерфейсы») неявно абстрактны, поэтому модификатор Abstract не используется с методами интерфейса (может быть, но в этом нет необходимости).
Другие советы
Оба метода интерфейса public
и abstract
по умолчанию.Нет никакой разницы между foo()
и bar()
и вы можете спокойно удалить все public
и abstract
ключевые слова.
Ты ничего не упускаешь.Из самого Спецификация языка Java:
Каждое объявление метода в теле интерфейса неявно абстрактно, поэтому его тело всегда представлено точкой с запятой, а не блоком.
Каждое объявление метода в теле интерфейса неявно является общедоступным.
Другими словами, вы можете опустить public
так же , как и abstract
о методах интерфейса.
Это избыточно (между двумя объявлениями нет разницы) и явно не рекомендуется в раздел 9.4 спецификации языка Java:
Для совместимости со старыми версиями платформы Java допускается но не рекомендуется, исходя из соображений стиля, избыточно указывать модификатор abstract для методов, объявленных в интерфейсах.
И public
точно так же это не нужно и обескураживает:
Допускается, но из соображений стиля настоятельно не рекомендуется избыточно указывать модификатор public для методов интерфейса.
Я не знаю почему public
является сильно обескураженный , но abstract
просто обескуражен...
Оба выполняют одно и то же, поскольку все методы интерфейса абстрактны.
abstract
в этом сценарии не требуется (как и маркировка методов в интерфейсах как public
).
Ты бы вместо используйте это в методе абстрактного класса, чтобы обеспечить его переопределение подклассом.
Разницы между декларациями нет.Концептуально все методы интерфейса абстрактны.
Это не имеет значения.Все методы в интерфейсе Java всегда абстрактны.
Смотрите первую заметку по этой ссылке:http://java.sun.com/docs/books/tutorial/java/IandI/abstract.html
И foo(), и bar() абстрактны, поскольку они объявлены внутри интерфейса.Абстрактное слово, которое вы здесь использовали, не имеет никакого значения — вам лучше его удалить.
Интерфейсы в Java «каким-то образом» эквивалентны полностью абстрактным классам, поэтому добавление ключевого слова «abstract» в объявление метода в интерфейсе не имеет ничего общего с методом!