HOWTO · Java
Java のインターフェイスのデフォルト メソッド
このチュートリアルでは、Java のインターフェースでデフォルトのメソッドを使用する方法を示します。
このページの内容
このチュートリアルでは、Java のインターフェースで default メソッドを使用する方法を示します。
Java のインターフェイスのデフォルト メソッド
default メソッドは、インターフェースが抽象メソッドのみを持つ前に、Java 8 で導入されました。 default または防御メソッドを使用すると、開発者は実装を壊すことなくインターフェイスに新しいメソッドを追加できます。
default メソッドは、インターフェースが実装を定義できる柔軟性を提供します。 この実装は、クラスがそのメソッドの実装を提供できなかったこの状況では、デフォルトと見なされます。
default メソッドでインターフェイスを作成してみましょう:
package delftstack;
public interface Demo_Interface {
public void Existing_Method();
default public void Default_Method() {
System.out.println("a default method is added to the interface");
}
}
上記のコードは、インターフェイスに default メソッドを追加します。 default メソッドがどのように機能するかを示す別の例を試してみましょう。
package delftstack;
interface Demo_Interface {
// The abstract method
public void cube(int x);
// The default method
default void show() {
System.out.println("Default Method is Executed");
}
}
public class Example implements Demo_Interface {
// The implementation of an abstract method
public void cube(int x) {
System.out.println(x * x * x);
}
public static void main(String args[]) {
Example Demo = new Example();
Demo.cube(6);
// execute default method.
Demo.show();
}
}
上記のコードは、整数の 3 乗を計算する抽象メソッドと、出力を表示する default メソッドを作成します。 出力を参照してください。
216
Default Method is Executed
デフォルト メソッドと抽象クラス
インターフェイスと抽象クラスのデフォルト メソッドはどちらも同じように動作しますが、いくつかの違いがあります。
- 抽象クラスはコンストラクターを定義でき、
defaultメソッドは他のインターフェースを呼び出すために実装できます。 - 抽象クラスはより構造化されており、状態を関連付けることができます。 同時に、
defaultメソッドは特定の実装の状態を参照しません。
デフォルトの方法と通常の方法
デフォルトの方法は通常の方法とは異なります。 主な違いは次のとおりです。
- クラスの通常のメソッドは、クラスのメソッド引数とフィールドを変更できます。 対照的に、インターフェイスには状態がないため、
defaultメソッドは独自の引数にしかアクセスできません。 - 通常のメソッドは、クラスに新しい機能を追加するために実装を壊す必要がありますが、
defaultメソッドは、実装を壊さずにインターフェースに新しい機能を追加できます。 defaultメソッドを抽象メソッドとして再宣言し、サブクラスに強制的にオーバーライドさせることができます。
デフォルトのメソッドと多重継承
ご存知のように、多重継承は Java のインターフェースを介してのみ可能です。 現在、Java クラスは複数のインターフェイスを持つことができ、各インターフェイスは同じメソッド シグネチャで default メソッドを定義できるため、継承されたメソッド間で競合が発生します。
例を参照してください:
package delftstack;
interface Interface_One {
default void defaultMethod() {
System.out.println("Interface One default method");
}
}
interface Interface_Two {
default void defaultMethod() {
System.out.println("Interface Two default method");
}
}
public class Example implements Interface_One, Interface_Two {}
上記のコードはコンパイル エラーになります。 出力を参照してください。
java: class Example inherits unrelated defaults for defaultMethod() from types Interface_One and Interface_Two
このエラーには簡単な解決策があります。 Example クラスで default メソッドの実装を提供する必要があります。 例を参照してください:
package delftstack;
interface Interface_One {
default void defaultMethod() {
System.out.println("Interface One default method");
}
}
interface Interface_Two {
default void defaultMethod() {
System.out.println("Interface Two default method");
}
}
public class Example implements Interface_One, Interface_Two {
public void defaultMethod() {}
}
これで問題は解決します。 さらに、クラスのスーパー インターフェイスから default メソッドを呼び出したい場合は、次のように使用できます。
package delftstack;
interface Interface_One {
default void defaultMethod() {
System.out.println("Interface One default method");
}
}
interface Interface_Two {
default void defaultMethod() {
System.out.println("Interface Two default method");
}
}
public class Example implements Interface_One, Interface_Two {
public void defaultMethod() {
// other code
Interface_One.super.defaultMethod();
}
}