364 votes

Une variable non statique ne peut pas être référencée à partir d'un contexte statique.

J'ai écrit ce code de test :

class MyProgram
{
    int count = 0;
    public static void main(String[] args)
    {
        System.out.println(count);
    }
}

Mais il donne l'erreur suivante :

Main.java:6: error: non-static variable count cannot be referenced from a static context
        System.out.println(count);
                           ^

Comment faire pour que mes méthodes reconnaissent les variables de ma classe ?

5 votes

Essayez d'éviter l'utilisation de l'électricité statique dans la mesure du possible. Vous puede écrire un programme complet, tout statique, comme en C . Mais ce ne sera pas une très bonne. Essayez d'utiliser Java comme il est censé l'être, en tant que langage orienté objet.

382voto

Aaron Digulla Points 143830

Vous devez comprendre la différence entre une classe et une instance de cette classe. Si vous voyez une voiture dans la rue, vous savez immédiatement qu'il s'agit d'une voiture, même si vous ne pouvez pas en voir le modèle ou le type. Cela est dû au fait que vous comparez ce que vous voyez avec la classe "voiture". La classe contient ce qui est similaire à toutes les voitures. Considérez-la comme un modèle ou une idée.

En même temps, la voiture que vous voyez est une instance de la classe "voiture" puisqu'elle possède toutes les propriétés que vous attendez : Il y a quelqu'un qui la conduit, elle a un moteur, des roues.

Ainsi, la classe dit "toutes les voitures ont une couleur" et l'instance dit "cette voiture spécifique est rouge".

Dans le monde OO, vous définissez la classe et à l'intérieur de la classe, vous définissez un champ de type Color . Lorsque la classe est instanciée (lorsque vous créez une instance spécifique), la mémoire est réservée pour la couleur et vous pouvez donner une couleur à cette instance spécifique. Comme ces attributs sont spécifiques, ils sont non statiques.

Les champs et méthodes statiques sont partagés par toutes les instances. Ils sont destinés à des valeurs qui sont spécifiques à la classe et non à une instance spécifique. En ce qui concerne les méthodes, il s'agit généralement de méthodes d'aide globales (telles que Integer.parseInt() ). Pour les champs, il s'agit généralement de constantes (comme les types de voitures, c'est-à-dire quelque chose pour lequel vous disposez d'un ensemble limité qui ne change pas souvent).

Pour résoudre votre problème, vous devez instancier une instance (créer un objet) de votre classe afin que le runtime puisse réserver de la mémoire pour l'instance (sinon, différentes instances s'écraseraient les unes les autres, ce que vous ne voulez pas).

Dans votre cas, essayez ce code comme point de départ :

public static void main (String[] args)
{
    try
    {
        MyProgram7 obj = new MyProgram7 ();
        obj.run (args);
    }
    catch (Exception e)
    {
        e.printStackTrace ();
    }
}

// instance variables here

public void run (String[] args) throws Exception
{
    // put your code here
}

Le nouveau main() crée une instance de la classe qu'elle contient (cela peut paraître étrange, mais puisque la méthode main() est créé avec la classe et non avec l'instance, il peut le faire) et appelle ensuite une méthode d'instance ( run() ).

5 votes

Je suis en train de l'expliquer à notre nouveau collègue - merci pour cette excellente explication. Ceci devrait être la réponse acceptée.

2 votes

Et les voitures Tesla ?

0 votes

@muthuh Il s'agit d'une question de conception : Devriez-vous créer un type TeslaCar ou plutôt ajouter un champ / une propriété model (o make ou type ) ? Cette dernière est généralement plus flexible et vous devez écrire moins de code mais si vous avez besoin d'un comportement spécifique pour chaque type de voiture, l'extension est souvent plus facile.

123voto

Mnementh Points 19831

Les champs et méthodes statiques sont liés à la classe elle-même et non à ses instances. Si vous avez une classe A une méthode "normale" (généralement appelée "instance") b et une méthode statique c et vous faites une instance a de votre classe A les appels à A.c() y a.b() sont valables. Méthode c() n'a aucune idée de l'instance connectée, il ne peut donc pas utiliser de champs non statiques.

La solution pour vous est de rendre vos champs statiques ou vos méthodes non statiques. Votre main pourrait alors ressembler à ceci :

class Programm {

    public static void main(String[] args) {
        Programm programm = new Programm();
        programm.start();
    }

    public void start() {
        // can now access non-static fields
    }
}

13voto

Suseendran.P Points 51

Analysons d'abord votre programme Dans votre programme, votre première méthode est main() et gardez à l'esprit qu'il s'agit d'une méthode statique... Ensuite, vous déclarez la variable locale pour cette méthode (compareCount, low, high, etc...). La portée de cette variable est uniquement la méthode déclarée, qu'il s'agisse d'une méthode statique ou non statique. Vous ne pouvez donc pas utiliser ces variables en dehors de cette méthode. C'est l'erreur fondamentale que vous avez commise.

Nous en arrivons au point suivant. Vous avez dit que l'électricité statique vous tue. (Il peut vous tuer mais il ne fait que donner de la vie à votre programme !) Tout d'abord, vous devez comprendre la chose de base. *La méthode statique appelle seulement la méthode statique et utilise seulement la variable statique. *Les variables statiques ou les méthodes statiques ne dépendent d'aucune instance de cette classe. (c'est-à-dire que si vous changez l'état d'une variable statique, cela se reflétera dans tous les objets de la classe). *C'est pour cette raison que vous l'appelez une variable de classe ou une méthode de classe. Et bien d'autres choses encore sur le mot-clé "static". J'espère que vous avez maintenant compris l'idée. Tout d'abord, changez la portée de la variable et déclarez-la comme statique (pour pouvoir l'utiliser dans des méthodes statiques).

Et le conseil que je vous donne est le suivant : vous avez mal compris l'idée de la portée des variables et des fonctionnalités statiques. Ayez une idée claire à ce sujet.

13voto

Nick Moore Points 7897

Pour pouvoir y accéder à partir de vos méthodes statiques, elles doivent être des variables membres statiques, comme ceci :

public class MyProgram7 {
  static Scanner scan = new Scanner(System.in);
  static int compareCount = 0;
  static int low = 0;
  static int high = 0;
  static int mid = 0;  
  static int key = 0;  
  static Scanner temp;  
  static int[]list;  
  static String menu, outputString;  
  static int option = 1;  
  static boolean found = false;

  public static void main (String[]args) throws IOException {
  ...

4voto

Petar Minchev Points 24864

Je vais essayer de vous expliquer ce qu'est la statique. Tout d'abord, les variables statiques n'appartiennent pas à une instance particulière de la classe. Elles sont reconnues avec le nom de la classe. Les méthodes statiques n'appartiennent pas non plus à une instance particulière. Elles ne peuvent accéder qu'aux variables statiques. Imaginez que vous appelez MyClass.myMethod() et que myMethod est une méthode statique. Si vous utilisez des variables non statiques à l'intérieur de la méthode, comment diable pourrait-elle savoir quelles variables utiliser ? C'est pourquoi vous ne pouvez utiliser que des variables statiques dans les méthodes statiques. Je répète encore une fois qu'elles n'appartiennent PAS à une instance particulière.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X