2011-07-18 8 views
32

Estoy leyendo un texto de Java y el texto dice que solo podemos aplicar el modificador de acceso public o default para la clase y la interfaz. Por lo tanto, se trata de un error de compilación si declaramos:¿Por qué una clase o interfaz no puede recibir modificadores de acceso privados o protegidos?

private class A {} 

o

protected class A{} 

Tengo curiosidad por qué una clase o una interfaz no pueden recibir modificadores private o protected de acceso?

+0

No es un error de compilación si declaramos la clase A privado {} o clase protegida B {} siempre ya que A y B no son clases de nivel superior. – emory

+0

Creo que el acceso predeterminado para las interfaces es público, por lo que, en efecto, una interfaz siempre es pública. –

+1

@Adriaan Koster No. Esa regla se aplica a las interfaces * inside *, pero no a las interfaces mismas. – EJP

Respuesta

53

private significa "solo visible dentro de la clase adjunta".

protected significa "solo visible dentro de la clase adjunta y cualquier subclase, y también en cualquier parte del paquete de la clase adjunta".

private, por lo tanto, no tiene ningún significado cuando se aplica a una clase de nivel superior; lo mismo ocurre con la primera parte de la definición de protected. La segunda parte de protectedpodría aplicarse, pero está cubierta por el modificador predeterminado (protegido del paquete), por lo que protected es una parte sin sentido y parte redundante.

Ambos private y protected se pueden aplicar (y se aplican con frecuencia) a clases e interfaces anidadas, pero nunca a clases e interfaces de nivel superior.

5

Hay solo dos casos de uso para la visibilidad de clase en el nivel superior (a) Visible en todas partes (b) Visible solo dentro del paquete. Por lo tanto, solo dos modificadores (public y por defecto). Si la clase es public, entonces es visible para todas las clases. Si no hay un modificador de acceso, entonces es visible solo para las clases dentro del mismo paquete.

Si hubiera habido más casos de uso para la visibilidad de clase en el nivel superior, el lenguaje Java habría proporcionado más modificadores.

+0

En primer lugar, EXISTE más casos de visibilidad que Java proporciona (consulte, por ejemplo, C#) y, en segundo lugar, puede tener clases con modificadores privados o protegidos, simplemente no hay modificadores de nivel superior. – Voo

+0

@Voo, solo hay dos casos de uso en el nivel superior. Creo que la pregunta implicaba que, como decía, cualquier otro modificador generaba el error de compilación –

+0

de la clase de visibilidad? –

15

clases de nivel superior sólo pueden tener public o default acceso, pero las clases internas pueden tener private access:

public class TestClassAccess 
{ 
    public static void main(String[] args) 
    { 
     new TestClassAccess().new TestClassPrivateAccess(); 
    } 

    private class TestClassPrivateAccess 
    { 
     TestClassPrivateAccess() 
     { 
      System.out.println("I'm a private class"); 
     } 
    } 
} 
+3

buenos ejemplos. las clases internas también pueden ser estáticas. las interfaces internas y las enumeraciones son implícitamente estáticas. – emory

Cuestiones relacionadas