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

StackOverflow https://stackoverflow.com/questions/1492359

Вопрос

У меня есть следующий интерфейс на 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» в объявление метода в интерфейсе не имеет ничего общего с методом!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top