2013-06-08 2 views
3

Почему методы на интерфейсах всегда общедоступны? Почему они не могут быть частными?Java-интерфейсы - почему бы и нет частных методов?

+1

потому что частная функция/члены не наследуются, я думаю, что она также может быть защищена. –

+3

Потому что вы не можете * уменьшить * доступ унаследованного участника. – mcalex

+1

Возможный дубликат [Java - защищенный модификатор с интерфейсом] (http: // stackoverflow.com/questions/13599276/java-protected-modifier-with-interface) – dunni

ответ

5

Поскольку все методы на интерфейсе являются общедоступными. В этом и заключается смысл интерфейса - технически он определяет контракт для вашего класса (который может иметь много перекрытий, контрактов/интерфейсов). Клиент вашего класса должен содержать ссылку на интерфейс и иметь доступ только к опубликованным (общедоступным) методам класса через интерфейс.

+0

+1 - отличный ответ в ясности и лаконичности. –

2

я делаю вывод, что вы имеете в виду интерфейс объявленной таким образом:

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 для этого для компиляции. Его еще нельзя было написать или во внешней библиотеке, которая может или не может быть интегрирована.

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

Тот же аргумент справедлив и для переопределения методов подкласса. Вы не можете «спрятать» их, переопределив более ограничительные квалификаторы.

+1

Я хотел бы добавить к этому, что @Kevin добавила 'public' в объявление метода на интерфейсе исключительно для иллюстративных целей. Поскольку это модификатор по умолчанию и только доступность, который вы можете использовать, он является избыточным и обычно не включен. –

1

Почему это так?

Поскольку JLS говорит так:

В главе о декларациях интерфейса, JLS 9.4 говорит: «Каждое объявление метода в теле интерфейса неявно public

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

Ответ инженера Доллери объясняет, почему язык разработан таким образом.

Смежные вопросы