ProgrammierungJava-Architekt

Was sind statische Methoden in Java-Interfaces und wie unterscheiden sie sich von abstrakten Methoden?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

Statische Methoden in Interfaces wurden mit Java 8 eingeführt. Sie werden mit dem Schlüsselwort static deklariert und direkt im Interface implementiert. Statische Methoden werden nicht von implementierenden Klassen vererbt, sondern über den Namen des Interfaces aufgerufen.

  • Deklaration einer statischen Methode:
interface MathUtils { static int sum(int a, int b) { return a + b; } }
  • Aufruf: MathUtils.sum(1, 2);
  • Man kann statische Methoden von Interfaces in implementierenden Klassen nicht überschreiben.
  • Sie bieten „Hilfs“-Funktionen, die mit dem Interface verbunden sind, erfordern jedoch keinen Instanzzustand.
  • Abstrakte Methoden müssen von einer Klasse implementiert werden; statische müssen das nicht.

Fangfrage

Frage: Kann eine statische Methode eines Interfaces über ein Objekt der implementierenden Klasse aufgerufen werden?

Antwort: Nein, eine statische Methode eines Interfaces wird immer über den Namen des Interfaces aufgerufen, nicht über eine Instanz oder den Namen der Implementierungsklasse. Das folgende Beispiel führt zu einem Kompilierungsfehler:

MathUtils utils = new SomeMathUtilsImpl(); utils.sum(1, 2); // Fehler! Es muss MathUtils.sum(1, 2) sein

Beispiele für reale Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas


Geschichte

Entwickler haben fälschlicherweise versucht, eine statische Methode eines Interfaces in der implementierenden Klasse „zu überschreiben“ und erwarteten, dass diese Methode über eine Instanz aufgerufen werden kann. Infolgedessen wurde immer die Version aus dem Interface aufgerufen, was zu falscher Geschäftslogik während der Nutzung führte.


Geschichte

Bei der Migration von Hilfsmethoden aus einer Klasse in ein Interface verwendete ein Teil des Codes den Aufruf über ein Objekt: obj.method(), was unmöglich wurde. Es musste in dem gesamten Projekt auf InterfaceName.method() refaktoriert werden.


Geschichte

Die Unterstützung älterer Java-Versionen führte zu Kompilierungsfehlern nach der Hinzufügung von statischen Methoden in Interfaces, da die Entwickler nicht überprüft hatten, welche Version des Compilers im CI verwendet wird, und der Build begann regelmäßig zu fehlschlagen.