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?
java
terminology
protected
access-modifiers
package-private
TurtleToes
źródło
źródło
default
modyfikatora przed metodami (interfejsu). Ale to nie jest modyfikator dostępu! Wszystkie modyfikatory dostępu i ich zakresy są wyraźnie przedstawione w tej tabeli .Odpowiedzi:
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.
źródło
public static final
, dla metodypublic abstract
, dla wyliczenia lub adnotacji to,public
a dla klasy topublic static
„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.
źródło
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.
źródło
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 }
źródło
„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.
źródło
Ze specyfikacji języka Java
źródło
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 .
źródło