Właśnie zacząłem czytać książkę o Javie i zastanawiałem się; który specyfikator dostępu jest domyślny, jeśli żaden nie został określony?
java
access-specifier
bennedich
źródło
źródło
Odpowiedzi:
Domyślna widoczność jest znana jako „pakiet-prywatny” (chociaż nie można tego użyć jawnie), co oznacza, że pole będzie dostępne z wnętrza tego samego pakietu, do którego należy klasa.
Jak zauważył mdma, nie jest to jednak prawdą dla członków interfejsu, dla których domyślną wartością jest „public”.
Zobacz specyfikatory dostępu Java
źródło
Domyślny specyfikator zależy od kontekstu.
W przypadku klas i deklaracji interfejsu wartością domyślną jest pakiet prywatny. Dzieje się to między chronionymi i prywatnymi, umożliwiając dostęp tylko do klas z tego samego pakietu. (chronione jest w ten sposób, ale umożliwia również dostęp do podklas poza pakietem).
W przypadku elementów członkowskich interfejsu (pól i metod) domyślny dostęp jest publiczny. Należy jednak pamiętać, że sama deklaracja interfejsu domyślnie przyjmuje wartość pakietu private.
Jeśli wtedy mamy deklarację
Klasy używające MyInterface2 mogą wtedy zobaczyć field1 i method1 z super interfejsu, ponieważ są publiczne, nawet jeśli nie widzą deklaracji samego MyInterface.
źródło
/* pp */
) to tylko wygodna nazwa dla domyślnego dostępu . To nie jest nazwa JLS.Jeśli nie podano specyfikatora dostępu, jest to dostęp na poziomie pakietu (nie ma dla tego jawnego specyfikatora) dla klas i członków klas. Metody interfejsu są niejawnie publiczne.
źródło
Domyślna widoczność (bez słowa kluczowego) to pakiet, co oznacza, że będzie dostępna dla każdej klasy znajdującej się w tym samym pakiecie.
Ciekawostką na marginesie jest to, że protected nie ogranicza widoczności do podklas, ale także do innych klas w tym samym pakiecie
źródło
To zależy od tego, o co chodzi.
Typy najwyższego poziomu (czyli klasy, wyliczenia, interfejsy i typy adnotacji, które nie są zadeklarowane w innym typie) są domyślnie prywatne dla pakietu . ( JLS §6.6.1 )
W klasach wszyscy członkowie (co oznacza pola, metody i deklaracje typów zagnieżdżonych) i konstruktory są domyślnie prywatne dla pakietu . ( JLS §6.6.1 )
W wyliczeniach konstruktory są domyślnie prywatne . Rzeczywiście, konstruktory wyliczenia muszą być prywatne i określanie ich jako publicznych lub chronionych jest błędem. Stałe wyliczeniowe są zawsze publiczne i nie zezwalają na żaden specyfikator dostępu. Inni członkowie wyliczeń są domyślnie prywatni dla pakietów . ( JLS §8.9 )
W interfejsach i typach adnotacji wszystkie elementy członkowskie (ponownie oznacza to, że pola, metody i deklaracje typów zagnieżdżonych) są domyślnie publiczne . Rzeczywiście, elementy członkowskie interfejsów i typy adnotacji muszą być publiczne, a określanie ich jako prywatnych lub chronionych jest błędem. ( JLS §9.3 do 9.5 )
Klasy lokalne to nazwane klasy zadeklarowane wewnątrz metody, konstruktora lub bloku inicjatora. Są ograniczone do bloku
{
..}
, w którym są zadeklarowane i nie zezwalają na żaden specyfikator dostępu. ( JLS §14.3 ) Korzystając z refleksji, możesz utworzyć instancje klas lokalnych z innego miejsca i są one pakietami prywatnymi , chociaż nie jestem pewien, czy ten szczegół znajduje się w JLS.Klasy anonimowe to utworzone klasy niestandardowe,
new
które określają treść klasy bezpośrednio w wyrażeniu. ( JLS §15.9.5 ) Ich składnia nie zezwala na żaden specyfikator dostępu. Korzystając z refleksji, możesz tworzyć instancje anonimowych klas z innego miejsca, a zarówno one, jak i ich wygenerowane konstruktory są pakietami prywatnymi , chociaż nie jestem pewien, czy ten szczegół znajduje się w JLS.Instancje i statyczne bloki inicjalizujące nie mają specyfikatorów dostępu na poziomie języka ( JLS, §8.6 i 8.7 ), ale statyczne bloki inicjalizatora są implementowane jako metoda o nazwie
<clinit>
( JVMS §2.9 ), więc metoda musi wewnętrznie mieć określony specyfikator dostępu. Zbadałem klasy skompilowane przez javac i kompilator Eclipse przy użyciu edytora szesnastkowego i stwierdziłem, że obie generują metodę jako pakiet-prywatny . Jednak nie można wywołać<clinit>()
w języku, ponieważ znaki<
i>
są nieprawidłowe w nazwie metody, a metody odbicia są połączone na stałe, aby zaprzeczyć jego istnieniu, więc efektywnie jego specyfikatorem dostępu jest Instance dostępu nie ma dostępu . Metoda może być wywoływana tylko przez maszynę wirtualną podczas inicjowania klasy.Bloki inicjatora nie są kompilowane jako oddzielne metody; ich kod jest kopiowany do każdego konstruktora, więc nie można uzyskać do nich dostępu indywidualnie, nawet przez odbicie.źródło
default to słowo kluczowe używane jako modyfikator dostępu do metod i zmiennych.
Użycie tego modyfikatora dostępu sprawi, że twoja klasa, zmienna, metoda lub konstruktor będą dostępne z własnej klasy lub pakietu, zostanie on również ustawiony, jeśli nie ma modyfikatora dostępu.
jeśli użyjesz domyślnego interfejsu w interfejsie, będziesz mógł zaimplementować tam metodę, taką jak ten przykład
Jednak będzie działać tylko od wersji 8 Java
Oficjalna dokumentacja
Modyfikatory dostępu w Javie
źródło
Więcej informacji znajdziesz tutaj . Domyślnie nie jest to prywatny / publiczny / chroniony, ale zupełnie inna specyfikacja dostępu. Nie jest powszechnie używany i wolę być bardziej szczegółowy w moich definicjach dostępu.
źródło
domyślnym specyfikatorem dostępu jest pakiet. klasy mogą uzyskiwać dostęp do członków innych klas w tym samym pakiecie, ale poza pakietem jest on widoczny jako prywatny
źródło
Oto cytat o widoczności na poziomie pakietu z wywiadu z Jamesem Goslingiem, twórcą Javy:
http://www.artima.com/intv/gosling2P.html
źródło
Zaktualizuj użycie słowa kluczowego w Javie 8
default
: jak zauważyło wielu innych Domyślna widoczność (brak słowa kluczowego)Nie należy mylić z nową funkcją Java 8 ( metody domyślne ), która umożliwia interfejsowi udostępnianie implementacji, gdy jest oznaczona etykietą
default
słowem kluczowym.Zobacz: Modyfikatory dostępu
źródło
W JAVA istnieje modyfikator dostępu o nazwie „default”, który umożliwia bezpośrednie tworzenie instancji tej jednostki tylko w ramach tego pakietu.
Oto przydatny link:
Modyfikatory / specyfikatory dostępu Java
źródło
Przede wszystkim pozwolę sobie powiedzieć, że w Javie nie ma takiego terminu jak „specyfikator dostępu”. Powinniśmy nazywać wszystko „modyfikatorami”. Ponieważ wiemy, że końcowe, statyczne, zsynchronizowane, nietrwałe ... nazywane są modyfikatorami, nawet jako modyfikatory należy nazywać publiczne, prywatne, chronione, domyślne, abstrakcyjne. Domyślny to taki modyfikator, w którym nie ma fizycznej egzystencji, ale nie ma modyfikatorów, wtedy należy go traktować jako modyfikatory domyślne.
Aby to uzasadnić, weź jeden przykład:
Wynik będzie:
Hello Java
Teraz zmień publiczny na prywatny i zobacz, jaki błąd kompilatora otrzymujesz: mówi „Modyfikator prywatny nie jest tutaj dozwolony” Jaki wniosek jest taki, że ktoś może się mylić lub jakikolwiek tutorial może być zły, ale kompilator nie może się mylić. Możemy więc powiedzieć, że w Javie nie ma specyfikatora dostępu terminów, wszystko jest modyfikatorami.
źródło