2012-01-11 1 views
3

Я читаю SCJP от Kathy Sierra и Bert Bates, и он говорит на стр. 21, что «Публичный модификатор требуется, если вы хотите, чтобы интерфейс имел открытый, а не доступ по умолчанию». Это правда? Если да, то методы интерфейса (которые всегда являются общедоступными) доступны только в том случае, если интерфейс находится в одном пакете класса реализации ...? Так как это смысл модификатора доступа по умолчанию ... Я немного смущен этим.Верно ли, что если вы не укажете модификатор доступа для интерфейса, этот интерфейс будет иметь доступ по умолчанию.

+4

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

+0

Так, например, если сам интерфейс имеет доступ по умолчанию, то как его методы используются вне пакета, в котором он реализован. Интерфейс в этом случае даже не будет видимым для класса реализации ... так что не имеет для меня смысла, почему его методы будут общедоступными, если у него есть доступ по умолчанию :-( – user1142130

+0

Интерфейс будет виден любому другому классу в пакете. Любой класс в пакете, который хотел реализовать интерфейс, соответствующие методы как общедоступные. Аутсайдеры не смогут использовать интерфейс - доступ по умолчанию эффективно «для внутреннего использования» - но они могут вызывать методы, которые он определяет, поскольку они будут публичными в классе. Предполагая, конечно, что класс является публичным. – cHao

ответ

2

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

Да, это правда. Типы/поля/методы Java (в классе) имеют доступ к пакетному уровню, если модификатор доступа не указан. Члены, определенные в типе inteface, являются общедоступными по умолчанию.

Прочитать учебник - Controlling Access to Members of a Class.

1

Здесь interface сам package protected но методы всегда public по умолчанию

interface Foo 
{ 
    void bar(); // this is always public and nothing else 
} 

Здесь interface является public, а также методы

public interface Foo 
{ 
    void bar(); // this is always public and nothing else 
} 

вы можете объявить public void bar(); или void bar(); они означают То же самое, лично, я всегда ставил public, потому что ex plicit всегда лучше, чем неявный