2011-03-24 11 views
38

¿Todos los métodos en una interfaz tienen por defecto el modo de visibilidad pública?Métodos de visibilidad en la interfaz

+0

Si tiene tiempo, es posible que desee leer SCJP para java 6 prep guide por head first team. Mucha información allí. Los métodos de interfaz son abstractos y públicos por defecto. – zawhtut

Respuesta

69

Todos los métodos en una interfaz predeterminada a public.

Ver Java Language Specification 6.6.1 que establece

Todos los miembros de interfaces son implícitamente public.

+23

Son 'público' predeterminado ** y **' público' es el único valor permitido. –

+0

+1 para hacer referencia al JLS (y, en general, tiene una cita) –

+4

pero la ** respuesta/"solución" ** de * rodion * (*** interfaz local/privada *** en sí) es importante ver aquí: http://stackoverflow.com/a/5420362/1915920 –

3

Sí, todos los métodos de una interfaz son públicos, y no puede tener ningún modificador de otro tipo de acceso (es decir, el modificador de acceso público predeterminado es el único modificador de acceso válido)

14

Todos los métodos de interfaz SON public abstract, todos los campos de la interfaz son public static final ...

ver here.

+4

+1: Y todas las clases anidadas son 'public static' –

+0

Lo mejor es no tener ningún estado (variables de instancia) en una interfaz, aunque el compilador le permitirá definir campos. Una interfaz debe definir las capacidades o lo que el objeto puede hacer. – hotshot309

10

Solo para agregar a otras respuestas aquí: todos los métodos son públicos, sin embargo, si la interfaz en sí es un paquete local, entonces efectivamente todos los métodos son también locales del paquete.

Puede, por lo tanto, mezclar los métodos públicos y locales del paquete, haciendo que una interfaz local del paquete amplíe una pública.

public interface P{ 
    void iAmPublic(); 
} 

interface L extends P{ 
    void iAmPackageLocal(); 
} 

Aquí L tiene efectivamente una pública y otra método de paquete local. Los clientes externos al paquete solo verán iAmPublic(), mientras que los que estén dentro del paquete verán ambos métodos.

De la misma forma puede anidar las interfaces dentro de otras clases para lograr una visibilidad aún más ajustada del método.

+1

su método 'iAmPackageLocal' _no_ será package-private. Ver http://stackoverflow.com/a/4801672/16209 –

+2

Como he indicado en la primera oración, el método es * efectivamente * paquete-privado (observe la palabra ** efectivamente ** aquí) ya que los métodos no pueden existir sin su declaración interfaz, que puede ser paquete privado como se indica en la misma publicación. Como solo puede acceder a 'P # iAmPublic()' desde fuera del paquete, pero puede acceder a ambos métodos desde el interior del paquete, obtendrá el efecto deseado. Supongamos que tiene alguna API con un método 'public L getL();' dentro del paquete, y luego intente llamar a 'getL(). IAmPackageLocal()' desde fuera del paquete obtendrá un error de compilación. – rodion

+0

'public class PseudoPrivate implementa L –

Cuestiones relacionadas