13 Stimmen

Wie und wo verwendet man Static Modifier in Java?

Wie und wo sollten wir einen statischen Modifikator verwenden?

1. Feld und
2. Methode?

について Beispiel en java.lang.Math Klasse sind die Feldmethoden wie abs(), atan(), cos() usw. statisch, d.h. sie können als aufgerufen werden: Math.abs()

Aber warum ist das eine gute Praxis?

Angenommen, ich halte es nicht statisch und erstelle ein Objekt der Klasse und greife darauf zu, was ich ohnehin kann, dann erhalte ich nur eine Warnung, dass Sie versuchen, auf eine statische Methode auf nicht statische Weise zuzugreifen (wie von @duffymo hervorgehoben, nicht im Fall der Math-Klasse).

UPDATE 1:

Eine Utility-Methode sollte also statisch sein, d.h. ihre Arbeit ist nur von den Methodenparametern abhängig. So kann zum Beispiel die Methode updateString(String inputQuery, String highlightDoc) sollte eine statische Methode sein in diese Frage ?

22voto

Alex Punkte 3644

Man kann sich eine "statische" Methode oder ein Feld so vorstellen, als ob es außerhalb der Klassendefinition deklariert wäre. Mit anderen Worten

  1. Es gibt nur eine "Kopie" eines statischen Feldes/einer statischen Methode.
  2. Statische Felder/Methoden können nicht auf nicht-statische Felder/Methoden zugreifen.

Es gibt mehrere Fälle, in denen Sie etwas statisch machen wollen.

Das kanonische Beispiel für ein Feld ist ein statisches Integer-Feld, das eine Zählung aller Instanzen (Objekte) einer Klasse vornimmt. Darüber hinaus verwenden beispielsweise Singleton-Objekte in der Regel den statischen Modifikator.

In ähnlicher Weise können statische Methoden verwendet werden, um "Utility"-Aufgaben auszuführen, für die alle erforderlichen Abhängigkeiten als Parameter an die Methode übergeben werden - innerhalb einer statischen Methode kann nicht auf das Schlüsselwort "this" verwiesen werden.

In C# können Sie auch statische Klassen haben, die, wie Sie sich denken können, nur statische Mitglieder enthalten:

public static class MyContainer
{
    private static int _myStatic;

    public static void PrintMe(string someString)
    {
        Console.Out.WriteLine(someString);
        _myStatic++;
    }

    public static int PrintedInstances()
    {
        return _myStatic;
    }
}

8voto

Niko Punkte 5873

Static verbraucht weniger Speicher, da es nur einmal pro Classloader existiert.

Statische Methoden können etwas Zeit sparen, da man nicht erst ein Objekt erstellen muss, um eine Funktion aufrufen zu können. Man kann/sollte statische Methoden verwenden, wenn sie ziemlich allein stehen (z.B. Math.abs(X) - es gibt wirklich kein Objekt, das die Funktion benötigt). Im Grunde ist es eine Sache der Bequemlichkeit (zumindest soweit ich das sehe - andere könnten und werden anderer Meinung sein :P)

Statische Felder sollten wirklich mit Vorsicht verwendet werden. Es gibt eine ganze Reihe von Mustern, die statische Felder benötigen... aber zuerst die Grundlagen:

ein statisches Feld existiert nur einmal. Wenn Sie also eine einfache Klasse haben (eine Art Pseudocode):

class Simple {
 static int a;
 int b;
}

und jetzt machen Sie Objekte mit:

Simple myA = new Simple();
Simple myB = new Simple();
myA.a = 1;
myA.b = 2;
myB.a = 3;
myB.b = 4;
System.out.println(myA.a + myA.b + myB.a + myB.b);

erhalten Sie 3234 - denn wenn Sie myB.a setzen, überschreiben Sie auch myA.a, da a statisch ist. Es existiert nur an einer Stelle im Speicher.

Normalerweise sollte man das vermeiden, weil dabei wirklich merkwürdige Dinge passieren können. Aber wenn Sie zum Beispiel googeln nach Fabrik-Muster werden Sie sehen, dass es für dieses Verhalten durchaus nützliche Anwendungen gibt.

Ich hoffe, das klärt die Sache ein wenig auf.

2voto

TheJediCowboy Punkte 8414

Versuchen Sie, einen Blick auf diesen Beitrag zu werfen, er enthält auch einige Beispiele dafür, wann statische und finale Modifikatoren verwendet werden sollten und wann nicht.

Die meisten der oben genannten Beiträge sind ähnlich, aber dieser Beitrag könnte weitere Einblicke bieten.
Wann werden statische Modifikatoren verwendet?

1voto

Fge Punkte 2931

Wenn die Methode nur von den Funktionsparametern und nicht vom internen Zustand des Objekts abhängt, handelt es sich in der Regel um eine statische Methode (die einzige Ausnahme ist Singletone). Ich kann mir nicht vorstellen, wo statische Felder wirklich verwendet werden (sie sind das Gleiche wie globale Variablen, die vermieden werden sollten).
Wie in Ihrem Beispiel hängen die mathematischen Funktionen nur von den Parametern ab.

1voto

pilotgallo2 Punkte 188

Für ein Feld sollten Sie es statisch halten, wenn Sie möchten, dass alle Instanzen einer bestimmten Klasse Zugriff auf seinen Wert haben. Wenn ich zum Beispiel

public static int age = 25;

Dann kann jede Instanz der Klasse den Wert von age erhalten oder setzen, wobei alle auf denselben Wert verweisen. Wenn Sie etwas statisch machen, laufen Sie Gefahr, dass zwei Instanzen sich gegenseitig Werte überschreiben und möglicherweise Probleme verursachen.

Der Grund, statische Methoden zu erstellen, ist vor allem für Dienstprogrammfunktionen, bei denen alle erforderlichen Daten für die Methode übergeben werden, und Sie wollen nicht den Aufwand, jedes Mal eine Instanz der Klasse zu erstellen, wenn Sie die Methode aufrufen wollen.

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