¿Cuál es el alcance predeterminado de un método en Java?

165

Si escribo:

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

¿Cuál es el alcance predeterminado de doThis()?

¿Público? ¿Protegido? ¿Privado?

Joe Fontana
fuente

Respuestas:

264

El alcance predeterminado es package-private. Todas las clases en el mismo paquete pueden acceder al método / campo / clase. Package-private es más estricto que los ámbitos públicos y protegidos, pero más permisivo que el ámbito privado.

Más información:
http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
http://mindprod.com/jgloss/scope.html

Esko Luontola
fuente
2
"El paquete predeterminado es más estricto que ..."
reinaldoluckman
77
También vale la pena mencionar que "package-private" es un buen alcance para usar al exponer métodos para pruebas de unidades externas.
Gary Rowe
1
Si este es el caso, ¿por qué sería necesario hacer algo público a menos que creara una biblioteca o algo de lo que los usuarios obtendrían funcionalidad para su código?
Daniel
2
@ user3858162 La mayoría de las aplicaciones no triviales se organizan en múltiples paquetes, en cuyo caso se necesita un alcance público para llamar a métodos de llamada desde otros paquetes.
Esko Luontola
19

Cualquier cosa definida como paquete privado puede ser accedida por la clase misma, otras clases dentro del mismo paquete, pero no fuera del paquete, y no por subclases.

Consulte esta página para ver una práctica tabla de modificadores de nivel de acceso ...

usuario15299
fuente
9

Sin un modificador de acceso, se puede acceder a un miembro de la clase a través del paquete en el que se declara. Puede obtener más información de la Especificación del lenguaje Java, §6.6.

Los miembros de una interfaz siempre son de acceso público, ya sea que se declaren explícitamente o no.

erickson
fuente
5

El alcance predeterminado es "predeterminado". Es extraño: consulte estas referencias para obtener más información.

Michael Haren
fuente
3
En realidad no lo es: es un paquete privado
Maurice Perry
2
No puedo eliminar mi respuesta porque ha sido aceptada. ¡Animo a Joe a ir con la respuesta de @ Esko!
Michael Haren el
1
el segundo enlace está roto (y por cierto es fácil pasar por alto que son dos enlaces)
idclev 463035818
1

Java 8 ahora permite la implementación de métodos dentro de una interfaz con un alcance predeterminado (y solo estático).

shiv
fuente