361 Stimmen

Nicht-statische Variable kann nicht aus einem statischen Kontext referenziert werden

Ich habe diesen Testcode geschrieben:

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

Es wird jedoch die folgende Fehlermeldung angezeigt:

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

Wie bringe ich meine Methoden dazu, meine Klassenvariablen zu erkennen?

380voto

Aaron Digulla Punkte 308693

Sie müssen den Unterschied zwischen einer Klasse und einer Instanz dieser Klasse verstehen. Wenn Sie auf der Straße ein Auto sehen, wissen Sie sofort, dass es sich um ein Auto handelt, auch wenn Sie das Modell oder den Typ nicht erkennen können. Das liegt daran, dass Sie das, was Sie sehen, mit der Klasse "Auto". Die Klasse enthält, die ähnlich wie alle Autos ist. Betrachten Sie es als eine Vorlage oder eine Idee.

Gleichzeitig ist das Auto, das Sie sehen, eine Instanz der Klasse "Auto", da es alle Eigenschaften hat, die Sie erwarten: Es wird von jemandem gefahren, es hat einen Motor und Räder.

Die Klasse sagt also "alle Autos haben eine Farbe" und die Instanz sagt "dieses spezielle Auto ist rot".

In der OO-Welt definieren Sie die Klasse und innerhalb der Klasse definieren Sie ein Feld vom Typ Color . Wenn die Klasse instanziiert wird (wenn Sie eine bestimmte Instanz erstellen), wird Speicher für die Farbe reserviert und Sie können dieser bestimmten Instanz eine Farbe geben. Da diese Attribute spezifisch sind, sind sie nicht statisch.

Statische Felder und Methoden werden von allen Instanzen gemeinsam genutzt. Sie sind für Werte, die für die Klasse und nicht für eine bestimmte Instanz spezifisch sind. Bei Methoden handelt es sich normalerweise um globale Hilfsmethoden (wie Integer.parseInt() ). Bei Feldern handelt es sich in der Regel um Konstanten (wie z. B. Fahrzeugtypen, d. h. etwas, bei dem man eine begrenzte Menge hat, die sich nicht oft ändert).

Um Ihr Problem zu lösen, müssen Sie eine Instanz Ihrer Klasse instanziieren (ein Objekt erstellen), damit die Laufzeitumgebung Speicher für die Instanz reservieren kann (andernfalls würden sich verschiedene Instanzen gegenseitig überschreiben, was Sie nicht wollen).

Versuchen Sie in Ihrem Fall diesen Code als Startblock:

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
}

Die neue main() Methode erzeugt eine Instanz der Klasse, die sie enthält (klingt seltsam, aber da main() mit der Klasse und nicht mit der Instanz erstellt wird, kann sie dies tun) und ruft dann eine Instanzmethode ( run() ).

120voto

Mnementh Punkte 48509

Statische Felder und Methoden sind mit der Klasse selbst und nicht mit ihren Instanzen verbunden. Wenn Sie eine Klasse A eine "normale" (gewöhnlich als Instanz bezeichnete) Methode b und eine statische Methode c und Sie machen eine Instanz a Ihrer Klasse A die Aufrufe an A.c() y a.b() gültig sind. Methode c() hat keine Ahnung, welche Instanz verbunden ist, und kann daher keine nicht-statischen Felder verwenden.

Die Lösung für Sie ist, dass Sie entweder Ihre Felder statisch oder Ihre Methoden nicht statisch machen. Ihr main könnte dann so aussehen:

class Programm {

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

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

76voto

Richard Chambers Punkte 15587

Les static Schlüsselwort ändert den Lebenszyklus einer Methode oder Variable innerhalb einer Klasse. A static Methode oder Variable wird zum Zeitpunkt des Ladens einer Klasse erstellt. Eine Methode oder Variable, die nicht deklariert ist als static wird nur erstellt, wenn die Klasse als Objekt instanziiert wird, z. B. durch Verwendung der new Betreiber.

Der Lebenszyklus einer Klasse ist, grob gesagt, folgender:

  1. wird der Quellcode für die Klasse geschrieben und eine Vorlage oder Muster oder Stempel, der dann verwendet werden kann, um
  2. erstellen Sie ein Objekt mit der new Operator, der die Klasse verwendet, um eine Instanz der Klasse als tatsächliches Objekt zu erzeugen, und dann, wenn er mit dem Objekt fertig ist
  3. das Objekt zerstören und die Ressourcen, die es enthält, wie z. B. den Speicher, während der Garbage Collection zurückfordern.

Um einen ersten Einstiegspunkt für eine Anwendung zu haben, hat Java die Konvention übernommen, dass das Java-Programm eine Klasse haben muss, die eine Methode mit einem vereinbarten oder speziellen Namen enthält. Diese spezielle Methode heißt main() . Da die Methode unabhängig davon existieren muss, ob die Klasse, die die Hauptmethode enthält, instanziiert wurde oder nicht, muss die main() Methode muss mit der static Modifikator, so dass, sobald die Klasse geladen ist, die main() Methode verfügbar ist.

Wenn Sie Ihre Java-Anwendung über eine Befehlszeile starten, z. B. mit java helloworld eine Reihe von Aktionen stattfinden. Zunächst wird eine virtuelle Java-Maschine hochgefahren und initialisiert. Dann wird die Datei helloworld.class, die den kompilierten Java-Code enthält, in die Java Virtual Machine geladen. Dann sucht die Java Virtual Machine nach einer Methode in der Datei helloworld Klasse, die heißt main(String [] args) . diese Methode muss static so dass sie auch dann existiert, wenn die Klasse noch nicht als Objekt instanziiert worden ist. Die Java Virtual Machine erzeugt keine Instanz der Klasse, indem sie ein Objekt aus der Klasse erstellt. Sie lädt lediglich die Klasse und beginnt die Ausführung mit der main() Methode.

Sie müssen also eine Instanz Ihrer Klasse als Objekt erstellen und können dann auf die Methoden und Variablen der Klasse, die nicht mit der static Modifikator. Sobald Ihr Java-Programm mit dem main() Funktion können Sie dann alle Variablen oder Methoden verwenden, die den Modifikator von static da sie als Teil der geladenen Klasse existieren.

Die Variablen und Methoden der Klasse, die sich außerhalb der main() Methode, die nicht über die static Modifikator kann erst verwendet werden, wenn eine Instanz der Klasse als Objekt innerhalb der main() Methode. Nach der Erstellung des Objekts können Sie dann die Variablen und Methoden des Objekts verwenden. Ein Versuch, die Variablen und Methoden der Klasse zu verwenden, die nicht die static Modifikator zu verwenden, ohne ein Objekt der Klasse zu durchlaufen, wird vom Java-Compiler zur Kompilierzeit abgefangen und als Fehler gekennzeichnet.

import java.io.*;

class HelloWorld {
    int myInt;      // this is a class variable that is unique to each object
    static int myInt2;  // this is a class variable shared by all objects of this class

    static void main (String [] args) {
        // this is the main entry point for this Java application
        System.out.println ("Hello, World\n");
        myInt2 = 14;    // able to access the static int
        HelloWorld myWorld = new HelloWorld();
        myWorld.myInt = 32;   // able to access non-static through an object
    }
}

13voto

Suseendran.P Punkte 139

Analysieren wir zunächst Ihr Programm In Ihrem Programm ist Ihre erste Methode main() und beachten Sie, dass es sich um eine statische Methode handelt... Dann deklarieren Sie die lokale Variable für diese Methode (compareCount, low, high, etc..). Der Geltungsbereich dieser Variablen ist nur die deklarierte Methode, unabhängig davon, ob es sich um eine statische oder nicht statische Methode handelt. Sie können diese Variablen also nicht außerhalb dieser Methode verwenden. Dies ist der grundlegende Fehler, den Sie gemacht haben.

Dann kommen wir zum nächsten Punkt. Sie sagten, statische Aufladung bringt Sie um. (Es mag dich umbringen, aber es gibt deinem Programm nur Leben!!) Zuerst musst du die grundlegende Sache verstehen. *Statische Methode ruft nur die statische Methode auf und verwendet nur die statische Variable. *Statische Variablen oder statische Methoden sind nicht von einer Instanz der Klasse abhängig. (d.h. wenn Sie den Zustand der statischen Variable ändern, wird dies in allen Objekten der Klasse reflektiert) *Aus diesem Grund kann man sie als Klassenvariable oder Klassenmethode aufrufen. Und es gibt noch viel mehr über das Schlüsselwort "static". Ich hoffe, Sie haben jetzt die Idee verstanden. Ändern Sie zunächst den Gültigkeitsbereich der Variablen und deklarieren Sie sie als static (um sie in statischen Methoden verwenden zu können).

Und der Ratschlag für Sie lautet: Sie haben die Idee des Geltungsbereichs der Variablen und statischen Funktionalitäten falsch verstanden. Machen Sie sich darüber klar.

13voto

Nick Moore Punkte 14978

Um von Ihren statischen Methoden aus auf sie zugreifen zu können, müssen sie statische Mitgliedsvariablen sein, etwa so:

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 {
  ...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X