Czy dostęp członka „prywatny pakiet” nie jest synonimem dostępu domyślnego (bez modyfikatorów)?

95

Jestem trochę zdezorientowany terminem „prywatny pakiet”, który jest używany w niektórych dokumentach, wraz z użyciem „domyślnego dostępu”. Czy dostęp prywatny i domyślny do pakietu nie jest równoznaczny z chronionym?

TurtleToes
źródło
7
Zatem nie ma żadnego słowa kluczowego, które wyrażałoby prywatny dostęp do pakietu? Jest to tylko domniemane przez nie określanie modyfikatora dostępu?
TurtleToes
5
TurtleToes, zgadza się, i może to być nieco zagmatwane w Javie 8, ponieważ w rzeczywistości możliwe jest umieszczenie defaultmodyfikatora przed metodami (interfejsu). Ale to nie jest modyfikator dostępu! Wszystkie modyfikatory dostępu i ich zakresy są wyraźnie przedstawione w tej tabeli .
aioobe
1
możesz również sprawdzić tabelę samouczków z docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
childno͡.de

Odpowiedzi:

137

Tak, to prawie to samo. Chroniony modyfikator określa, że ​​do elementu członkowskiego można uzyskać dostęp tylko w jego własnym pakiecie (tak jak w przypadku pakietu package-private), a ponadto przez podklasę jego klasy w innym pakiecie.

Luciano Fiandesio
źródło
Było tu wiele dobrych odpowiedzi, ale ta wyjaśniła to prosto i na temat, więc akceptuję to
TurtleToes
23
Warto zauważyć, że domyślny dostęp dla elementu interfejsu nie jest prywatnym pakietem.
Peter Lawrey,
1
@PeterLawrey Oh? Jaki jest zatem domyślny dostęp dla członków interfejsu?
ArtOfWarfare
8
Wartość domyślna dla pola to public static final, dla metody public abstract, dla wyliczenia lub adnotacji to, publica dla klasy topublic static
Peter Lawrey
36

„Domyślny” modyfikator dostępu (ten, w którym żaden z nich nie jest jawnie określony) to „pakiet-prywatny”, co oznacza, że ​​tylko elementy z tego samego pakietu mogą uzyskać do nich dostęp. Jednak bycie w tym samym pakiecie nie oznacza nic o relacji dziedziczenia między klasami - jest to czysto konwencja nazewnictwa.

„Chroniony” oznacza, że ​​nie tylko klasy w tym samym pakiecie, ale także podklasy (niezależnie od tego, w jakim pakiecie się znajdują) będą miały do ​​niego dostęp.

Adrian Petrescu
źródło
cóż, twoje sformułowanie dotyczące chronionych jest błędne. Te same instancje klas pakietów również mają dostęp do chronionych elementów członkowskich ..
Gursel Koca
15

Domyślny dostęp dla klas to pakiet prywatny, jednak domyślny dostęp dla członków interfejsu jest publiczny.

na przykład

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

Domyślne reguły dostępu do interfejsów nie są takie same, jak do klas.

Peter Lawrey
źródło
3

Dostęp prywatny i domyślny do pakietu to synonimy. Obiekt może również uzyskać dostęp do chronionych elementów członkowskich obiektów, których klasy znajdują się w tym samym pakiecie. Obiekt może również uzyskać dostęp do chronionych elementów należących do jego nadklas bez warunku dotyczącego ich pakietu. Jako konkretny przykład:

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     
    }
Gursel Koca
źródło
downvoter mógłby wyjaśnić, co jest nie tak z tym wyjaśnieniem .. z wyjątkiem złych sformułowań ..?
Gursel Koca
6
Nie jestem zwolennikiem krytyki, ale myślę, że to dlatego, że nie jest to do końca w porządku; obiekt może uzyskać dostęp do chronionych elementów składowych nadklas, niezależnie od pakietu.
Adrian Petrescu
1

„Pakiet prywatny” i domyślny dostęp są takie same. We wczesnych wydaniach kompilatora około 1.1.2 / 3 „pakiet” był dozwolonym modyfikatorem, ale był ignorowany, co oznacza to samo, co brak modyfikatora, tj. „Pakiet prywatny”. Niedługo potem pojawiła się krótkotrwała moda na stawianie się /*package*/(jako komentarz) w takich sytuacjach. Podobnie w tamtym czasie można było zadeklarować takie rzeczy jak klasy zsynchronizowane, chociaż znowu nie było rzeczywistego efektu semantycznego.

Żadne z nich nie jest tym samym, co „chronione”, co obejmuje klasy pochodne w innych pakietach.

Markiz Lorne
źródło
0

Ze specyfikacji języka Java

  • 6.6.5 Przykład: pola, metody i konstruktory o domyślnym dostępie Jeśli nie określono żadnego z modyfikatorów dostępu publicznego, chronionego lub prywatnego, element członkowski klasy lub konstruktor jest dostępny w całym pakiecie, który zawiera deklarację klasy, w której klasa element członkowski jest zadeklarowany, ale element członkowski klasy lub konstruktor nie jest dostępny w żadnym innym pakiecie.

Jeśli klasa publiczna ma metodę lub konstruktor z domyślnym dostępem, to ta metoda lub konstruktor nie jest dostępny lub dziedziczony przez podklasę zadeklarowaną poza tym pakietem

Martwy programista
źródło
2
Ale co z „pakietem prywatnym”. Tego nie ma w JLS.
Tom Hawtin - tackline
-1

default i pakiet-prywatny są takie same, co oznacza, że ​​oba mogą być używane przez dowolną klasę, dopóki nie znajdą się w tym samym pakiecie.

W rzeczywistości termin „ pakiet prywatny” jest określany w znaczeniu prywatnego modyfikatora, ponieważ prywatny oznacza, że ​​jest dostępny tylko w tej samej klasie i żadne inne klasy lub podklasy nie mają do niego dostępu w ramach tego samego pakietu lub bez.

Stąd pakiet-prywatny oznacza to samo, co domyślne .

aayush shah
źródło