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.