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

94

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

Черепаха
источник
7
Итак, нет какого-либо ключевого слова для выражения частного доступа к пакету? Это только подразумевается, если не указан модификатор доступа?
TurtleToes,
5
TurtleToes, это верно, и это может немного сбивать с толку в Java 8, поскольку на самом деле можно поместить defaultмодификатор перед (интерфейсными) методами. Но это не модификатор доступа! Все модификаторы доступа и их области четко визуализированы в этой таблице .
aioobe
1
вы также можете проверить учебную таблицу на сайте docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
childno͡.de 01

Ответы:

136

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

Лучано Фиандезио
источник
Здесь было много хороших ответов, но этот объяснил это просто и по существу, так что я принимаю это
TurtleToes
23
Стоит отметить, что доступ по умолчанию для члена интерфейса не является частным для пакета.
Питер Лоури,
1
@PeterLawrey А? Каков же тогда доступ по умолчанию для членов интерфейса?
ArtOfWarfare
8
Значение по умолчанию для поля public static final, для метода public abstract, для перечисления или аннотации, publicи для класса,public static
Питер Лоури,
36

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

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

Адриан Петреску
источник
ну, ваша формулировка о защите неверна .. Одинаковые экземпляры класса пакета также могут получить доступ к защищенным членам ..
Гурсель Коджа
15

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

например

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

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

Питер Лоури
источник
3

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

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     
    }
Гюрсель Коджа
источник
Голосующий против может объяснить, что не так в этом объяснении? .. кроме плохой формулировки ..
Гурсель Коджа
6
Я не голосующий против, но думаю, это потому, что это не совсем так; объект может получить доступ к защищенным членам суперклассов независимо от пакета.
Адриан Петреску,
1

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

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

Маркиз Лорн
источник
0

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

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

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

Мертвый программист
источник
2
А как насчет «частного пакета». Этого нет в JLS.
Том Хотин - tackline
-1

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

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

Следовательно , частный пакет означает то же, что и по умолчанию .

ааюш шах
источник