1. Statische Methoden

Neben statischen Variablen können Klassen auch statische Methoden haben.

Reguläre Methoden sind an Objekte (Instanzen) einer Klasse gebunden und können auf gewöhnliche (nicht statische) Variablen der Klasse (sowie auf statische Variablen und Methoden ) verweisen. Statische Methoden sind an das statische Objekt der Klasse gebunden und können nur auf die statischen Variablen und/oder andere statische Methoden der Klasse zugreifen.

Um eine gewöhnliche (nicht statische) Methode für eine Klasse aufzurufen, müssen Sie zunächst ein Objekt der Klasse erstellen und dann die Methode für das Objekt aufrufen. Sie können keine gewöhnliche Methode für die Klasse anstelle eines Objekts aufrufen.

Beispiel:

Sie können keine nicht statische Methode für eine Klasse aufrufen!
public class DataInfo
{
   public int getValue()
   {
      return 100;
   }
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.getValue()); // This will generate an error!
   }
}

Um jedoch eine statische Methode aufzurufen, reicht es aus, dass das statische Objekt der Klasse einfach existiert (und es existiert immer, nachdem die Klasse in den Speicher geladen wurde). Aus diesem Grund ist die Methode main() statisch. Es ist an das statische Objekt der Klasse gebunden, sodass Sie keine Objekte erstellen müssen, um es aufzurufen.

Um eine Methode als statisch zu deklarieren, müssen Sie das Schlüsselwort static vor den Methodenheader schreiben. Das allgemeine Erscheinungsbild dieses Konstrukts ist wie folgt:

static Type name(parameters)
{
   method code
}

Beispiele:

Code Notiz
public class Solution
{
   public static void main(String args[])
   {
      test();
   }

   public static void test()
   {
      int d = 2/0;
   }
}


Die Java-Maschine ruft die mainMethode mit einem Befehl wie diesem auf: Solution.main();



Die statische test()Methode wird in der statischen Methode aufgerufen main().

Um eine statische Methode aus einer anderen Klasse aufzurufen, müssen Sie den Klassennamen vor dem Namen der statischen Methode angeben. Das allgemeine Erscheinungsbild dieses Konstrukts ist wie folgt:

Type name = ClassName.methodName(arguments)

Beispiele:

Code Statische Methode
int x = Math.min(a, b);
int min(int a, int b)
Thread.sleep(200);
void sleep(long ms)
Path path = Path.of("c:\\readme.txt");
Path of(String str)


2. Statische vs. gewöhnliche (nicht statische) Methoden

Was ist der Unterschied zwischen statischen und gewöhnlichen Methoden?

Eine gewöhnliche Methode ist an ein gewöhnliches Objekt (eine Instanz einer Klasse) gebunden, eine statische Methode hingegen nicht. Eine gewöhnliche Methode kann auf Variablen in ihrer Instanz zugreifen, eine statische Methode jedoch nicht: Sie verfügt einfach nicht über eine zugehörige Instanz.

Die Unterschiede zwischen den beiden Methodentypen werden in der folgenden Tabelle ausgedrückt:

Fähigkeit/Eigenschaft Gewöhnliche Methode Statische Methode
An eine Instanz der Klasse gebunden Ja NEIN
Kann gewöhnliche Methoden der Klasse aufrufen Ja NEIN
Kann statische Methoden der Klasse aufrufen Ja Ja
Kann auf gewöhnliche Variablen der Klasse zugreifen Ja NEIN
Kann auf statische Variablen der Klasse zugreifen Ja Ja
Kann für ein Objekt aufgerufen werden Ja Ja
Kann für die Klasse aufgerufen werden NEIN Ja

Warum werden solche Methoden benötigt, wenn sie so stark eingeschränkt sind? Die Antwort ist, dass dieser Ansatz auch seine Vorteile hat.

Erstens müssen Sie keine Objektreferenz übergeben, um auf statische Methoden und Variablen zuzugreifen.

Zweitens muss es manchmal nur eine einzige Instanz einer Variablen geben. Zum Beispiel System.out( die statische Ausgabevariable der System-Klasse ).

Und drittens muss man manchmal eine Methode aufrufen, bevor überhaupt Objekte erstellt werden können. Beispielsweise ruft die Java-Maschine die Methode main() auf, um die Ausführung des Programms zu starten, noch bevor eine Instanz der Klasse erstellt wird.

An eine Instanz der Klasse gebunden

Wenn eine gewöhnliche Methode aufgerufen wird, wird ihr implizit ein Argument – ​​das Objekt, für das die Methode aufgerufen wird – übergeben. Dieser Parameter heißt this. Dieser implizite Parameter (ein Verweis auf das Objekt, für das die Methode aufgerufen wird) unterscheidet gewöhnliche Methoden von statischen.

Statische Methoden verfügen nicht über diesen impliziten Parameter, daher können Sie das thisSchlüsselwort nicht innerhalb statischer Methoden verwenden und Sie können keine nicht statische Methode innerhalb einer statischen Methode aufrufen. Es gibt einfach nirgendwo einen Verweis auf eine Instanz einer Klasse.

Kann gewöhnliche Methoden der Klasse aufrufen

Eine gewöhnliche Methode verfügt immer über den impliziten thisParameter, sodass Sie immer einen Verweis auf das Objekt haben, für das die Methode aufgerufen wird. Immer wenn Sie eine gewöhnliche Methode innerhalb einer anderen gewöhnlichen Methode aufrufen, wird der implizite thisParameter verwendet, um diesen Aufruf durchzuführen. Beispiel

Code Wie es funktioniert
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = min(a, b);
   return min(t, c);
}
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = this.min(a, b);
   return this.min(t, c);
}

Aus diesem Grund können Sie eine gewöhnliche Methode nicht von einer statischen Methode aus aufrufen. Es gibt einfach keine implizite Variable mit dem Namen thisinnerhalb einer statischen Methode.

Oder stellen Sie sich eine andere Situation vor: In unserem Programm wurde noch kein einziges Objekt unserer Klasse erstellt. Können wir eine statische Methode unserer Klasse aufrufen? Ja. Und kann diese statische Methode eine gewöhnliche (nicht statische) Methode aufrufen?

Nun, bei welchem ​​Objekt würden wir es nennen? Schließlich existiert noch keine einzige Instanz unserer Klasse!

Kann statische Methoden der Klasse aufrufen

Statische Methoden können von überall aufgerufen werden – von jeder Stelle im Programm. Dies bedeutet, dass sie sowohl von statischen als auch von gewöhnlichen Methoden aufgerufen werden können. Hier gibt es keine Einschränkungen.

Kann auf gewöhnliche Variablen der Klasse zugreifen

Sie können über eine gewöhnliche Methode auf gewöhnliche Variablen einer Klasse zugreifen, da diese über den impliziten Parameter leicht einen Verweis auf eine Instanz der Klasse erhalten kann this.

Eine statische Methode weiß nicht, welche Instanz der Klasse sie verwenden soll, um Werte gewöhnlicher Variablen abzurufen. Und allgemeiner kann es leicht vorkommen, dass eine statische Methode aufgerufen wird, aber noch keine einzige Instanz der Klasse im Programm erstellt wurde.

Daher können statische Methoden nicht auf gewöhnliche Variablen einer Klasse zugreifen.

Angenommen, eine statische Methode ruft eine gewöhnliche Methode auf. Für welches Objekt soll diese gewöhnliche Methode aufgerufen werden?

Statische Methoden

Niemand weiß! Aus diesem Grund können Sie keine gewöhnliche Methode von einer statischen Methode aufrufen, ohne einen Verweis auf ein Objekt zu übergeben!

Kann auf statische Variablen der Klasse zugreifen

Bei Aufrufen statischer Variablen verhält es sich genauso wie bei Aufrufen statischer Methoden. Auf statische Variablen kann von überall im Programm zugegriffen werden. Das bedeutet, dass Sie mit statischen und gewöhnlichen Methoden darauf zugreifen können.

Kann für ein Objekt aufgerufen werden

Für ein Objekt können sowohl statische als auch gewöhnliche Methoden aufgerufen werden. Ein gewöhnlicher Methodenaufruf ist möglich – tatsächlich ist dies die einzige Möglichkeit, eine gewöhnliche Methode aufzurufen. Eine statische Methode kann auch für ein Objekt aufgerufen werden: In diesem Fall bestimmt der Compiler selbst den Typ der Variablen und ruft die statische Methode basierend auf ihrem Typ auf:

Code Wie der Compiler es sieht
Thread th = Thread.current();
th.sleep(1000);
Thread th = Thread.current();
Thread.sleep(1000);
Integer i = 1;
int x = i.parseInt("12");
Integer i = 1;
int x = Integer.parseInt("12");
"".valueOf(12);
String.valueOf(12);

Kann für die Klasse aufgerufen werden

Sie können für eine Klasse nur eine statische Methode aufrufen. Um eine gewöhnliche Methode aufzurufen, benötigen Sie einen Verweis auf eine Instanz der Klasse. Daher können Sie mit diesem Konstrukt keine gewöhnliche Methode aufrufen:ClassName.methodName(arguments)