una que polimorfismo interfaz interfaces instanciar ejercicios ejemplos clases clase abstractas abstracta java interface access-specifier

que - public interface java



El tutorial de Java dice que puedo tener una interfaz de paquete privado, pero no puedo (3)

Es la interfaz en sí misma que puede ser un paquete privado, no los métodos que contiene. Puede definir una interfaz que solo se puede usar (por nombre) dentro del paquete en el que se define, pero sus métodos son public como todos los métodos de interfaz. Si una clase implementa esa interfaz, los métodos que define deben ser public . La clave aquí es que es el tipo de interfaz que no es visible fuera del paquete, no los métodos. Los documentos no son incorrectos, porque usar los métodos definidos en la interfaz no es lo mismo que usar la interfaz en sí.

También tenga en cuenta que al definir una interfaz, no agregar public antes de que una definición de método no cambie nada, ya que todos los métodos son implícitamente public .

Si la (s) clase (s) que tiene implementando la interfaz son paquetes privados, el public de los métodos de la interfaz obviamente no es un problema. También podría, por supuesto, usar una clase abstracta en lugar de una interfaz si el problema de la herencia única no se interpone en su camino:

abstract class Whatever { abstract void foo(); abstract void bar(); }

En el tutorial de Java "Definiendo una interfaz" , dice

Si no especifica que la interfaz sea public , solo se podrá acceder a su interfaz a las clases definidas en el mismo paquete que la interfaz.

Sin embargo, este

interface PPInterface { void foo(); void bar(); } class NewClass implements PPInterface { void foo() {} void bar() {} }

genera errores de compilación en NewClass porque estoy intentando asignar privilegios de acceso más débiles; era público ''. Entonces, ¿la documentación es incorrecta, o hice algo mal, o malinterpreté la documentación?

Supongo que no tengo que usar una interfaz, me gusta porque mantiene las cosas bien organizadas.


lo que me funcionó para solucionar el problema de la herencia única:

En lugar de A se extiende B implementa C

Tengo resumen D (paquete protegido interfaz en C) se extiende B

y luego A extiende D

Funciona bien. Limpio, también, tbh.


Creo (aunque podría estar equivocado acerca de esto) que los privilegios de acceso más débiles que se discuten aquí son para los métodos foo() y bar() en NewClass . Todos los métodos de interfaz son implícitamente public , pero en NewClass ha dejado privados, lo cual es una garantía más débil que la public . Cambiar NewClass para leer

class NewClass implements PPInterface{ public void foo() {} public void bar() {} }

probablemente arreglará esto