абстрактный обязательно или нет? - PullRequest
1 голос
/ 29 марта 2012

Как вы знаете, в интерфейсе Java все методы должны быть определены как абстрактные.Но когда я определяю метод как не набирающий abstract, компилятор говорит, что все в порядке.Я знаю, что абстрактный метод не должен иметь тела.Обязательно ли метод где-нибудь в интерфейсе имеет имя abstract или нет?: Что я имею в виду, в чем разница между:

public interface blabla {

    public void aMethod();


    //or

    public abstract void aMethod();

}

Ответы [ 8 ]

7 голосов
/ 29 марта 2012

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

Все методы интерфейса неявно abstractpublic слишком кстати).

Из JLS:

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

Каждое объявление метода в теле интерфейса неявно общедоступно .

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

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


Связанный вопрос (+ ответ с исторической ссылкой на утверждение о том, что когда-то требовалось abstract для методов интерфейса):

2 голосов
/ 29 марта 2012

См. Пример ниже:

interface xyz
{
void methodA();
}

Сохраните это в xyz.java

Теперь скомпилируйте это, используя javac tool

и затем используйтекоманда, указанная ниже

javap xyz

, будет иметь значение

Compiled from "xyz.java"
interface xyz {
    public abstract void methodA();
}

Это означает, что при компиляции интерфейса компилятор делает свою подпись для public и по умолчанию по умолчанию.

Так что нет необходимости использовать ключевое слово abstract для любого метода интерфейса.

0 голосов
/ 29 марта 2012

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

0 голосов
/ 29 марта 2012

Абстрактный метод не обеспечивает реализацию.Класс с абстрактным методом обязательно является абстрактным, что означает, что вы не можете создавать экземпляры этого класса.Чтобы создать экземпляр этого класса, необходимо создать подкласс и предоставить неабстрактные перезаписи для абстрактных методов.

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

0 голосов
/ 29 марта 2012

Все методы в интерфейсе являются абстрактными по определению.

Вы не можете создать объект из интерфейса (например, используя Interface i = new Interface();), поэтому нет разницы между пометкой метода как абстрактного или нет.

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

0 голосов
/ 29 марта 2012

вам не нужно указывать abstract (по умолчанию), потому что в интерфейсе это не имеет смысла, так как весь метод интерфейса должен быть реализован

0 голосов
/ 29 марта 2012

Методы интерфейса не должны быть явно определены как абстрактные, поскольку они неявно abstract и public, как определено в Спецификации языка Java §9.4 , Избыточная декларация вполне законна, хотя.

0 голосов
/ 29 марта 2012

Я не знаю, что они должны быть определены как абстрактные.Наверное, потому что они этого не делают.См. Руководство Oracle .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...