Javaのデフォルトメソッド

PHPz
リリース: 2024-08-30 16:15:42
オリジナル
830 人が閲覧しました

Java 8 では、古いインターフェイスによるラムダ式を制御する下位互換性を実現するために、デフォルト メソッドという新しい概念が導入されました。さらに、インターフェイスは、インターフェイスが実装されるクラスに問題を引き起こすことなく、実装された関数を持つことができます。 Java 8 が導入される前は、インターフェイスでは抽象メソッドのみが許可されていました。さらに、関数はさまざまなクラスで提供する必要がありました。次のセクションでは、デフォルトのメソッドの構文、動作、および例について説明します。

無料ソフトウェア開発コースを始めましょう

Web 開発、プログラミング言語、ソフトウェア テスト、その他

構文

以下はデフォルトのメソッドの構文です。

public interface animal {
default void sound() {
System.out.println("This is a sample default method. . .!");
}}
ログイン後にコピー

Java ではデフォルトのメソッドはどのように機能しますか?

ご存知のとおり、List やコレクションなどのインターフェイスには forEach メソッドがありません。これを追加すると、コレクションのフレームワーク実装が壊れます。 Java 8ではデフォルトメソッドが導入されたため、forEachメソッドに対してデフォルト実装を行うことができます。それに加えて、同じデフォルト機能を持つ 2 つのインターフェイスを実装するクラスも実行できます。コードのあいまいさがどのように解決されるかを見てみましょう。

public interface livingthings
{
default void sound()
{     . . .
System.out.println("Living things too make noise . . .") ;
}
}
public interface animals
{
default void sound()
{          . . .
System.out.println("animals too make noise . . .") ;
}
}
ログイン後にコピー

この曖昧さに対する解決策は 2 つあります。

1. デフォルトのメソッド実装をオーバーライドするには、独自のメソッドを作成します。

public class dogs implements livingthings,animals
{
default void sound()
{          . . .
System.out.println("dogs bark . . .") ;} }
ログイン後にコピー

2. スーパーを使用して、デフォルトのメソッドを呼び出します

public class dogs implements livingthings,animals
{
default void sound()
{          . . .
livingthings.super.print("dogs bark . . .") ; } }
ログイン後にコピー

Java では、通常、1 つのクラスによって n 個のインターフェイスを実装できます。さらに、インターフェイスは別のインターフェイスによって拡張できます。クラスに 2 つのインターフェイスがあり、デフォルトのメソッドが実装されているとします。特定のクラスは、どのメソッドを呼び出すかを選択する際に混乱する可能性があります。これらの競合を解決するには、次の点を実行できます。

  • クラス内のオーバーライドされたメソッドが照合されて呼び出されます。
  • 同じメソッドが提供されている場合は、最も適切なメソッドが選択されます。特定のクラスに 2 つのインターフェイス A と B があるとします。 A が B を拡張する場合、ここでは A が最も具体的であり、デフォルトのメソッドは A から選択されます。A と b が独立したインターフェイスである場合、深刻な競合状況が発生し、コンパイラによって、それが問題であるという苦情が提起されます。選べない。この状況では、ユーザーはデフォルトのメソッド A または B を選択する必要がある追加の詳細を提供してコンパイラーを支援する必要があります。例:
A.super.demo() ;
ログイン後にコピー

または

B.super.demo() ;
ログイン後にコピー

通常の方法とデフォルトの方法の違い

ここで、通常の方法とデフォルトの方法の違いをいくつか見てみましょう

  • 通常のメソッドとは異なり、デフォルトのメソッドにはデフォルトの修飾子が付いています。
  • インターフェイスの引数には、デフォルト メソッドの特定の状態はありません。
  • 通常のメソッドは、メソッドとクラスのフィールドの引数を使用したり変更したりできます。
  • 特定のインターフェイスの以前の実装を壊すのではなく、既存のインターフェイスに新しい機能を追加できます。

デフォルトメソッドで構成されるインターフェースを拡張する場合、以下を実行できます。

  • デフォルトのメソッドはオーバーライドされず、継承されます。
  • デフォルトのメソッドはオーバーライドされます。これは、サブクラスでオーバーライドされるメソッドと同様です。
  • デフォルトのメソッドを再度抽象として宣言する必要があります。これにより、サブクラスが強制的にオーバーライドされます。

Java のデフォルト メソッドの実装例

言及されているサンプル プログラムは次のとおりです:

例 #1

デフォルトメソッドを実装する Java プログラム

コード:

//Java program to implement default method
public class DefExample {
//main method
public static void main(String args[]) {
//create an object for the interface animal
Animals obj = new Dog();
//call the print method
obj.print( );
}
}
//create an interface animal
interface Animals {
//default method
default void print( ) {
System.out.println("I have four legs. . . ! !");
}
static void sound() {
System.out.println("I used to bark alot!!!") ;
}
}
//create an interface <u>carnivores</u>
interface Carnivores {
//default method
default void print( ) {
System.out.println("I eat non veg. . .! !") ;
}
}
//class that implements the other two interfaces
class Dog implements Animals, Carnivores {
public void print( ) {
//call the print method of Animals  using super
Animals.super.print( ) ;
//call the print method of Carnivores  using super
Carnivores.super.print( );
//call the sound method of Animals
Animals.sound();
System.out.println("I am a Dog . . .!");
}
}
ログイン後にコピー

出力:

Javaのデフォルトメソッド

説明: このプログラムでは、Animals と Carnivores という 2 つのインターフェースに同じデフォルト メソッド print() があり、これらは super を使用して呼び出されます。

例 #2

デフォルトメソッドを実装する Java プログラム

コード:

//Java program to implement default method
interface Sampleinterface{
// Since this is declared as a default method, this has to be implemented in the implementation classes
default void sammethod(){
System.out.println("a default method which is newly added to the program");
}
// existing public as well as abstract methods has to be implemented in the implementation classes
void oldmethod(String s);
}
public class DefExample implements Sampleinterface{
//  abstract method implementation
public void oldmethod(String s){
System.out.println("The string given is: "+ s);
}
public static void main(String[] args) {
DefExample obj = new DefExample();
//call the default method
obj.sammethod();
//call the abstract method
obj.oldmethod("I am the old method in the program");
}
}
ログイン後にコピー

出力:

Javaのデフォルトメソッド

説明: このプログラムには、Sampleinterface インターフェースが存在し、デフォルトのメソッド sammethod() があり、それが呼び出されます。

結論

Java 8 では、古いインターフェイスがラムダ式を制御する下位互換性を実行するために、デフォルト メソッドという新しい概念が提供されています。さらに、インターフェイス引数には、デフォルト メソッドの特定の状態がありません。この記事では、デフォルトのメソッドの構文、動作、例について詳しく説明します。

以上がJavaのデフォルトメソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート