Jaki jest domyślny zakres metody w języku Java?

165

Jeśli napiszę:

 void doThis(){
     System.out.println("Hello Stackoverflow.");
 }

jaki jest domyślny zakres doThis()?

Publiczny? Chroniony? Prywatny?

Joe Fontana
źródło

Odpowiedzi:

264

Domyślnym zakresem jest pakiet-prywatny. Wszystkie klasy w tym samym pakiecie mają dostęp do metody / pola / klasy. Pakiet prywatny jest bardziej rygorystyczny niż zakres chroniony i publiczny, ale bardziej liberalny niż zakres prywatny.

Więcej informacji:
http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
http://mindprod.com/jgloss/scope.html

Esko Luontola
źródło
2
„Pakiet domyślny jest bardziej rygorystyczny niż ...”
reinaldoluckman
7
Warto również wspomnieć, że „pakiet-prywatny” to dobry zakres do wykorzystania podczas ujawniania metod do zewnętrznych testów jednostkowych.
Gary Rowe
1
Jeśli tak jest, to dlaczego kiedykolwiek miałoby być konieczne upublicznienie czegoś, chyba że tworzysz bibliotekę lub cokolwiek, z czego użytkownicy będą otrzymywać funkcje dla swojego kodu?
Daniel
2
@ user3858162 Większość nietrywialnych aplikacji jest zorganizowanych w wiele pakietów, w którym to przypadku zasięg publiczny jest potrzebny do wywoływania metod z innych pakietów.
Esko Luontola
19

Do wszystkiego, co zdefiniowano jako prywatny pakiet, można uzyskać dostęp przez samą klasę, inne klasy w tym samym pakiecie, ale nie poza pakietem i nie przez podklasy.

Na tej stronie znajduje się przydatna tabela modyfikatorów poziomu dostępu ...

user15299
źródło
9

Bez modyfikatora dostępu element członkowski klasy jest dostępny w całym pakiecie, w którym jest zadeklarowany. Więcej informacji można znaleźć w specyfikacji języka Java, §6.6.

Składowe interfejsu są zawsze publicznie dostępne, niezależnie od tego, czy zostały jawnie zadeklarowane, czy nie.

erickson
źródło
5

Zakres domyślny to „domyślny”. To dziwne - zobacz te referencje, aby uzyskać więcej informacji.

Michael Haren
źródło
3
Właściwie to nie jest: to pakiet prywatny
Maurice Perry
2
Nie mogę usunąć mojej odpowiedzi, ponieważ została zaakceptowana. Zachęcam Joe do skorzystania z odpowiedzi @ Esko!
Michael Haren
1
drugi link jest uszkodzony (a przy okazji łatwo przeoczyć, że są to dwa linki)
idclev 463035818
1

Java 8 umożliwia teraz implementację metod w samym interfejsie z domyślnym zakresem (i tylko statycznym).

shiv
źródło