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


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

7 85

7 ответов:

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

модификатор доступа "по умолчанию" (тот, где ни один из них явно не задан) является "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-private и доступ по умолчанию являются синонимами. Объект также может получить доступ к защищенному члену объектов, классы которых находятся в одном пакете. Объект может также получить доступ к защищенному члену своих суперклассов без условия об их пакете. В качестве конкретного примера :

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     
    }

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

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

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

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

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

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

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

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