Разве «закрытый пакетный» доступ к элементу не является синонимом доступа по умолчанию (без модификатора)? - PullRequest
90 голосов
/ 24 марта 2011

Я немного растерялся из-за термина «частный пакет», который используется в некоторых документах наряду с использованием «доступа по умолчанию».Разве пакет закрытый и доступ по умолчанию не являются синонимами защищенного?

Ответы [ 7 ]

131 голосов
/ 24 марта 2011

Да, это почти то же самое. Защищенный модификатор указывает, что доступ к члену возможен только в его собственном пакете (как в случае с package-private) и, в дополнение к , подклассом его класса в другом пакете.

32 голосов
/ 24 марта 2011

Модификатор доступа «по умолчанию» (тот, в котором ни один из них не указан явно) является «частным пакетом», что означает, что только вещи в одном пакете могут получить к ним доступ.Однако наличие в одном и том же пакете ничего не подразумевает в отношении наследования между классами - это просто соглашение об именах.

«Защищенный» означает, что не только классы в одном и том же пакете, но и подклассы (независимо от того, какой пакетэти подклассы в) смогут получить к нему доступ.

14 голосов
/ 24 марта 2011

Доступ по умолчанию для классов является закрытым для пакета, однако доступ по умолчанию для интерфейса членов является открытым.* Правила доступа по умолчанию для интерфейсов не такие, как для классов.

3 голосов
/ 24 марта 2011

Закрытый пакет и доступ по умолчанию являются синонимами. Объект может также получить доступ к защищенному члену объектов, чьи классы находятся в одном пакете. Объект может также получить доступ к защищенному члену своих суперклассов без условия об их пакете. В качестве конкретного примера:

package ab;

class A {
   protected void foo() {}
   void dd(){}
}

class C {
   void aa(){
       A a = new A();
       a.foo(); //legal
       a.dd();  //legal
   }
}


package sub;

class D extends A{
      void ac(){
         foo(); //legal ..
         dd();  //illegal.. because dd has default access.. 
      }

class E {
    void ee(){
       A a = new A();
       a.foo(); //illegal
       a.dd();  //illegal     
    }
1 голос
/ 11 октября 2012

«Пакет частный» и доступ по умолчанию совпадают.В ранних выпусках компилятора около 1.1.2 / 3 «пакет» был разрешенным модификатором, но игнорировался, что означало то же самое, что без модификатора, то есть «пакет приватный».Вскоре после этого возникла недолгая мода на использование /*package*/ (в качестве комментария) в таких ситуациях.Аналогичным образом в то время вы могли объявлять такие вещи, как синхронизированные классы, хотя опять-таки не было фактического семантического эффекта.

Ни один из них не совпадает с «защищенным», который распространяется на производные классы в других пакетах.

0 голосов
/ 23 июня 2016

по умолчанию и package-private оба одинаковы, что означает, что оба могут использоваться любым классом, пока они не находятся в одном пакете.

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

Следовательно package-private означает то же самое, что и default .

0 голосов
/ 24 марта 2011

С Спецификация языка Java

  • 6.6.5 Пример: поля, методы и конструкторы доступа по умолчанию Если ни один из общедоступных модификаторов доступа, защищены или частные указаны, член класса или конструктор доступны во всем пакете, который содержит объявление класса в котором член класса объявлен, но член класса или конструктор недоступен в любом другом пакете.

Если у публичного класса есть метод или конструктор с доступом по умолчанию, затем этот метод или конструктор не доступны или унаследованы подкласс объявлен вне этого пакета

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