Bueno ... tuve esta duda también (es por eso que busqué este hilo). Esta podría ser una buena pregunta.
Pero ...
Después de un segundo pensamiento, las cosas son realmente más sencillo de lo que pensamos.
Un método de paquete privado, es un método de paquete privado.
¿Parece tonto? Pero ...
Un método paquete-privada, incluso si se hereda de su clase, es todavía un método paquete-privada.
¿Tiene más sentido ahora? Para una explicación más detallada:
Un método paquete-privada, incluso si su clase es heredada por una subclase más visible, es todavía un método paquete-privada.
Si la subclase es del mismo paquete, esos métodos privados del paquete también se heredan, pero todavía son paquetes privados.
Si la subclase es del paquete diferente (de aquí, necesitamos que la clase principal sea pública, con algunos métodos privados del paquete), los métodos privados del paquete son no heredados (porque no son visibles en absoluto)
Un punto a tener en cuenta, que puede ser la causa de esta duda, que un método de paquete privado en una clase pública no está visible fuera de su paquete también.
Lo anterior explica por el método de paquete-privada. Y el caso del método público es el mismo.
Cuando una clase de paquete-privada es heredada por una subclase del pubis (del mismo paquete, esto es una necesidad), sus métodos públicos se heredan como métodos públicos, y por lo tanto se convierten en métodos públicos de una clase púbico.
En el ejemplo OP, como foo()
y bar()
son ambos en una clase de paquete-privada, sus visibilidades se limitan a paquete-privada en este momento, hasta códigos adicionales se añaden (herencia por ejemplo).
Espero que esto sea claro (y simple) suficiente.
P.S. the Java access control table
"Declarar todos los métodos como privados" debería leerse "Declarando todos los métodos package-private" y "la clase adjunta" como "otras clases", supongo, pero de lo contrario +1 – Puce
@Puce, correcto, interpreté mal la pregunta. Ahora arreglado, gracias :-) –