2012-04-24 20 views
12

Tengo una clase muy simple que quiero usar como una subclase de otra. Pero cuando pongo su código en la clase de los padres me sale:¿Por qué obtengo una "variable no estática a la que no se puede hacer referencia desde un contexto estático"?

variable no estática esto no se puede hacer referencia a un contexto estático

Por otro lado cuando pongo el sublass clase GenTest 's código fuera del código de clase del "padre" - JavaApp1 No obtengo este error.

public class JavaApp1 { 

    class GenTest { 
     @Deprecated 
     void oldFunction() { 
      System.out.println("don't use that"); 
     } 
     void newFunction() { 
      System.out.println("That's ok."); 
     } 
    } 

    public static void main(String[] args) { 
     GenTest x = new GenTest(); 
     x.oldFunction(); 
     x.newFunction(); 
    } 
} 

¿Por qué sucede esto?

+2

Vale la pena mencionar que GenTest no es una subclase de JavaApp1. Es una clase anidada. La diferencia es que las subclases heredan las propiedades públicas y protegidas de su clase principal. – ccoakley

+0

Simplemente ponga GenTest en su propio archivo. No es necesario anidarlo en JavaApp1. –

+1

http://stackoverflow.com/questions/5272957/problem-creating-object-of-inner-class-in-java –

Respuesta

16

Su clase anidada (que no es una subclase, por cierto) no está marcado como ser estático, por lo tanto es un interior clase que requiere una instancia de la clase de codificación (JavaApp1) con el fin de construirlo.

Opciones:

  • hacer que la clase anidada estática
  • hacer que no una clase interna (es decir, no dentro de JavaApp1 en absoluto)
  • crear una instancia de JavaApp1 como el "ejemplo encerrando":

    GenTest x = new JavaApp1().new GenTest(); 
    

Personalmente, me gustaría ir con el segundo enfoque: las clases anidadas en Java tienen algunas rarezas a su alrededor, así que usaría las clases de nivel superior a menos que tenga una buena razón para hacerlo anidado. (La última opción es particularmente complicada, IMO.)

Consulte section 8.1.3 of the JLS para obtener más información acerca de las clases internas.

2

Debe ser static class GenTest, ya que crea una instancia desde el método estático.

Además, en general, las clases internas deben ser estáticas.

1

La clase GenTest es una clase no estática y, por lo tanto, debe crearse una instancia dentro de una instancia de JavaApp1. Si hace static class GenTest lo que tiene que trabajar, de lo contrario necesita crear una instancia de JavaApp1 y crear el GenTest dentro de un método no estático.

1

Thar's porque GenTest se define dentro del contexto de JavaApp1. Por lo tanto, puede consultarlo a menos que tenga una instancia de JavaApp1. Cámbielo a static class para que funcione.

static class GenTest...

1

por favor utilice

static class GenTest()...... 
0

La forma en que se invoca no es la forma correcta de hacerlo.Dado que la clase interna GenTest es un miembro de la JavaApp1 la forma correcta para invocar sería

GenTest x = new JavaApp1().new GenTest();

utilizarlo, su clase se compilará correctamente.

0

La clase está anidada, lo que significa que su clase anidada no es estática, lo que significa que tiene que crear un objeto para la clase anidada a través del objeto de la clase principal. lo que eso significa es que tu psvm debería ser así.

public static void main(String[] args) { 
    JavaApp1 a=new JavaApp1(); //create an object for the main class 
    JavaApp1.GenTest x=a.new GenTest(); 

    x.oldFunction(); 
    x.newFunction(); 
} 
Cuestiones relacionadas