2010-11-02 11 views
8

Tengo una clase anidada "privada estática" en Java. ¿Cuál es la importancia de los modificadores de acceso para campos y métodos dentro de esta clase? Lo he intentado tanto público como privado sin ningún efecto en mi aplicación.Modificadores de acceso dentro de una clase anidada estática privada en Java

public class MyList<T>{ 
    private static class Node{ // List node 
     private Object item; 
     private Node next; 
     private Node prev; 

     private Node(Node next){ 
      this.next = next; 
     } 

     private static Node doStuff(){} 
    } 
} 
+1

puede publicar su código, así como su suposición de lo que está esperando –

Respuesta

4

dos tipos de clases anidadas: 1. estáticos (clase anidada) y 2. no estáticos (también llamada clase interna)

Ahora, la clase externa, MyList puede acceder a todos los miembros de la clase interna Node, pero en realidad usa los especificadores de acceso para los miembros de la clase Node (clase anidada) cuando quiere que restricciones de alguna clase externa accedan a ella.

Interesante lee: Source1, Source2

10

Debido a que es una clase anidada, todo en Node se puede acceder por MyList<T>, independientemente de modificador de acceso; porque es una clase anidada privada, nada primero declarado en Node será visible fuera de MyList<T>.

Por lo tanto, el único caso en que el modificador de acceso puede ser importante son los métodos que anulan un método de superclase (por ejemplo, toString()). No puede reducir la visibilidad de un método anulado. toString() siempre debe declararse público para que la clase compile.

También se debe tener en cuenta que cuando los miembros privados tienen acceso a la clase externa, el compilador crea un método sintético (creo en el alcance del paquete). Este método sintético solo es visible en el archivo .class de la clase anidada.

+2

Buena respuesta. Añadiría que los modificadores en la clase interna importan solo si la clase interna no es 'privada '. – Jorn

+0

"cuando la clase externa accede a los miembros privados, el compilador crea un método sintético". ¿Crea el método sintético cuando solo se accede a miembros 'privados estáticos' de la clase anidada estática de la clase externa? Supuestamente, todos los miembros estáticos (incluido el de las clases anidadas estáticas) se resuelven en tiempo de compilación. – andrybak

+0

@andrybak El compilador de Java puede reconocer cuándo se accede a un miembro privado interno por la clase externa, independientemente de si es estática o no. Solo crea el método de acceso sintético cuando es necesario. – ILMTitan

Cuestiones relacionadas