Чи не є “приватний” пакетний доступ члена синонімом доступу за замовчуванням (без модифікатора)?


94

Я трохи збентежений терміном "приватний пакет", який використовується в деяких документаціях, поряд із використанням "доступу за замовчуванням". Чи не є пакетно-приватний та стандартний доступ одночасно захищеними?


7
Отже, немає жодного ключового слова для вираження приватного доступу до пакета? Це випливає лише з невказання модифікатора доступу?
TurtleToes

5
TurtleToes, це правильно, і це може трохи заплутати в Java 8, оскільки насправді можна поставити defaultмодифікатор перед методами (інтерфейсу). Але це не модифікатор доступу! Усі модифікатори доступу та їх обсяги чітко відображені в цій таблиці .
aioobe

1
Ви також можете переглянути таблицю підручників з docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
childno͡.de

Відповіді:


136

Так, це майже однаково. Захищений модифікатор вказує, що доступ до члена можна отримати лише в його власному пакеті (як у пакунку private-приватний) і, крім того , підкласом свого класу в іншому пакеті.


Тут було багато хороших відповідей, але ця пояснила це просто і
чітко

23
Варто зазначити, що стандартний доступ для учасника інтерфейсу не є приватним.
Пітер Лорі

1
@PeterLawrey О? Який тоді доступ за промовчанням для членів інтерфейсу?
ArtOfWarfare

8
За замовчуванням для поля є public static final, для методу є public abstract, для переліку чи анотації є, publicа для класуpublic static
Пітер Лорі

36

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

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


ну ваше формулювання про захищений є неправильним .. Ті самі екземпляри класу пакунків також можуть отримати доступ до захищених членів ..
Gursel Koca

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     
    }

downvoter міг пояснити, в чому неправильне це пояснення? .. окрім поганих формулювань ..
Gursel Koca

6
Я не голос проти, але, мабуть, це тому, що це не зовсім правильно; об'єкт може отримати доступ до захищених членів суперкласів, незалежно від пакету.
Адріан Петреску,

1

'Пакет приватний' та доступ за замовчуванням однакові. У ранніх випусках компілятора близько 1.1.2 / 3 «пакет» був дозволеним модифікатором, але ігнорувався, що означає те саме, що жоден модифікатор, тобто «приватний пакет». Незабаром після цього існувала короткочасна мода розміщувати /*package*/(як коментар) у таких ситуаціях. Подібним чином у той час ви могли оголошувати такі речі, як синхронізовані класи, хоча знову ж фактичного семантичного ефекту не було.

Жоден з них не є таким самим, як "захищений", який поширюється на похідні класи в інших пакетах.


0

З Java Language Spec

  • 6.6.5 Приклад: Поля, методи та конструктори доступу за замовчуванням Якщо не вказано жоден із модифікаторів доступу public, protected або private, член класу або конструктор доступний у всьому пакеті, що містить оголошення класу, в якому клас member оголошено, але член класу або конструктор недоступний в будь-якому іншому пакеті.

Якщо загальнодоступний клас має метод або конструктор із доступом за замовчуванням, тоді цей метод або конструктор недоступний або успадкований підкласом, оголошеним поза цим пакетом


2
Але як щодо "пакета приватних". Цього немає в JLS.
Tom Hawtin - таклін

-1

за замовчуванням і package-private обидва однакові, що означає, що обидва вони можуть використовуватися будь-яким класом, поки вони не знаходяться в одному пакеті.

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

Звідси package-private означає те саме, що і за замовчуванням .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.