7 Stimmen

Statische Methode in java

Ich habe gehört, dass statische Methoden in Java nur statische Variablen verwenden sollten. Aber die Hauptmethode ist doch auch statisch, oder?

19voto

Mihir Mathuria Punkte 6399

Ihre Frage: Ist die Aussage "statische Methoden sollten nur statische Variablen verwenden" richtig?

Nein. Die Aussage ist nicht korrekt.

Die korrekte Aussage lautet: "Statische Methoden können nur die Instanzvariablen verwenden, die als statisch definiert sind".

Schauen Sie sich den folgenden Code an und lesen Sie die Kommentare:

Class A{
    int i;
    static int j;

    public static void methodA(){
        i = 5; //cannot use since i is not static
        j = 2; //can use.

        int k = 3; //k is local variable and can be used no problem

        **EDIT:**//if you want to access i
        A a = new A();
        //A.i = 5; //can use.  
        a.i = 5; // it should be non-capital "a" right?
    }
}

18voto

polygenelubricants Punkte 362173

Zunächst einmal eine Formalität: Es ist NICHT wahr, dass " main Methode ist ebenfalls statisch". Sie können eine nicht-statische main Methode, mit welcher Signatur auch immer; es wird nur kein gültiger Einstiegspunkt für eine Java-Anwendung sein.

Was die Aussage "statische Methoden sollten nur statische Variablen verwenden" betrifft, so ist dies auch NICHT wahr. Das Schlüsselkonzept hierbei ist, dass statische Methoden und Felder klassenspezifisch und nicht instanzspezifisch sind. Sie können einfach nicht auf eine Instanzvariable/-methode zugreifen, wenn Sie keine Instanz dieser Klasse haben; dies ist ein Kompilierungsfehler.

Um genau zu sein, können Sie ohne eine Instanz nicht auf Instanzfelder/-methoden zugreifen. Auf statische Felder/Methoden können Sie ohne Instanz zugreifen. Wenn Sie von einer statischen Methode aus auf Instanzfelder/-methoden zugreifen müssen, müssen Sie auf die eine oder andere Weise eine Instanz dieser Klasse erhalten, entweder indem Sie sie einfach instanziieren oder indem Sie einen Verweis auf sie von einem statischen Feld oder Methodenparameter erhalten.

Schauen wir uns dieses einfache Beispiel an:

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

length est NICHT ein statisches Feld; es ist ein Instanzfeld von Array-Instanzen, die args ist. Die statische Methode main ist in der Lage, diese Instanz zu erhalten (und somit auf ihre Instanzmethoden und -felder zuzugreifen), da sie als Argument übergeben wird.

Auch, println est NICHT eine statische Methode; sie ist eine Instanzmethode von PrintStream Instanzen. Die statische Methode main ist in der Lage, diese Instanz durch Zugriff auf das statische Feld out der Klasse System .


Zusammengefasst:

  • Ein Java-Anwendungseinstiegspunkt ist eine Methode, die:
    • heißt main
    • es public y static
    • gibt zurück. void und nimmt eine String[] Argument als Parameter
  • Eine Methode namens main muss kein Einstiegspunkt für eine Java-Anwendung sein
    • (aber es ist am besten, diesen Namen für diesen Zweck zu reservieren)

Außerdem,

  • Auf Instanzfelder/Methoden kann nur über eine Instanz zugegriffen werden
  • Auf statische Felder/Methoden kann ohne Instanz zugegriffen werden
  • Statische Methoden können eine Instanz einer Klasse auf eine der folgenden Arten erhalten:
    • Erstellung einer new Instanz
    • die Übergabe als Argument
    • Zugriff über eine static Feld einer Klasse
    • die als Rückgabewert einer static Methode einer Klasse
    • sie als geworfenes Ei zu fangen Throwable

4voto

Adriaan Koster Punkte 15224

Vielleicht hilft Ihnen dieses Stück Code weiter:

public class Main {

    private String instanceField = "Joe";

    private void instanceMethod() {
        System.out.println("Instance name=" + instanceField);
    }

    public static void main(String[] args) {

        // cannot change instance field without an instance
        instanceField = "Indy"; // compilation error

        // cannot call an instance method without an instance
        instanceMethod(); // compilation error

        // create an instance
        Main instance = new Main();

        // change instance field
        instance.instanceField = "Sydney";

        // call instance method
        instance.instanceMethod();  
    }
}

Sie können also nicht auf Instanzmitglieder zugreifen, ohne eine Instanz zu haben. Im Kontext einer statischen Methode haben Sie keinen Verweis auf eine Instanz, es sei denn, Sie erhalten oder erstellen eine.

Ich hoffe, das hilft.

3voto

Steve Punkte 17080

Eine statische Methode wird für eine Klasseninstanz und nicht für ein Objekt einer Klasse aufgerufen. Das bedeutet, dass eine statische Methode nicht auf Instanzvariablen zugreifen kann, da diese nur in einem Objekt instanziiert sind.

Wenn Sie mit einer statischen Methode auf eine Instanzvariable zugreifen wollen, müssen Sie diese Variable als statisch deklarieren.

public class Test {
    private static int value = 0;

    public static void main(String[] args) {
        value++;
    }
}

Aber um ehrlich zu sein, ist es nicht die beste Idee, alles in statische Methoden zu schreiben. Es ist besser, die Hauptmethode zu verwenden, um neue Objekte zu instanziieren.

3voto

user85421 Punkte 28350

Um auf nicht statische Felder (Instanzvariablen) zugreifen zu können, müssen Sie eine Instanz haben.
Innerhalb einer nicht-statischen Methode, this wird verwendet als Standard Instanz:

class AnyClass  {

    private String nonStaticField = "Non static";

    void nonStaticMethod() {
        this.nonStaticField = "a text";  // accessing field of this
        nonStaticField = "a text";       // same as before
    }
}

Innerhalb einer statischen Methode gibt es keine this zu verwenden als Standard Instanz, aber Sie können 1 noch auf Instanzvariablen zugreifen, wenn Sie die Instanz bereitstellen:

class AnyClass {

    private String nonStaticField = "Non static";

    static void staticMethod() {
        AnyClass example = new AnyClass();
        example.nonStaticField = "new value for non-static field";
    }
}

1 - muss das Feld auch zugänglich von Java's Zugangskontrolle (erklärt public oder in der gleichen Klasse ...)

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