2010-10-18 11 views
12

Wie und wo sollten wir verwenden, um einen statischen Modifikator für:Wie und wo wird der statische Modifikator in Java verwendet?

1. Feld und
2. Methode?

Für example in java.lang.Math Klasse, die Felder Methoden wie abs(), atan(), cos() usw. statisch sind, das heißt sie können als zugegriffen werden: Math.abs()

Aber warum ist es eine gute Praxis?

Sagen, ich halte es nicht statisch und erstellen Sie ein Objekt der Klasse und greifen Sie darauf zu, was auch immer ich kann, ich werde nur eine Warnung erhalten, dass Sie versuchen, auf eine statische Methode auf eine nicht statische Weise zuzugreifen (wie von @duffymo angegeben, nicht im Fall der Math-Klasse).

UPDATE 1:

So Dienstprogramm Verfahren sollte statisch sein, d.h., deren Arbeit auf die Verfahrensparameter nur abhängig. Kann also beispielsweise die Methode updateString(String inputQuery, String highlightDoc) in this question eine statische Methode sein?

Antwort

20

Sie können sich eine 'statische' Methode oder ein Feld so vorstellen, als wäre es außerhalb der Klassendefinition deklariert. Mit anderen Worten

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

Es gibt mehrere Fälle, in denen Sie würde etwas statisch zu machen.

Das kanonische Beispiel für ein Feld besteht darin, ein statisches Integer-Feld zu erstellen, in dem alle Instanzen (Objekte) einer Klasse gezählt werden. Zum Beispiel verwenden auch Singleton-Objekte typischerweise den statischen Modifikator.

In ähnlicher Weise können statische Methoden verwendet werden, um 'Dienstprogramm'-Jobs durchzuführen, für die alle erforderlichen Abhängigkeiten als Parameter an die Methode übergeben werden - Sie können das Schlüsselwort' this 'innerhalb einer statischen Methode nicht referenzieren.

In C# können Sie auch statische Klassen, die, wie Sie vielleicht, denke nur statische Elemente 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; 
    } 
} 
+0

bitte mein Update überprüfen. Können Sie einige Informationen über die Beispielmethode, die ich in meiner Frage gepostet habe, geben? Das ist auch eine Hilfsmethode. – zengr

+0

@zengr: Ja, ich würde diese Methode statisch machen. Sie können sich beispielsweise eine StringHelper-Klasse vorstellen, die alle anwendungsspezifischen String-Manipulationsoperationen (wie die von dieser Methode durchgeführten) einschließt. In der Tat würde ich _any_ Methode statisch machen, wenn es nicht auf das Schlüsselwort 'this' verweist; Es gibt keine Notwendigkeit, eine Kopie dieser Methode auf jedem Objekt zu erstellen, es ist auf diese Weise besser lesbar, und es ist gut für die Klarheit des Gesamtdesigns IMO. – Alex

1

Normalerweise, wenn das Verfahren nur auf die Funktionsparameter abhängig ist und nicht auf den internen Zustand der Objekt ist eine statische Methode (Singletone ist die einzige Ausnahme). Ich kann mir nicht vorstellen, wo statische Felder wirklich verwendet werden (sie sind die gleichen wie globale Variablen, die vermieden werden sollten).
Wie in Ihrem Beispiel hängen die mathematischen Funktionen nur von den Parametern ab.

+1

Es gibt vollkommen legitime Verwendungen für den statischen Modifikator, z. B. die in meiner Antwort aufgeführten. – Alex

+0

"sie sind die gleichen wie globale Variablen, die vermieden werden sollten" - nicht, wenn sie endgültig sind; Diese erscheinen oft als Klassenkonstanten. –

+0

@alex Ich habe nicht darüber nachgedacht. Ich denke, die Verwendung von statischen Feldern hängt hauptsächlich von Ihrer Art der Programmierung ab und es gibt wahrscheinlich vollkommen gute Situationen, in denen Sie sie verwenden (und die in keiner Weise Singletone sind). Nur weil ich sie noch nicht gesehen habe, heißt das nicht, dass sie existieren oder schlecht sind :) Könntest du mir aus eigenem Interesse erklären, warum du die Gesamtzahl der Instanzen eines Objekts wissen willst, aber keinen Hinweis darauf? – Fge

0

Sie können keine Instanz von java.lang.Math instanziieren; Es gibt keinen öffentlichen Konstruktor.

Probieren Sie es aus:

public class MathTest 
{ 
    public static void main(String [] args) 
    { 
     Math math = new Math(); 

     System.out.println("math.sqrt(2) = " + math.sqrt(2)); 
    } 
} 

Hier ist, was Sie bekommen:

C:\Documents and Settings\Michael\My Documents\MathTest.java:5: Math() has private access in java.lang.Math 
     Math math = new Math(); 
        ^
1 error 

Tool completed with exit code 1 
+0

Ups, verpasste es. Aber im Allgemeinen, wenn eine Methode statisch ist, können wir trotzdem mit einem Objekt darauf zugreifen. Also, wo kommt die Effizienz des Gedächtnisses durch die Verwendung von statischen? – zengr

+1

Es ist keine Frage der Speichereffizienz; Es geht um die Absicht des Klassendesigners. – duffymo

1

Für ein Feld sollten Sie es statisch halten, wenn Sie alle Instanzen einer bestimmten Klasse wollen ihre auf Zugang zu Wert. Zum Beispiel, wenn ich

public static int age = 25; 

Dann kann jede Instanz der Klasse mit alle auf den gleichen Wert, den Wert des Alters und festlegen kann. Wenn Sie etwas statisch machen, laufen Sie Gefahr, dass zwei Instanzen die Werte gegenseitig überschreiben und möglicherweise Probleme verursachen.

Der Grund für die Erstellung statischer Methoden ist meistens die Dienstprogrammfunktion, bei der alle erforderlichen Daten für die Methode übergeben werden und Sie nicht jedes Mal eine Instanz der Klasse erstellen möchten, wenn Sie die Methode aufrufen möchten Methode.

8

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

haben Methoden statisch kann einige Zeit sparen, beacuse Sie zunächst ein Objekt nicht erstellen müssen, so dass Sie eine Funktion aufrufen können. Sie können/sollten statische Methoden verwenden, wenn sie ziemlich eigenständig stehen (dh Math.abs (X) - es gibt wirklich kein Objekt, das die Funktion benötigt.) Grundsätzlich ist es eine Bequemlichkeits-Sache (zumindest so weit ich es sehe - andere könnten und nicht zu: P)

Statische Felder sollten wirklich mit Vorsicht angewendet werden. Es gibt durchaus ein paar Muster, die statische Felder müssen ... aber die Grundlagen zuerst:

ein statisches Feld existiert nur einmal. Also, wenn Sie eine einfache Klasse haben (ein bisschen Pseudo-Code):

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); 

werden Sie 3234 erhalten - denn durch myB.a Einstellung, die Sie tatsächlich myA.a überschreiben auch weil a statisch ist. Es existiert an einem Ort in der Erinnerung.

Normalerweise möchten Sie dies vermeiden, weil wirklich seltsame Dinge passieren können. Aber wenn Sie zum Beispiel für Factory Pattern googlen, werden Sie sehen, dass es tatsächlich ziemlich nützliche Verwendungen für dieses Verhalten gibt.

Hoffe, dass es ein wenig aufräumt.

+1

Statische Felder existieren einmal pro Klassenladeprogramm, nicht einmal pro JVM. – user82928

2

versuchen, einen Blick auf diesem Thema nehmen, es gibt auch einige Beispiele, wann und wann nicht statisch und letzten Modifikatoren zu verwenden.

Die meisten der Beiträge sind oben ähnlich, aber dieser Beitrag könnte eine andere Einsicht bieten.
When to use Static Modifiers

Verwandte Themen