2012-04-24 17 views
12

Ho una classe molto semplice che voglio usare come sottoclasse di un'altra. Ma quando ho messo il suo codice nella classe dei genitori ottengo:Perché ottengo "variabile non statica che non può essere referenziata da un contesto statico"?

variabile non statico questo non è possibile fare riferimento da un contesto statico

D'altra parte, quando ho messo il sublass classe s' GenTest codice al di fuori del codice della classe "genitore" - JavaApp1 Non ho ricevuto questo errore.

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(); 
    } 
} 

Perché sta succedendo?

+2

vale la pena ricordare che gentest non è una sottoclasse di JavaApp1. È una classe annidata. La differenza è che le sottoclassi ereditano le proprietà pubbliche e protette della loro classe genitore. – ccoakley

+0

Basta inserire GenTest nel proprio file. Non è necessario nidificarlo in JavaApp1. –

+1

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

risposta

16

La classe nidificata (che non è una sottoclasse, tra l'altro) non viene contrassegnato come statica, quindi è un inner classe che richiede un'istanza della classe codifica (JavaApp1) per costruirlo.

Opzioni:

  • rendere la classe innestata statica
  • Ne fanno non una classe interna (cioè non all'interno JavaApp1 affatto)
  • Creare un'istanza di JavaApp1 come "istanza allegando":

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

Personalmente, opterei per il secondo approccio: le classi nidificate in Java presentano alcune stranezze intorno a loro, quindi utilizzerei le classi di livello superiore a meno che non si abbia una buona ragione per farlo nidificare. (L'opzione finale è particolarmente caotica, IMO.)

Vedere section 8.1.3 of the JLS per ulteriori informazioni sulle classi interne.

2

Dovrebbe essere static class GenTest, come si crea un'istanza di esso dal metodo statico.

Inoltre, in generale, le classi interne devono essere statiche.

1

La classe GenTest è una classe non statica e pertanto deve essere istanziata all'interno di un'istanza di JavaApp1. Se esegui static class GenTest ciò che hai funzionato altrimenti devi creare un'istanza di JavaApp1 e creare lo GenTest all'interno di un metodo non statico.

1

Thar perché GenTest è definito nel contesto di JavaApp1. Quindi puoi fare riferimento ad esso a meno che tu non abbia un'istanza di JavaApp1. Cambialo in un static class perché funzioni.

static class GenTest...

1

Si prega di utilizzare

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

Il modo in cui si invoca non è il modo corretto per farlo.Dal momento che la classe interna GenTest è un membro del JavaApp1 il modo corretto per invocare sarebbe

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

Con esso la classe sarebbe una corretta compilazione.

0

La classe è nidificata, il che significa che la classe nidificata non è statica, il che significa che è necessario creare un oggetto per la classe nidificata attraverso l'oggetto della classe principale. ciò significa che il tuo psvm dovrebbe essere così.

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(); 
} 
Problemi correlati