376 Stimmen

Was ist der Grund dafür, dass eine nichtstatische Methode nicht aus einem statischen Kontext heraus referenziert werden kann?

Der häufigste Anfängerfehler besteht darin, dass Sie versuchen, eine Klasseneigenschaft "statisch" zu verwenden, ohne eine Instanz dieser Klasse zu erstellen. Sie erhalten dann die erwähnte Fehlermeldung:

Sie können entweder die nicht statische Methode statisch machen oder eine Instanz dieser Klasse erstellen, um ihre Eigenschaften zu verwenden.

Was ist der Grund dafür? Mir geht es nicht um die Lösung, sondern um den Grund.

private java.util.List<String> someMethod(){
    /* Some Code */
    return someList;            
}

public static void main(String[] strArgs){          
     // The following statement causes the error. 
    java.util.List<String> someList = someMethod();         
}

477voto

Brian Knoblauch Punkte 19629

Man kann nicht etwas anrufen, das nicht existiert. Da Sie noch kein Objekt erstellt haben, existiert die nicht-statische Methode noch nicht. Eine statische Methode existiert (per Definition) immer.

99voto

Steven A. Lowe Punkte 59247

Die Methode, die Sie aufrufen wollen, ist eine Methode auf Instanzebene; Sie haben keine Instanz.

static Methoden zu der Klasse gehören, nicht static Methoden gehören zu Instanzen der Klasse.

32voto

Michael Borgwardt Punkte 334642

Das Wesen der objektorientierten Programmierung besteht darin, die Logik zusammen mit den Daten zu kapseln, mit denen sie arbeitet.

Instanzmethoden sind die Logik, Instanzfelder sind die Daten. Zusammen bilden sie ein Objekt.

public class Foo
{
    private String foo;
    public Foo(String foo){ this.foo = foo; }
    public getFoo(){ return this.foo; }

    public static void main(String[] args){
        System.out.println( getFoo() );
    }
}

Was könnte das Ergebnis der Ausführung des oben genannten Programms sein?

Ohne ein Objekt gibt es keine Instanzdaten, und während die Instanzmethoden als Teil der Klassendefinition existieren, benötigen sie eine Objektinstanz, um Daten für sie bereitzustellen.

Theoretisch könnte eine Instanzmethode, die nicht auf Instanzdaten zugreift, in einem statischen Kontext funktionieren, aber dann gibt es eigentlich keinen Grund, warum sie eine Instanzmethode sein sollte. Es ist eine Entscheidung des Sprachdesigns, sie trotzdem zuzulassen, anstatt eine zusätzliche Regel aufzustellen, um sie zu verbieten.

16voto

Hugo Punkte 3869

Mir ist gerade klar geworden, dass die Menschen nicht schon sehr früh mit dem Konzept der "Statik" konfrontiert werden sollten.

Statische Methoden sollten eher die Ausnahme als die Regel sein. Vor allem am Anfang, wenn Sie OOP lernen wollen. (Warum mit einer Ausnahme von der Regel beginnen?) Das ist sehr kontra-pädagogisch von Java, dass das "erste", was man lernen sollte, die öffentliche statisch nichtige Hauptsache. (Nur wenige echte Java-Anwendungen haben ohnehin ihre eigenen main-Methoden).

16voto

Erik Eidt Punkte 17153

Ich denke, es ist erwähnenswert, dass der Java-Compiler nach den Regeln der Java-Sprache das Äquivalent von "this." einfügt, wenn er feststellt, dass Sie auf Instanzmethoden oder Instanzfelder ohne explizite Instanz zugreifen. Natürlich weiß der Compiler, dass er dies nur innerhalb einer Instanzmethode tun kann, die eine "this"-Variable hat, während statische Methoden dies nicht haben.

Das bedeutet, dass in einer Instanzmethode Folgendes gleichwertig ist:

instanceMethod();
this.instanceMethod();

und diese sind ebenfalls gleichwertig:

... = instanceField;
... = this.instanceField;

Der Compiler fügt effektiv das "this." ein, wenn Sie keine spezifische Instanz angeben.

Diese (wortwörtlich gemeinte) "magische Hilfe" des Compilers kann Neulinge verwirren: Sie bedeutet, dass Instanzaufrufe und statische Aufrufe manchmal die gleiche Syntax zu haben scheinen, während es sich in Wirklichkeit um Aufrufe unterschiedlichen Typs und unterschiedlicher Basis handelt

T

T

P w "


W-

I

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