webentwicklung-frage-antwort-db.com.de

public static void main () Zugriff auf nicht statische Variable

Es wird gesagt, dass nicht statische Variablen nicht in einer statischen Methode verwendet werden können.

13
user1526671

Nein, das stimmt nicht.

public class A {
  int a = 2;
  public static void main(String[] args) {
    System.out.println(a); // won't compile!!
  }
}

aber

public class A {
  static int a = 2;
  public static void main(String[] args) {
    System.out.println(a); // this works!
  }
}

oder wenn Sie A instanziieren

public class A {
  int a = 2;
  public static void main(String[] args) {
    A myA = new A();
    System.out.println(myA.a); // this works too!
  }
}

Ebenfalls 

public class A {
  public static void main(String[] args) {
    int a = 2;
    System.out.println(a); // this works too!
  }
}

funktioniert, da a hier eine lokale Variable ist und keine Instanzvariable. Eine Methodenvariable ist während der Ausführung der Methode immer erreichbar, unabhängig davon, ob die Methode static ist oder nicht.

25
Keppil

Ja, die main-Methode kann auf nicht statische Variablen zugreifen, jedoch nur indirekt über tatsächliche Instanzen .

Beispiel:

public class Main {
    public static void main(String[] args) {
        Example ex = new Example();
        ex.variable = 5;
    }
}

class Example {
    public int variable;
}

Was Leute meinen, wenn sie sagen "Nicht statische Variablen können nicht in einer statischen Methode verwendet werden" ist, dass nicht statische Mitglieder derselben Klasse sind Auf kann nicht direkt zugegriffen werden (wie in Keppils-Antwort zum Beispiel gezeigt).

Verwandte Frage:


Update:

Wenn man von nicht statischen Variablen spricht, meint man implizit Mitgliedsvariablen . (Da lokale Variablen ohnehin keinen statischen Modifikator haben können.)

Im Code

public class A {
    public static void main(String[] args) {
        int a = 2;
        System.out.println(a); // this works!
    }
}

sie deklarieren eine lokale Variable (die normalerweise nicht als nicht statisch bezeichnet wird, obwohl sie keinen statischen Modifikator enthält).

10
aioobe

Die Hauptmethode hat auch keinen Zugriff auf nicht statische Member. 

final public class Demo
{
   private String instanceVariable;
   private static String staticVariable;

   public String instanceMethod()
   {
      return "instance";
   }

   public static String staticMethod()
   {
      return "static";
   }

   public static void main(String[] args)
   {
      System.out.println(staticVariable); // ok
      System.out.println(Demo.staticMethod()); // ok

      System.out.println(new Demo().instanceMethod()); // ok
      System.out.println(new Demo().instanceVariable); // ok

      System.out.println(Demo.instanceMethod()); // wrong
      System.out.println(instanceVariable);         // wrong 
   }
}

Dies liegt daran, dass standardmäßig beim Aufruf einer Methode oder Variable wirklich auf die this.method() oder this.variable zugegriffen wird. In der main () - Methode oder einer anderen statischen Methode () wurden noch keine "this" -Objekte erstellt.

In diesem Sinne ist die statische Methode nicht Teil der Objektinstanz der Klasse, in der sie enthalten ist. Dies ist die Idee hinter den Utility-Klassen.

Um eine nicht statische Methode oder Variable in einem statischen Kontext aufzurufen, müssen Sie das Objekt zunächst mit einem Konstruktor oder einer Factory wie Ihrer eigenen außerhalb der Klasse erstellen.


Mehr Tiefe:

Im Grunde ist es ein Fehler im Design von Java IMO, der es erlaubt, auf statische Member (Methoden und Felder) zu verweisen, als ob sie waren Instanzmitglieder. Dies kann in Code wie diesem verwirrend sein:

Thread newThread = new Thread(runnable);
newThread.start();
newThread.sleep(1000);

Das sieht so aus, als würde es den neuen Thread in den Ruhezustand versetzen, aber eigentlich kompiliert sich wie folgt in Code:

Thread newThread = new Thread(runnable);
newThread.start();
Thread.sleep(1000);

weil sleep eine statische Methode ist, die nur den aktuellen Thread in den Ruhezustand versetzt.

In der Tat wird die Variable nicht einmal auf Nicht-Nullheit geprüft (mehr, ich glaube es war früher):

Thread t = null;
t.sleep(1000);

Einige IDEs können so konfiguriert werden, dass eine Warnung oder ein Fehler für Code wie diesen ausgegeben wird. Sie sollten dies nicht tun, da dies die Lesbarkeit beeinträchtigt. (Dies ist einer der Fehler, die durch C # korrigiert wurden ...)

3
Lion

** Hier sehen Sie eine Tabelle, die den Zugriff von statischen und nicht statischen Datenelementen in statischen und nicht statischen Methoden ermöglicht. **  static non-static table

3
Sufyan Ahmad

Sie können nicht statische Verweise in statischen Methoden erstellen, z.

static void method() {
   A a = new A();
}

Das Gleiche tun wir im Fall der public static void main(String[] args)-Methode

0
public class XYZ
{
   int i=0;
   public static void increament()
       {
       i++;   
       }
}
public class M
{
    public static void main(String[] args)
    {
    XYZ o1=new XYZ();
    XYZ o2=new XYZ();
    o1.increament(); 
    XYZ.increament(); //system wont be able to know i belongs to which object 
                  //as its increament method(static method)can be called using   class name system 
                  //will be confused changes belongs to which object.
    }
}
0