目次
1. デフォルトインターフェースメソッド導入の背景
2. デフォルトのインターフェースメソッドの定義
2. ルール 1 が失敗した場合は、デフォルトを選択します。現在のクラスに最も近い特定の実装を持つメソッド
ホームページ Java &#&チュートリアル Java 8 の新機能: デフォルトのインターフェース・メソッド

Java 8 の新機能: デフォルトのインターフェース・メソッド

Feb 23, 2017 am 10:25 AM
java8 新機能

要約: Java8 以降、インターフェースはメソッドを宣言するだけの場所ではなく、メソッドを宣言するときにメソッドにデフォルトの実装を与えることもできます。これにより、メソッドを実装するすべてのサブクラスがそれをデフォルトのインターフェースメソッドと呼びます。インターフェースは、このメソッドのデフォルト実装を保持できます。

1. デフォルトインターフェースメソッド導入の背景

java8 は、Java のバージョン更新の反復プロセスの中で最も変更されたバージョンと見なすことができます (生き残るためには時代に遅れずについていくべきです)。しかしその後、何年にもわたる開発と反復を経て、Java のソース コードは巨大なものになりました。これほど膨大な量の作業を行うのは決して簡単ではありません。そのため、Java 8 のデフォルトのインターフェイス メソッドを初めて見たとき、最初に感じたのは、これは Java 設計者が埋める前に掘った穴ではないかということでした。

これまでの説明から、Java8 では List の

sort(Comparator<? super E> c)
ログイン後にコピー

メソッドなど、既存のインターフェースに多くのメソッドが追加されていることがわかりました。 Java 8 より前のインターフェースの設計思想に従っている場合、インターフェースにメソッド宣言を追加するとき、インターフェースを実装するクラスは、新しく追加されたメソッドに対応する実装を追加する必要があります。互換性を考慮すると、これはお勧めできません。したがって、これは落とし穴であり、新しい機能では、ケーキを食べたりするために、インターフェイスにいくつかの新しいメソッドを追加する必要があります。Java8 の設計者は、デフォルトのインターフェイス メソッドを提案しました。 。 の概念。

このように、デフォルトのインターフェースメソッドは、私たち一般の開発者にとってはまだまだ遠いところにあるAPI設計者向けに開発されているようですが、JDKを設計する必要はありませんが、それでもそう考える必要があります。日常の開発プロセスでは、他のビジネス パーティが呼び出すための API を提供する必要がありますが、API を更新するときに、互換性を維持しながら、デフォルトのメソッドを使用して、より高度な機能を提供できます。

2. デフォルトのインターフェースメソッドの定義

デフォルトのインターフェースメソッドの定義は非常に簡単で、次のようにインターフェースのメソッド定義の前に

default
ログイン後にコピー

キーワードを追加するだけです。このように、メソッドの後は、インターフェイスを実装するすべてのサブクラスが間接的にメソッドを保持します。あるいは、私と同じように、インターフェイスと抽象クラスはますます似てきていると感じるかもしれませんが、実際には、それらの間には次のような違いがあります:

1. クラスは 1 つのクラスのみを継承できますが、複数のインターフェイスを実装できます


2抽象クラスは変数を定義できますが、インターフェイスは定義できません。上で述べた問題を解決することに加えて、抽象化には次の利点もあります。これにより、サブクラスで無意味に実装することがなくなります (通常は new UnsupportedException() をスローします)

2. デフォルトのメソッドは、Java での多重継承の新しい方法を提供します (継承できるクラスは 1 つだけですが、複数のインターフェイスを実装できます)。 、インターフェイスでデフォルト メソッドを定義できるようになりました)


3. 競合とその解決策

クラスは複数のインターフェイスを実装できるため、クラスが複数のインターフェイスを実装する場合、これらのインターフェイスでデフォルト メソッドが 2 つ以上ある場合に競合が発生します。 Java8 では、競合を解決するために次の 3 つの原則を定義しています:

1. クラスまたは親クラスで明示的に宣言されたメソッドは、デフォルトのメソッドよりも優先されます

2. ルール 1 が失敗した場合は、デフォルトを選択します。現在のクラスに最も近い特定の実装を持つメソッド

3. ルール 2 も失敗する場合は、インターフェースを明示的に指定する必要があります
以下は、いくつかの例を通して説明します:

例 1


public interface A {
    /**
     * 默认方法定义
     */
    default void method() {
        System.out.println("This is a default method!");
    }
}
ログイン後にコピー

ここでは、インターフェースB は A よりも C に近く、ルール 2 に従って B のメソッドは特定のデフォルト実装であるため、ここで実際に呼び出されるのはインターフェイス B のデフォルトです。メソッド

例 2

public interface A {
    /**
     * 默认方法定义
     */
    default void method() {
        System.out.println("A&#39;s default method!");
    }
}
public interface B extends A {
    /**
     * 默认方法定义
     */
    default void method() {
        System.out.println("B&#39;s default method!");
    }
}
public class C implements A, B {
    public static void main(String[] args) {
        new C().method();
    }
}
// 输出:B&#39;s default method!
ログイン後にコピー

例 2 では、クラス D を追加します。元のインターフェイス A と B に基づいてインターフェイス A を実装します。次に、クラス C が D から継承し、A と B を実装します。C は D からより近く分離されていますが、D の特定の実装は A にあるため、B のデフォルト メソッドはそのままです。最も近いデフォルトの実装。ルール 2 に従って、B のデフォルト メソッドがここで実際に呼び出されます。


例 3

public class D implements A {
}
public class C extends D implements A, B {
    public static void main(String[] args) {
        new C().method();
    }
}
// 输出:B&#39;s default method!
ログイン後にコピー

例 3 では、インターフェイス B はインターフェイス A から継承しなくなり、この時点でデフォルト メソッド


// A接口不变
public interface B {
    /**
     * 默认方法定义
     */
    default void method() {
        System.out.println("B&#39;s default method!");
    }
}
public class C implements A, B {
    @Override
    public void method() {
        // 必须显式指定
        B.super.method();
    }
    public static void main(String[] args) {
        new C().method();
    }
}
ログイン後にコピー

が C で呼び出されます。インターフェイス A とインターフェイスの特定の実装から同じ距離にあります。 B. コンパイラはそれを判断できないため、エラーが報告されます。今回は明示的に指定する必要があります:
method()
ログイン後にコピー


上記は、Java8 の新機能、デフォルトのインターフェイス メソッドの内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。

-->


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホット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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Java 8で1年前または1年後の日付を計算するにはどうすればよいですか? Java 8で1年前または1年後の日付を計算するにはどうすればよいですか? Apr 26, 2023 am 09:22 AM

Java8 は、minus() メソッドを使用して 1 年前の日付または 1 年後の日付を計算し、1 年前の日付を計算します。 packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal.ChronoUnit;publicclassDemo09{publicstaticvoidmain(String[ ]args ){LocalDatetoday=LocalDate.now();LocalDateprevious Year=today.minus(1,ChronoUni

PHP 8.3 リリース: 新機能の概要 PHP 8.3 リリース: 新機能の概要 Nov 27, 2023 pm 12:52 PM

PHP8.3 リリース: 新機能の概要 テクノロジーが発展し、ニーズが変化するにつれて、プログラミング言語は常に更新され、改善されています。 Web 開発で広く使用されているスクリプト言語として、PHP は開発者により強力で効率的なツールを提供するために絶えず改良されてきました。最近リリースされた PHP 8.3 バージョンには、待望の新機能と改善点が多数含まれています。これらの新機能の概要を見てみましょう。 null 以外のプロパティの初期化 PHP の過去のバージョンでは、クラス プロパティに明示的に値が割り当てられていない場合、その値は

PHP8 の新機能を学び、最新テクノロジーを深く理解するためのガイド PHP8 の新機能を学び、最新テクノロジーを深く理解するためのガイド Dec 23, 2023 pm 01:16 PM

最新テクノロジーを習得するために役立つ、PHP8 の新機能の詳細な分析 PHP プログラミング言語は、時間の経過とともに常に進化し、改善されています。最近リリースされた PHP8 バージョンは、開発者に多くのエキサイティングな新機能と改善を提供し、開発作業にさらなる利便性と効率をもたらします。この記事では、PHP8 の新機能を詳しく分析し、これらの最新テクノロジーをよりよく習得するのに役立つ具体的なコード例を提供します。 JIT コンパイラー PHP8 では JIT (Just-In-Time) コンパイルが導入されています

Java 8を使用して1週間後の日付を計算するにはどうすればよいですか? Java 8を使用して1週間後の日付を計算するにはどうすればよいですか? Apr 21, 2023 pm 11:01 PM

Java8 で 1 週間後の日付を計算する方法 この例では、1 週間後の日付を計算します。 LocalDate 日付には時間情報が含まれません。その plus() メソッドは、日、週、月を追加するために使用されます。これらの時間単位は ChronoUnit クラスで宣言されます。 LocalDate も不変型なので、戻った後に変数を使用して値を割り当てる必要があります。 packagecom.shxt.demo02;importjava.time.LocalDate;importjava.time.temporal.ChronoUnit;publicclassDemo08{publicstaticvoidmain(String[

php8の新機能は何ですか php8の新機能は何ですか Sep 25, 2023 pm 01:34 PM

php8 の新機能には、JIT コンパイラ、型推論、名前付きパラメータ、共用体型、プロパティ、エラー処理の改善、非同期プログラミングのサポート、新しい標準ライブラリ関数、匿名クラス拡張機能が含まれます。詳細な紹介: 1. JIT コンパイラー、PHP8 は、重要なパフォーマンスの向上である JIT コンパイラーを導入します。JIT コンパイラーは、一部の高頻度の実行コードをリアルタイムでコンパイルおよび最適化できるため、実行速度が向上します。2. 型導出、PHP8型推論機能を導入し、開発者が変数宣言時などに変数の型を自動的に推測できるようにします。

Go 言語の新機能の解釈: プログラミングをより効率的にする Go 言語の新機能の解釈: プログラミングをより効率的にする Mar 10, 2024 pm 12:27 PM

【Go言語の新機能解説:プログラミングを効率化するには具体的なコード例が必要】 近年、ソフトウェア開発の分野でGo言語が注目を集めており、そのシンプルで効率的な設計思想がますます注目を集めています。開発者。 Go 言語は静的型付けプログラミング言語として、開発効率を向上させ、コード作成プロセスを簡素化するための新機能を導入し続けています。この記事では、Go 言語の最新機能を詳しく説明し、これらの新機能によってもたらされる利便性を具体的なコード例を通じて体験する方法について説明します。モジュール開発(GoModules) 1からのGo言語

CSS3 の新機能の概要: CSS3 を使用してトランジション効果を実現する方法 CSS3 の新機能の概要: CSS3 を使用してトランジション効果を実現する方法 Sep 09, 2023 am 11:27 AM

CSS3 の新機能の概要: CSS3 を使用してトランジション効果を実現する方法 CSS3 は CSS の最新バージョンですが、数多くの新機能の中で最も興味深く実用的なのはトランジション効果でしょう。トランジション効果は、インタラクション中にページをよりスムーズで美しくし、ユーザーに優れた視覚体験を提供します。この記事では、CSS3 トランジション効果の基本的な使用法を、対応するコード例とともに紹介します。 transition-property 属性: 遷移する必要がある CSS プロパティの遷移効果を指定します。

CSS3 の新機能の概要: CSS3 を使用して水平方向の中央揃えのレイアウトを実現する方法 CSS3 の新機能の概要: CSS3 を使用して水平方向の中央揃えのレイアウトを実現する方法 Sep 09, 2023 pm 04:09 PM

CSS3 の新機能の概要: CSS3 を使用して水平方向中央レイアウトを実現する方法 Web デザインとレイアウトでは、水平方向中央レイアウトが一般的な要件です。これまでは、これを実現するために複雑な JavaScript や CSS のトリックを使用することがよくありました。ただし、CSS3 では、水平方向中央揃えのレイアウトをよりシンプルかつ柔軟にするいくつかの新機能が導入されました。この記事では、CSS3 のいくつかの新機能を紹介し、CSS3 を使用して水平方向の中央揃えのレイアウトを実現する方法を示すコード例をいくつか示します。 1. フレックスボックスを使用してファイルをレイアウトする

See all articles