web-dev-qa-db-fra.com

"Variable non statique qui ne peut pas être référencée à partir d'un contexte statique" lors de la création d'un objet

J'ai écrit le code ci-dessous pour tester le concept de classes et d'objets en Java.

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

Pourquoi cela me donne-t-il l'erreur ci-dessous dans le processus de compilation?

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

Faire ShowBike.Bicycle statique.

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

Dans Java il y a deux types de classes imbriquées : "Classe imbriquée statique" et "Classe intérieure" . Sans le static mot clé c'est une classe interne et vous aurez besoin d'une instance de ShowBike pour accéder à ShowBike.Bicycle:

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

Les classes imbriquées statiques et les classes normales (non imbriquées) sont presque les mêmes dans la fonctionnalité, ce sont juste des façons différentes de grouper les choses. Cependant, lorsque vous utilisez des classes imbriquées statiques, vous ne pouvez pas placer leurs définitions dans des fichiers séparés, ce qui conduira à un seul fichier contenant de nombreuses définitions de classe.

40
Alvin Wong

Bicycle est une classe interne, vous avez donc besoin d'une instance de classe externe pour créer une instance de classe interne comme:

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

Ou vous pouvez simplement déclarer la classe Bicycle comme static pour faire fonctionner votre méthode actuelle.

6
Nandkumar Tekale

La méthode principale ne peut pas accéder à un membre non statique de sa classe.

Soit dit en passant, les classes doivent être nommées d'après des noms, pas des verbes. Donc, une meilleure façon de le faire est:

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
    }
}
3
ktm5124

Vous devez créer un objet de classe externe instate de classe interne. ou vous devez rendre la classe interne statique. donc pour la classe interne aucun objet requis.

2
Janny

Votre classe de vélo n'est pas statique et ne peut donc pas être utilisée dans une méthode non statique. Si vous souhaitez l'utiliser dans la méthode principale, changez-le en

private static class Bicycle
1
crazylpfan