Интерфейс Java 9: ​​почему модификатор по умолчанию преобразован в публичный модификатор - PullRequest
0 голосов
/ 06 февраля 2019

Мой вопрос о interface.Я создаю интерфейс и определяю четыре метода: первый метод - это метод private;второй метод default;третий метод static;и четвертый - метод abstract.
После компиляции этого интерфейса и проверки его профиля: метод default преобразуется в метод public, а оба метода static и abstract имеют префикс public модификатор.Почему это так?

Код:

 interface InterfaceProfile {

    private void privateM() {   //this method is hidden
        System.out.println("private Method");
    }

    default void defaultM() {
        System.out.println("Default Method");
    }

    static void staticM() {
        System.out.println("Static Method");
    }

    void doStuff(); //by default adds the public modifier
}

ИнтерфейсПрофильный класс

    D:\Linux\IDE\Workspace\OCA-Wrokspace\Ocaexam\src>javap mods\com\doubt\session\InterfaceProfile.class
Compiled from "InterfaceProfile.java"
interface com.doubt.session.InterfaceProfile {
  public void defaultM();
  public static void staticM();
  public abstract void doStuff();
}

Ответы [ 4 ]

0 голосов
/ 06 февраля 2019

https://docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.html

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

По сути,класс, который реализует интерфейс, предоставляет все методы интерфейса (кроме private) любому другому коду, который имеет видимость класса.

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

public interface Profile {
    generalMethod() ...
}
public interface SecretProfile extends Profile {
    secretMethod() ...
}

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

0 голосов
/ 06 февраля 2019

Модификатор по умолчанию является общедоступным, потому что так определяется объявление интерфейса: https://docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.html

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

Добавление приватных методов в интерфейс не служит этой основной цели и кажется скорее подсказкой реализации.Закрытые и абстрактные методы были поздним дополнением к интерфейсам.

Связанные: Должны ли методы в интерфейсе Java объявляться с модификатором открытого доступа или без него?

0 голосов
/ 06 февраля 2019

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

Цитирование Спецификации языка Java :

Метод в теле интерфейса может быть объявлен открытым или закрытым (§6.6).Если модификатор доступа не указан, метод неявно общедоступен.Разрешается, но не рекомендуется в качестве стиля, избыточно указывать открытый модификатор для объявления метода в интерфейсе.

(возможность иметь частные методы в интерфейсах была введена в Java 9,когда люди обнаружили, что стандартные методы Java 8 часто создавали необходимость иметь частные методы, которые могли бы использовать такие стандартные методы, не делая эти вспомогательные методы общедоступными)

0 голосов
/ 06 февраля 2019

Тот факт, что это default метод не имеет значения. Неявная область действия: public.

Вот что в учебнике говорит:

Все абстрактные, стандартные и статические методы винтерфейс неявно общедоступен, поэтому вы можете опустить модификатор public.

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