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?


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.


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.


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.


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     
    }

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.


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


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 .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.