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?

1voto

Newaz Sharif Amit Punkte 197

ClassLoader ist dafür zuständig, die Klassendateien zu laden, und wir wollen sehen, was passiert, wenn wir unsere eigenen Klassen schreiben.

Beispiel 1:

class StaticTest {

      static int a;
      int b;
      int c;
}

Jetzt können wir sehen, dass die Klasse "StaticTest" 3 Felder hat, aber es gibt keine Mitgliedsvariable b,c. Aber warum? OK Lass uns mal sehen. Hier sind b und c Instanzvariablen, die den Speicher zum Zeitpunkt der Objekterstellung erhalten. Also bekommen b,c hier noch keinen Speicher. Deshalb gibt es auch keine Existenz von b,c. Es gibt also nur die Existenz von a. Für ClassLoader gibt es nur eine Information über a. ClassLoader erkennt b,c noch nicht, weil es ein noch nicht instanziiertes Objekt ist.

Sehen wir uns ein anderes Beispiel an: Beispiel 2:

class StaticTest {

      public void display() {
          System.out.println("Static Test");
      }

      public static void main(String []cmd) {

             display();       
      }

}

Wenn wir nun versuchen, diesen Code zu kompilieren, gibt der Compiler einen CE-Fehler aus. CE: Nicht statische Methode display() kann nicht aus einem statischen Kontext referenziert werden.

Für ClassLoader sieht es nun so aus:

class StaticTest {

      public static void main(String []cmd) {

             display();       
      }

}

In Beispiel 2 liegt der CE-Fehler daran, dass wir eine nicht statische Methode aus einem statischen Kontext heraus aufrufen. Daher ist es für ClassLoader nicht möglich, die Methode display() zur Kompilierzeit zu erkennen, so dass ein Kompilierzeitfehler auftritt.

1voto

Sujay U N Punkte 4456

Dies ist etwas schwierig zu erklären, über statische Schlüsselwort für alle Anfänger.
Sie werden es besser kennen lernen, wenn Sie mehr mit Klassen und Objekten arbeiten.

|*| Statisch : Statische Elemente können mit Class Name aufgerufen werden
Wenn Sie in den Codes beobachten, werden einige Funktionen direkt mit Klassennamen aufgerufen wie

NamCls.NamFnc();

System.out.println();

Dies liegt daran, dass NamFnc und println mit dem Schlüsselwort static vor ihnen deklariert werden.

|*| Nicht statisch : Nicht statische Elemente können mit Klassenvariablen aufgerufen werden
Wenn es nicht statisch ist, benötigen Sie eine Variable der Klasse,
einen Punkt hinter die Klassenvariable setzen und
dann Funktion aufrufen.

NamCls NamObjVar = new NamCls();
NamObjVar.NamFnc();

Untenstehender Code erklärt Ihnen das ganz genau

|*| Statische und nicht statische Funktionen in der Klasse :

public class NamCls
{
    public static void main(String[] args)
    {
        PlsPrnFnc("Tst Txt");

        NamCls NamObjVar = new NamCls();
        NamObjVar.PrnFnc("Tst Txt");
    }

    static void PlsPrnFnc(String SrgPsgVal)
    {
        System.out.println(SrgPsgVal);
    }

    void PrnFnc(String SrgPsgVal)
    {
        System.out.println(SrgPsgVal);
    }
}

|*| Statische und nicht statische Klasse innerhalb einer Klasse :

public class NamCls
{
    public static void main(String[] args)
    {
        NamTicCls NamTicVaj = new NamTicCls();
        NamTicVaj.PrnFnc("Tst Txt");

        NamCls NamObjVar = new NamCls();
        NamNicCls NamNicVar = NamObjVar.new NamNicCls();
        NamNicVar.PrnFnc("Tst Txt");
    }

    static class NamTicCls
    {
        void PrnFnc(String SrgPsgVal)
        {
            System.out.println(SrgPsgVal);
        }
    }

    class NamNicCls
    {
        void PrnFnc(String SrgPsgVal)
        {
            System.out.println(SrgPsgVal);
        }
    }
}

1voto

hakkikonu Punkte 5477

In der Programmiersprache Java ist das Schlüsselwort static zeigt an, dass das betreffende Element zu einem Typ selbst gehört und nicht zu einer Instanz dieses Typs.

Dies bedeutet, dass nur eine Instanz dieser static Member erstellt, der von allen Instanzen der Klasse gemeinsam genutzt wird.

Wenn Sie also Ihre int count = 0; en static void main() , count Variable muss deklariert werden als static

static int count = 0;

0voto

Vikas Dhiman Punkte 21

In diesem Programm wollen Sie count verwenden, also deklarieren Sie die count-Methode als eine statische

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

Wie Sie hören, können Sie diese Methode auch als public private und protected deklarieren. Wenn Sie diese Methode verwenden, können Sie eine sichere Anwendung erstellen.

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

-1voto

Das liegt daran, dass Sie keine Instanz der Modellklasse erstellen, sondern jedes Mal, wenn Sie nicht-statische Methoden oder Variablen verwenden, Instanzen erstellen müssen.

Sie können dies leicht beheben, siehe untenstehende Bilder

Without Instance making

ohne eine Instanz der Klasse

enter image description here

Meine Modellklassendatei

enter image description here

Indem Sie einfach eine Instanz erstellen und dann nicht-statische Methoden oder Variablen der Klasse verwenden, können Sie leicht Fehler vermeiden.

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