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

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

Ответы

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

например.

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 { }
}

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

Ответ 4

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

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     
    }

Ответ 5

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

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

Ответ 6

Из Java Language Spec

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

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

Ответ 7

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

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

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