Почему методы на интерфейсах всегда общедоступны? Почему они не могут быть частными?Java-интерфейсы - почему бы и нет частных методов?
ответ
Поскольку все методы на интерфейсе являются общедоступными. В этом и заключается смысл интерфейса - технически он определяет контракт для вашего класса (который может иметь много перекрытий, контрактов/интерфейсов). Клиент вашего класса должен содержать ссылку на интерфейс и иметь доступ только к опубликованным (общедоступным) методам класса через интерфейс.
+1 - отличный ответ в ясности и лаконичности. –
я делаю вывод, что вы имеете в виду интерфейс объявленной таким образом:
public interface MyInter
{
public void myFunc();
}
И в результате ошибки, если опустить public
спецификатор в вашей реализации:
MyClass.java:3: myFunc() in MyClass cannot implement myFunc() in MyInter; attempting to assign weaker access privileges; was public
void myFunc(){}
^
Допустим, вы могли бы сделать myFunc
частный , Вы пишете следующий код в другом классе. Это должно жаловаться вы пытаетесь использовать частные функции вы не имеете доступ к:
MyClass foo = new MyClass();
foo.myFunc(); // Declared private, can't call it.
Но что об этом:
void doSomething(MyInter foo)
{
foo.myFunc(); // Declared public in interface, private in implementation.
}
Можем ли мы сделать это? В соответствии с интерфейсом это общедоступный метод, поэтому мы должны идти хорошо. Но он реализован как частный метод, поэтому класс ожидает, что он никогда не будет вызван извне, как это, ограничение, которое должно выполняться компилятором. Но компилятор даже не должен знать о MyClass
для этого для компиляции. Его еще нельзя было написать или во внешней библиотеке, которая может или не может быть интегрирована.
Разрешение реализаций создает внутреннюю несогласованность в правилах допустимого доступа, а разрешение этой несогласованности заключается в том, чтобы полностью исключить ситуацию. Все, что может вызвать метод в интерфейсе, должно иметь возможность вызвать его в любой реализации.
Тот же аргумент справедлив и для переопределения методов подкласса. Вы не можете «спрятать» их, переопределив более ограничительные квалификаторы.
Я хотел бы добавить к этому, что @Kevin добавила 'public' в объявление метода на интерфейсе исключительно для иллюстративных целей. Поскольку это модификатор по умолчанию и только доступность, который вы можете использовать, он является избыточным и обычно не включен. –
Почему это так?
Поскольку JLS говорит так:
В главе о декларациях интерфейса, JLS 9.4 говорит: «Каждое объявление метода в теле интерфейса неявно public
.»
В главе о объявлении класса, JLS 8.4.8.3 говорит: «Модификатор доступа (§6.6) из преобладающего или метод прячась должен обеспечить, по меньшей мере, такой же доступ, как переопределенном или скрытый метод, ...»
Ответ инженера Доллери объясняет, почему язык разработан таким образом.
- 1. Предоставление частных частных методов тестирования?
- 2. Назначение методов прототипа * внутри * функция конструктора - почему бы и нет?
- 3. затмение: нет предупреждения для неиспользуемых частных методов
- 4. Invalidate() почему бы и нет?
- 5. @Transactional распространение частных методов
- 6. Реализация частных методов
- 7. Junit Тестирование частных методов
- 8. JAVADOC для частных методов (BlueJ)
- 9. Переопределение частных методов?
- 10. Вызов частных методов и частных объектов извне класса в PHP
- 11. Вызов частных методов
- 12. AMD синглетоны и «наследование» «частных» методов
- 13. обмена частных методов между контроллерами
- 14. Блоки против частных методов?
- 15. декларирования JavaScript частных методов
- 16. Использование частных статических методов
- 17. Наследование частных и защищенных методов в Python
- 18. Почему бы вам не использовать статические методы для всех частных методов?
- 19. Переопределение частных методов в Java
- 20. Интеграционные тесты частных классов и методов
- 21. Swift - Тестирование отдельных частных переменных и методов
- 22. Вызов частных методов абстрактного класса
- 23. InnoDB или MyISAM - Почему бы и нет?
- 24. Виртуализированный SQL Server: почему бы и нет?
- 25. Действие не найдено, почему бы и нет?
- 26. Django formet недействителен - почему бы и нет?
- 27. window.location.href не работает, почему бы и нет?
- 28. Aspectj и улавливание частных или внутренних методов
- 29. Защита ввода частных/защищенных методов?
- 30. Тестирование частных методов в groovy
потому что частная функция/члены не наследуются, я думаю, что она также может быть защищена. –
Потому что вы не можете * уменьшить * доступ унаследованного участника. – mcalex
Возможный дубликат [Java - защищенный модификатор с интерфейсом] (http: // stackoverflow.com/questions/13599276/java-protected-modifier-with-interface) – dunni