検索
ホームページJava&#&チュートリアルJava8のデフォルトメソッドの詳細な紹介

デフォルトの方法は何ですか?

Java 8 のリリース後、新しいメソッドをインターフェースに追加できますが、インターフェースはその実装クラスとの互換性を維持できます。開発するライブラリは複数の開発者によって広く使用される可能性があるため、これは重要です。 Java 8 より前では、クラス ライブラリでインターフェイスが公開された後、新しいメソッドがインターフェイスに追加された場合、このインターフェイスを実装したアプリケーションは、新しいバージョンのインターフェイスを使用するとクラッシュする危険がありました。

Java 8 ではそのような危険はありませんか?答えは否定的です。

デフォルトのメソッドをインターフェースに追加すると、特定の実装クラスが使用できなくなる可能性があります。

まず、デフォルトのメソッドの詳細を見てみましょう。

Java 8 では、インターフェイス内のメソッドを実装できます (Java 8 の静的メソッドもインターフェイス内に実装できますが、これは別のトピックです)。インターフェイスに実装されたメソッドはデフォルト メソッドと呼ばれ、修飾子としてキーワード default で識別されます。クラスがインターフェイスを実装する場合、そのインターフェイスにすでに実装されているメソッドを実装できますが、これは必須ではありません。このクラスはデフォルトのメソッドを継承します。これが、インターフェースが変更された場合に実装クラスを変更する必要がない理由です。

多重継承がある場合はどうなるでしょうか?

クラスが複数(2 つなど)のインターフェイスを実装し、これらのインターフェイスが同じデフォルト メソッドを持つ場合、事態は非常に複雑になります。クラスはどのデフォルト メソッドを継承しますか?どちらでもない!この場合、クラス自体 (直接、または継承ツリーの上位クラス) がデフォルト メソッドを実装する必要があります。

あるインターフェースがデフォルトメソッドを実装し、別のインターフェースがデフォルトメソッドを抽象として宣言する場合も同様です。 Java 8 は曖昧さを避け、厳密さを維持しようとします。メソッドが複数のインターフェイスで宣言されている場合、デフォルトの実装は継承されず、コンパイル時エラーが発生します。

ただし、クラスをコンパイルした場合、コンパイル時エラーは発生しません。この時点で、Java 8 には一貫性がありません。これには独自の理由があり、ここでは詳細に説明したり、深く議論したくありません (理由: バージョンがリリースされており、議論の時間が長すぎるため、このプラットフォームにはこれまでにないものがあります)。そのような議論)。

1. 2 つのインターフェイスと 1 つの実装クラスがあるとします。
2. インターフェースの 1 つはデフォルトのメソッド m() を実装します。
3. インターフェースと実装クラスを一緒にコンパイルします。
4. m() メソッドを含まないインターフェイスを変更し、m() メソッドを抽象として宣言します。
5. 変更したインターフェースを個別に再コンパイルします。
6. 実装クラスを実行します。

Java8のデフォルトメソッドの詳細な紹介

上記の場合、クラスは正常に実行できます。ただし、変更されたインターフェイスで再コンパイルすることはできませんが、古いインターフェイスでのコンパイルは引き続き実行できます。次に


1. 抽象メソッド m() を含むインターフェースを変更し、デフォルトの実装を作成します。
2. 変更したインターフェースをコンパイルします。
3. クラスを実行します: 失敗しました。
2 つのインターフェイスが同じメソッドのデフォルト実装を提供する場合、実装クラスもデフォルト メソッドを実装しない限り (直接、または継承ツリーの上位レベルのクラスによって)、このメソッドを呼び出すことはできません。

Java8のデフォルトメソッドの詳細な紹介

ただし、このクラスは互換性があります。新しいインターフェースを使用してロードでき、両方のインターフェースにデフォルト実装があるメソッドを呼び出さない限り、実行することもできます。


サンプルコード:

Java8のデフォルトメソッドの詳細な紹介

上記の例を示すために、C.java のテスト ディレクトリを作成し、その下に I1.java と I2.java を保存する 3 つのサブディレクトリがあります。テスト ディレクトリには、クラス C のソース コード C.java が含まれています。ベース ディレクトリには、コンパイルして実行できるインターフェイスのバージョンが含まれています。 I1 にはデフォルト実装の m() メソッドが含まれていますが、I2 にはメソッドが含まれていません。

実装クラスにはmainメソッドが含まれているので、テストで実行できます。コマンドラインパラメータがあるかどうかをチェックするので、m() を呼び出すテストと m() を呼び出さないテストを簡単に実行できます。

~/github/test$ cat C.java
public class C implements I1, I2 {
  public static void main(String[] args) {
    C c = new C();
    if(args.length == 0 ){
        c.m();
    }
  }
}
~/github/test$ cat base/I1.java
public interface I1 {
  default void m(){
    System.out.println("hello interface 1");
  }
}
~/github/test$ cat base/I2.java
public interface I2 {
}

次のコマンド ラインを使用してコンパイルして実行します。

~/github/test$ javac -cp .:base C.java
~/github/test$ java -cp .:base C
hello interface 1

互換ディレクトリには、抽象メソッド m() を含む I2 インターフェイスと、未変更の I1 インターフェイスが含まれています。

~/github/test$ cat compatible/I2.java
public interface I2 {
  void m();
}

これはクラス C のコンパイルには使用できません:

~/github/test$ javac -cp .:compatible C.java
C.java:1: error: C is not abstract and does not override abstract method m() in I2
public class C implements I1, I2 {
   ^
1 error

エラー メッセージは非常に正確です。前回のコンパイルで取得した C.class があるため、互換性のあるディレクトリでインターフェイスをコンパイルすると、実装クラスを実行できる 2 つのインターフェイスが引き続き得られます:

~/github/test$ javac compatible/I*.java
~/github/test$ java -cp .:compatible C
hello interface 1

間違って呼ばれる 3 番目のディレクトリには、I2 インターフェイスも含まれていますm() メソッドは次のように定義されています:

~/github/test$ cat wrong/I2.java
public interface I2 {
  default void m(){
    System.out.println("hello interface 2");
  }
}

我们应该不厌其烦的编译它。尽管m()方法被定义了两次,但是,实现类仍然可以运行,只要它没有调用那个定义了多次的方法,但是,只要我们调用m()方法,立即就会失败。这是我们使用的命令行参数:

~/github/test$ javac wrong/*.java
~/github/test$ java -cp .:wrong C
Exception in thread "main" java.lang.IncompatibleClassChangeError: Conflicting
default methods: I1.m I2.m
    at C.m(C.java)
    at C.main(C.java:5)
~/github/test$ java -cp .:wrong C x
~/github/test$

结论

当你把给接口添加了default实现的类库移植到Java 8环境下的时候,一般不会有问题。至少Java8类库开发者给集合类添加default方法的时候就是这么想的。使用你类库的应用程序仍然依赖没有default方法的Java7的类库。当使用和修改多个不同的类库的时候,有很小的几率会发生冲突。如何才能避免呢?

像以前那样设计你的类库。可能依赖default方法的时候不要掉以轻心。万不得已不要使用。明智的选择方法名,避免和其它接口产生冲突。我们将会学习到Java编程中如何使用这个特性做开发。

更多Java8のデフォルトメソッドの詳細な紹介相关文章请关注PHP中文网!

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Javaがクロスプラットフォームデスクトップアプリケーションを開発するための人気のある選択肢なのはなぜですか?Javaがクロスプラットフォームデスクトップアプリケーションを開発するための人気のある選択肢なのはなぜですか?Apr 25, 2025 am 12:23 AM

javaispopularforsoss-platformdesktopapplicationsduetoits "writeonce、runaynay" philosophy.1)itusesbytecodatiTatrunnanyjvm-adipplatform.2)ライブラリリケンディンガンドジャヴァフククレアティック - ルルクリス

Javaでプラットフォーム固有のコードを作成する必要がある場合がある状況について話し合います。Javaでプラットフォーム固有のコードを作成する必要がある場合がある状況について話し合います。Apr 25, 2025 am 12:22 AM

Javaでプラットフォーム固有のコードを作成する理由には、特定のオペレーティングシステム機能へのアクセス、特定のハードウェアとの対話、パフォーマンスの最適化が含まれます。 1)JNAまたはJNIを使​​用して、Windowsレジストリにアクセスします。 2)JNIを介してLinux固有のハードウェアドライバーと対話します。 3)金属を使用して、JNIを介してMacOSのゲームパフォーマンスを最適化します。それにもかかわらず、プラットフォーム固有のコードを書くことは、コードの移植性に影響を与え、複雑さを高め、パフォーマンスのオーバーヘッドとセキュリティのリスクをもたらす可能性があります。

プラットフォームの独立性に関連するJava開発の将来の傾向は何ですか?プラットフォームの独立性に関連するJava開発の将来の傾向は何ですか?Apr 25, 2025 am 12:12 AM

Javaは、クラウドネイティブアプリケーション、マルチプラットフォームの展開、および言語間の相互運用性を通じて、プラットフォームの独立性をさらに強化します。 1)クラウドネイティブアプリケーションは、GraalvmとQuarkusを使用してスタートアップ速度を向上させます。 2)Javaは、埋め込みデバイス、モバイルデバイス、量子コンピューターに拡張されます。 3)Graalvmを通じて、JavaはPythonやJavaScriptなどの言語とシームレスに統合して、言語間の相互運用性を高めます。

Javaの強力なタイピングは、プラットフォームの独立性にどのように貢献しますか?Javaの強力なタイピングは、プラットフォームの独立性にどのように貢献しますか?Apr 25, 2025 am 12:11 AM

Javaの強力なタイプ化されたシステムは、タイプの安全性、統一タイプの変換、多型を通じてプラットフォームの独立性を保証します。 1)タイプの安全性は、コンパイル時間でタイプチェックを実行して、ランタイムエラーを回避します。 2)統一された型変換ルールは、すべてのプラットフォームで一貫しています。 3)多型とインターフェイスメカニズムにより、コードはさまざまなプラットフォームで一貫して動作します。

Javaネイティブインターフェイス(JNI)がプラットフォームの独立性をどのように妥協できるかを説明します。Javaネイティブインターフェイス(JNI)がプラットフォームの独立性をどのように妥協できるかを説明します。Apr 25, 2025 am 12:07 AM

JNIはJavaのプラットフォームの独立を破壊します。 1)JNIは特定のプラットフォームにローカルライブラリを必要とします。2)ローカルコードをターゲットプラットフォームにコンパイルおよびリンクする必要があります。3)異なるバージョンのオペレーティングシステムまたはJVMは、異なるローカルライブラリバージョンを必要とする場合があります。

Javaのプラットフォームの独立性を脅かしたり強化したりする新しいテクノロジーはありますか?Javaのプラットフォームの独立性を脅かしたり強化したりする新しいテクノロジーはありますか?Apr 24, 2025 am 12:11 AM

新しいテクノロジーは、両方の脅威をもたらし、Javaのプラットフォームの独立性を高めます。 1)Dockerなどのクラウドコンピューティングとコンテナ化テクノロジーは、Javaのプラットフォームの独立性を強化しますが、さまざまなクラウド環境に適応するために最適化する必要があります。 2)WebAssemblyは、Graalvmを介してJavaコードをコンパイルし、プラットフォームの独立性を拡張しますが、パフォーマンスのために他の言語と競合する必要があります。

JVMのさまざまな実装は何ですか、そしてそれらはすべて同じレベルのプラットフォームの独立性を提供しますか?JVMのさまざまな実装は何ですか、そしてそれらはすべて同じレベルのプラットフォームの独立性を提供しますか?Apr 24, 2025 am 12:10 AM

JVMの実装が異なると、プラットフォームの独立性が得られますが、パフォーマンスはわずかに異なります。 1。OracleHotspotとOpenJDKJVMは、プラットフォームの独立性で同様に機能しますが、OpenJDKは追加の構成が必要になる場合があります。 2。IBMJ9JVMは、特定のオペレーティングシステムで最適化を実行します。 3. Graalvmは複数の言語をサポートし、追加の構成が必要です。 4。AzulzingJVMには、特定のプラットフォーム調整が必要です。

プラットフォームの独立性は、開発コストと時間をどのように削減しますか?プラットフォームの独立性は、開発コストと時間をどのように削減しますか?Apr 24, 2025 am 12:08 AM

プラットフォームの独立性により、開発コストが削減され、複数のオペレーティングシステムで同じコードセットを実行することで開発時間を短縮します。具体的には、次のように表示されます。1。開発時間を短縮すると、1セットのコードのみが必要です。 2。メンテナンスコストを削減し、テストプロセスを統合します。 3.展開プロセスを簡素化するための迅速な反復とチームコラボレーション。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター