ProgrammingJavaアーキテクト

Javaのインターフェースにおける静的メソッドとは何であり、それは抽象メソッドとどう異なるのか?

Hintsage AIアシスタントで面接を突破

答え

インターフェースにおける静的メソッドは、Java 8から導入されました。これらはstaticキーワードを使って宣言され、インターフェース内で直接実装されます。静的メソッドは実装クラスには継承されず、インターフェースの名前を通じて呼び出されます。

  • 静的メソッドの宣言:
interface MathUtils { static int sum(int a, int b) { return a + b; } }
  • 呼び出し: MathUtils.sum(1, 2);
  • 実装クラスでインターフェースの静的メソッドをオーバーライドすることはできません。
  • これらはインターフェースに関連する「ユーティリティ」機能を提供しますが、インスタンスの状態を必要としません。
  • 抽象メソッドはクラスによって実装される必要がありますが、静的メソッドはそうではありません。

意地悪な質問

質問: インターフェースの静的メソッドは、実装クラスのオブジェクトを通じて呼び出すことができますか?

回答: いいえ、インターフェースの静的メソッドは常にインターフェースの名前を通じて呼び出され、インスタンスや実装クラスの名前を通じては呼び出されません。以下のコードはコンパイルエラーを引き起こします:

MathUtils utils = new SomeMathUtilsImpl(); utils.sum(1, 2); // エラー! MathUtils.sum(1, 2)が必要

トピックの詳細を知らないことによる実際のエラーの例


歴史

開発者はインターフェースの静的メソッドを実装クラスで「オーバーライド」しようと誤って試み、インスタンスを通じてこのメソッドを呼び出すことを期待していました。その結果、常にインターフェースのバージョンが呼び出され、使用中に誤ったビジネスロジックが発生しました。


歴史

ユーティリティメソッドをクラスからインターフェースに移動する際に、一部のコードがオブジェクトを介して呼び出すことを使用しました: obj.method()、これは不可能になり、プロジェクト全体で InterfaceName.method() に呼び出しをリファクタリングする必要がありました。


歴史

旧バージョンのJavaのサポートによって、インターフェースに静的メソッドを追加した後にコンパイルエラーが発生しました。開発者はCIで使用されているコンパイラーのバージョンを確認せず、ビルドが定期的に失敗し始めました。