Tengo el siguiente código:
public class MyClass {
class Inner {
int s, e, p;
}
public static void main(String args[]) {
Inner in;
}
}
Hasta esta parte, el código está bien, pero no puedo crear instancias 'in' dentro del método principal in = new Inner()
como se muestra non static field cannot be referenced in static context
.
¿De qué manera puedo hacerlo? No quiero que mi Inner
clase sea estática .
java
static
inner-classes
Victor Mukherjee
fuente
fuente
Respuestas:
También debe tener una referencia a la otra clase externa.
Si Inner fuera estático, entonces sería
fuente
OuterClass.StaticNestedClass nestedObj = new OuterClass.StaticNestedClass()
. Clases anidadasUna clase interna "regular" tiene un puntero oculto (implícito) a una instancia de clase externa. Esto permite que el compilador genere el código para perseguir el puntero por usted sin tener que escribirlo. Por ejemplo, si hay una variable "a" en la clase externa, entonces el código en su clase interna puede hacer "a = 0", pero el compilador generará código para "externalPointer.a = 0" manteniendo el puntero oculto debajo las portadas.
Esto significa que cuando crea una instancia de una clase interna, debe tener una instancia de una clase externa para vincularla. Si realiza esta creación dentro de un método de la clase externa, el compilador sabe usar "esto" como puntero implícito. Si desea vincular a alguna otra instancia externa, utilice una sintaxis especial "nueva" (consulte el fragmento de código a continuación).
Si hace que su clase interna sea "estática", entonces no hay un puntero oculto y su clase interna no puede hacer referencia a miembros de la clase externa. Una clase interna estática es idéntica a una clase regular, pero su nombre está dentro del padre.
Aquí hay un fragmento de código que demuestra la sintaxis para crear clases internas estáticas y no estáticas:
fuente
Si desea crear
new Inner()
desde un método, hágalo desde un método de instancia de la claseMyClass
:fuente
Alexei Kaigorodov es la respuesta correcta. Su solución le permite instanciar clases internas desde un método estático, como un main () de la misma clase. De lo contrario, no puede crear una instancia de una clase interna dentro de un método estático. No se compila. La solución de Alexei compila y le permite instanciar clases internas de un método estático. Las otras respuestas son notas al margen interesantes, pero no encuentro que respondan a la pregunta real.
fuente