2013-03-11 11 views
21

Ho scritto il codice seguente per testare il concetto di classi e oggetti in Java."Variabile non statica non può essere referenziata da un contesto statico" durante la creazione di un oggetto

public class ShowBike { 
    private class Bicycle { 
     public int gear = 0; 
     public Bicycle(int v) { 
      gear = v; 
     } 
    } 

    public static void main() { 
     Bicycle bike = new Bicycle(5); 
     System.out.println(bike.gear); 
    } 
} 

Perché questo mi dà l'errore seguente nel processo di compilazione?

ShowBike.java:12: non-static variable this cannot be referenced from a static context 
     Bicycle bike = new Bicycle(5); 
        ^
+0

Non sono sicuro che sia un duplicato. Il post collegato non sembra davvero coprire classi annidate, che è ciò che chiede questa domanda. – Dukeling

risposta

39

Fare ShowBike.Bicycle statico.

public class ShowBike { 

    private static class Bicycle { 
     public int gear = 0; 
     public Bicycle(int v) { 
      gear = v; 
     } 

    } 

    public static void main() { 
     Bicycle bike = new Bicycle(5); 
     System.out.println(bike.gear); 
    } 
} 

In Java ci sono two types of nested classes: "classe annidata Static" e "Inner class". Senza la parola chiave static si tratta di una classe interna e sarà necessario un'istanza di ShowBike di accesso ShowBike.Bicycle:

ShowBike showBike = new ShowBike(); 
Bicycle bike = showBike.new Bicycle(5); 

statiche classi annidate e delle normali classi (non nidificati) sono quasi le stesse funzionalità, è solo diversi modi per raggruppare le cose. Tuttavia, quando si utilizzano classi nidificate statiche, non è possibile inserire le definizioni in file separati, il che porterà a un singolo file contenente molte definizioni di classe.

3

Il metodo principale non può accedere a un membro non statico della sua classe.

A proposito, le classi dovrebbero essere chiamate come nomi, non come verbi. Quindi un modo migliore per farlo è:

private class Bicycle { 
    public int gear = 0; 

    public Bicycle(int v) { 
     gear = v; 
    } 

    public void showGear() { 
     System.out.println(gear); 
    } 

    public static void main(String[] args) { 
     Bicycle bike = new Bicycle(6); 
     bike.showGear(); // Notice that the method is named after a verb 
    } 
} 
6

biciclette è una classe interna, quindi è necessario istanza classe esterna per creare un'istanza della classe interna come:

ShowBike sBike = new ShowBike(); 
Bicycle bike = sBike.new Bicycle(5); 

Oppure si può semplicemente dichiarare Bicycle classe come static per far funzionare il tuo modo attuale.

1

La classe della bicicletta non è statica e pertanto non può essere utilizzata in un metodo non statico. Se si desidera utilizzarlo nel metodo principale, modificarlo in

private static class Bicycle 
2

È necessario creare un oggetto di classe esterno instate di classe interna. o hai bisogno di rendere la classe interiore statica. quindi per la classe interna non è richiesto alcun oggetto.

Problemi correlati