Разве "закрытый пакетный" членский доступ не является синонимом доступа по умолчанию (без модификатора)?

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

7 ответов

Решение

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

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

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

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

например

public interface I {
   int A = 1;
// same as
   public static final int A = 1;

   void method();
// same as
   public abstract void method();

   class C { }
// same as
   public static class C { }
}

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

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

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.1.2/3 "пакет" был разрешенным модификатором, но игнорировался, что означало то же самое, что и без модификатора, то есть "пакет приватный". Вскоре после этого появилась недолгая мода на /*package*/ (как комментарий) в таких ситуациях. Аналогичным образом в то время вы могли объявлять такие вещи, как синхронизированные классы, хотя опять-таки не было фактического семантического эффекта.

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

Из спецификации языка Java

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

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

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

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

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

Другие вопросы по тегам