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


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

3 3

3 ответа:

Официальную документацию по этому требованию можно найти в спецификации языка Java .

Цитата из 8.4.8.3. Требования в переопределении и скрытии :

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

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

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

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

Как в официальном учебнике Java от Oracle:

Интерфейсы-это своего рода контракт, который все реализующие классы должны придерживаться

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

Https://docs.oracle.com/javase/tutorial/java/IandI/index.html

Также, если вы попытаетесь пометить метод интерфейса аннотацией @Override, компилятор выдаст ошибку.

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

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

Так что это невозможно, и я не вижу в этом смысла.

Я не нашел часть документации, которая точно относится к вашему вопросу, но это можно понять из этой части:

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