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


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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.