2009-08-30 26 views

Respuesta

472

Una clase interna, by definition, no puede ser estática, por lo que voy a volver a formular su pregunta como "¿Cuál es la diferencia entre clases anidadas estáticas y no estáticas?"

Una clase anidada no estática tiene acceso completo a los miembros de la clase dentro de la cual está anidada. Una clase anidada estática no tiene una referencia a una instancia de anidamiento, por lo que una clase anidada estática no puede invocar métodos no estáticos ni acceder a campos no estáticos de una instancia de la clase dentro de la cual está anidada.

+3

buena respuesta. acceder a miembros estáticos desde instancias es tan ilógico. solo debería ser posible acceder a miembros estáticos a través de 'SomeClass.StaticMember' o, dentro de' SomeClass', a través de 'StaticMember' (sin' this'), entonces no obtendríamos estas preguntas. –

+4

@Brandon: cuando dices "la clase anidada estática no puede invocar métodos no estáticos ni acceder a campos no estáticos de una instancia de la clase dentro de la cual está anidada". ... Significa sin crear un objeto de la clase que lo encerra, ¿verdad? Dado que, como yo lo veo, la clase estática anidada es conductualmente una clase de nivel superior que ha sido anidada en otra clase de nivel superior para conveniencia de empaquetado. Por lo tanto, debería ser posible acceder a miembros no estáticos a través de un objeto. – Shatu

105

Veamos en la fuente de la sabiduría para este tipo de preguntas:

Técnicamente, no hay tal cosa como una clase interna estática: de Java eficazJoshua Bloch. De acuerdo con Java efectivo, la terminología correcta es clase anidada estática. Una clase anidada no estática es de hecho una clase interna, junto con clases anónimas y clases locales.

Y ahora a citar:

Cada instancia de una clase [anidado] no estático se asocia implícitamente con un encerrando ejemplo de su clase que contiene ... Es posible para invocar métodos en el ejemplo adjuntando.

Una clase anidada estática no tiene acceso a la instancia adjunta. Usa menos espacio también.

+10

Lo estaba leyendo. Elemento 22: clases de miembro estático Favor sobre –

+5

no estático También Bloch nota que la referencia a la instancia adjunta en una clase interna no estática innecesaria podría evitar la recolección de basura si se retiene. –

+1

¿Cuándo se prefiere uno sobre el otro? –

10

Discutiendo anidados clases ...

La diferencia es que una declaración de clase anidada que también es estática se pueden crear instancias fuera de la clase envolvente.

Cuando tiene una declaración de clase anidada que es no estática, Java no le permitirá instanciarla excepto a través de la clase adjunta. El objeto creado a partir de la clase interna está vinculado al objeto creado a partir de la clase externa, por lo que la clase interna puede hacer referencia a los campos del exterior.

Pero si es estático, entonces el enlace no existe, no se puede acceder a los campos externos (excepto a través de una referencia ordinaria como cualquier otro objeto) y por lo tanto puede instanciar la clase anidada por sí mismo.

3

clase interna estática: puede declarar estáticos & miembros no estáticos pero solo puede acceder a miembros estáticos de su clase principal.

clase interna no estática: puede declarar solo miembros no estáticos pero puede acceder a miembros estáticos y no estáticos de su clase padre.

+3

No hay "clase interna estática" y la clase interna (no estática) puede declarar algún tipo de miembros estáticos. [JLS 8.1.3] (http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.3 "Clases internas e instancias adjuntas"): 'Una clase interna está anidada clase que no está explícita o implícitamente declarada estática. [...] Las clases internas no pueden declarar miembros estáticos, a menos que sean campos constantes de tiempo de compilación (§15.28) .' –

3

Una clase anidada estática interactúa con los miembros de la instancia de su clase externa (y otras clases) como cualquier otra clase de nivel superior. En efecto, una clase anidada estática es conductualmente una clase de nivel superior que ha sido anidada en otra clase de nivel superior para conveniencia de empaquetado.

49

Existen dos diferencias entre las clases internas estáticas internas y no estáticas.

  1. En caso de declarar campos y métodos miembros, clase interna no estática no puede tener campos y métodos estáticos. Pero, en el caso de clase interna estática, puede tener campos estáticos y no estáticos y método.

  2. La instancia de clase interna no estática se crea con la referencia de objeto de clase externa, en la que se ha definido, esto significa que tiene ejemplo que encierra. Pero la instancia de la clase interna estática es creada sin la referencia de la clase externa, lo que significa que no tiene instancia adjuntando .

ver este ejemplo

class A 
{ 
    class B 
    { 
     // static int x; not allowed here 
    } 

    static class C 
    { 
     static int x; // allowed here 
    } 
} 

class Test 
{ 
    public static void main(String… str) 
    { 
     A a = new A(); 

     // Non-Static Inner Class 
     // Requires enclosing instance 
     A.B obj1 = a.new B(); 

     // Static Inner Class 
     // No need for reference of object to the outer class 
     A.C obj2 = new A.C(); 
    } 
} 
+0

Como uno de ellos no existe, la diferencia es infinita. – EJP

+3

Ejemplos realmente ayudan =) – Micro

+0

Resuelto Ambas dudas (Estática/no estática) en un Ejemplo, ¡muy ordenadas! – user3833732

4

Una clase interna no puede ser estática, por lo que voy a reformular su pregunta como "¿Cuál es la diferencia entre las clases anidadas estáticos y no estáticos?".

como dijiste aquí la clase interna no puede ser estática ... encontré el siguiente código que se le está dando ... ¿razón? o que es correcto ....

Sí, no hay nada en la semántica de un tipo anidado estático que le impida hacer eso. Este fragmento funciona bien.

public class MultipleInner { 
     static class Inner { 
     } 
    public static void main(String[] args) { 
     for (int i = 0; i < 100; i++) { 
      new Inner(); 
     } 
    } 
} 

Este es un código escrito en este sitio web ...

para la pregunta ---> Puede una clase estática anidada ser instanciado varias veces?

respuesta era --->

Ahora, por supuesto, el tipo anidado puede hacer su propio control de instancia (por ejemplo, los constructores privados, patrón Singleton, etc), pero eso no tiene nada que ver con el hecho de que se trata de un anidado tipo. Además, si el tipo anidado es una enumeración estática, por supuesto no puedes instanciarlo en absoluto.

Pero, en general, sí, un tipo anidado estático se puede instanciar varias veces.

Tenga en cuenta que, técnicamente, un tipo anidado estático no es un tipo "interno".

11
  1. La clase interna estática no puede acceder a los miembros no estáticos de la clase adjunta. Puede acceder directamente a los miembros estáticos (campo de instancia y métodos) de encerrar clase igual que el estilo de procedimiento para obtener valor sin crear un objeto.

  2. La clase interna estática puede declarar miembros estáticos y no estáticos. Los métodos estáticos tienen acceso a miembros estáticos de la clase principal. Sin embargo, no puede acceder a miembros de clase interna no estáticos. Para acceder a miembros de clase interna no estática, tiene que crear un objeto de clase interna no estática.

  3. Clase interna no estática no puede declarar campos estáticos y métodos estáticos. Debe declararse en tipos estáticos o de nivel superior. Obtendrá este error al decir "los campos estáticos solo se declaran en tipos estáticos o de nivel superior".

  4. La clase interna no estática puede acceder a los miembros estáticos y no estáticos de la clase adjunta en el estilo de procedimiento para obtener valor, pero no puede acceder a los miembros de la clase interna estática.

  5. La clase adjunta no puede acceder a los miembros de las clases internas hasta que crea un objeto de clases internas. Si la clase principal accede a los miembros de una clase no estática, puede crear un objeto de clase interna no estática.

  6. Si la clase principal en el acceso a los miembros de la clase interna estática que tiene dos casos:

    • Caso 1: Para los miembros estáticos, puede utilizar el nombre de clase de
    • Caso 2 clase interna estática: Para los que no -los miembros estáticos, puede crear instancia de clase interna estática.
+0

¿Podría corregir la gramática en lugares como "IF main class para acceder a miembros de clases no estáticas" o "If main class para acceder a miembros de clases estáticas internas"? No tengo idea de lo que intentas decir allí. – nhahtdh