Quelle est la portée par défaut d'une méthode en Java?

166

Si je tape:

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

quelle est la portée par défaut de doThis()?

Publique? Protégé? Privé?

Joe Fontana
la source

Réponses:

264

La portée par défaut est package-private. Toutes les classes d'un même package peuvent accéder à la méthode / champ / classe. Package-private est plus strict que les étendues protégées et publiques, mais plus permissive que l'étendue privée.

Plus d'informations:
http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
http://mindprod.com/jgloss/scope.html

Esko Luontola
la source
2
"Package-default est plus strict que ..."
reinaldoluckman
7
Il vaut peut-être aussi la peine de mentionner que "package-private" est une bonne portée à utiliser lors de l'exposition de méthodes pour des tests unitaires externes.
Gary Rowe
1
Si tel est le cas, pourquoi serait-il jamais nécessaire de rendre quelque chose public à moins que vous ne créiez une bibliothèque ou quoi que ce soit à partir duquel les utilisateurs obtiendraient des fonctionnalités pour leur code?
Daniel
2
@ user3858162 La plupart des applications non triviales sont organisées en plusieurs packages, auquel cas la portée publique est nécessaire pour appeler des méthodes à partir d'autres packages.
Esko Luontola
19

Tout ce qui est défini comme package private peut être accédé par la classe elle-même, d'autres classes dans le même package, mais pas en dehors du package, et pas par des sous-classes.

Voir cette page pour un tableau pratique des modificateurs de niveau d'accès ...

utilisateur15299
la source
9

Sans un modificateur d'accès, un membre de classe est accessible dans tout le package dans lequel il est déclaré. Pour en savoir plus , consultez la spécification du langage Java, §6.6.

Les membres d'une interface sont toujours accessibles au public, qu'ils soient explicitement déclarés ou non.

Erickson
la source
5

La portée par défaut est "par défaut". C'est bizarre - voir ces références pour plus d'informations.

Michael Haren
la source
3
En fait, ce n'est pas le cas: c'est un package privé
Maurice Perry
2
Je ne peux pas supprimer ma réponse car elle a été acceptée. J'encourage Joe à accepter la réponse de @ Esko!
Michael Haren
1
le deuxième lien est cassé (et d'ailleurs, il est facile de rater que ce sont deux liens)
idclev 463035818
1

Java 8 permet désormais l'implémentation de méthodes dans une interface elle-même avec une portée par défaut (et statique uniquement).

shiv
la source