Java学習ロードインターフェース
概要概要
ご存知のように、私たちは両親の子供です。私たちは父の遺伝子と母の遺伝子の両方を継承しています。これは多重継承です。
ただし、Javaプログラムでは、多重継承はサポートされていません。Javaは単一継承のみをサポートします。しかし、インターフェースは多重継承を実装する可能性を提供します!
インターフェイス(英語:インターフェイス):JAVAプログラミング言語では、インターフェイスは抽象型であり、抽象メソッドのコレクションであり、通常interface
はインターフェイスが宣言されます。クラスは、インターフェイスを継承することにより、インターフェイスの抽象メソッドを継承します。
**インターフェースはクラスではないことを明確にする必要があります!インターフェイスとクラスは並んだ構造です!**インターフェイスの記述方法はクラスと非常に似ていますが、異なる概念に属しています。このクラスは、オブジェクトのプロパティとメソッドを記述します。インターフェイスには、クラスによって実装されるメソッドが含まれています。
インターフェイスを実装するクラスが抽象クラスでない限り、クラスはインターフェイス内のすべてのメソッドを定義する必要があります。
インターフェイスをインスタンス化することはできませんが、実装することはできます。インターフェイスを実装するクラスは、インターフェイスで説明されているすべてのメソッドを実装する必要があります。そうでない場合は、抽象クラスとして宣言する必要があります。さらに、Javaでは、インターフェイスタイプを使用して変数を宣言したり、nullポインタになったり、このインターフェイスによって実装されたオブジェクトにバインドしたりできます。
1.インターフェースの定義と実装
JDK7より前は、グローバル定数と抽象メソッドのみをインターフェイスで定義できます。JDK8以降は、グローバル定数と抽象メソッドに加えて、静的メソッド、デフォルトメソッドなどもインターフェイスで定義できます。
インターフェイスを実装するクラスは、インターフェイスのすべての抽象メソッドを実装する必要がありますが、静的メソッドとデフォルトメソッドを実装する必要はありません。インターフェイスの静的メソッドとデフォルトメソッドは、インターフェイスを介してのみ呼び出すことができます。
// 定义一个接口
interface Flyable {
// 全局常量
// 两种方式效果相同,一般书写时省略前面的 public static final
public static final int MAX_SPEED = 7900;
int MIN_SPEED = 0;
// 抽象方法
// 两种方式效果相同,一般书写时省略前面的 public abstract
public abstract void fly();
void stop();
}
class Bird implements Flyable {
@Override
public void fly() {
System.out.println("I can fly.");
}
@Override
public void stop() {
}
}
第二に、インターフェースの継承
クラス間の継承方法と同様に、1つのインターフェイスが別のインターフェイスを継承できます。インターフェイスの継承はextendsキーワードを使用し、子インターフェイスは親インターフェイスのメソッドを継承します。
実装されたクラスは、インスタンス化する前に、すべてのインターフェイス(インターフェイスによって継承されたインターフェイスを含む)を実装する必要があります。
単一継承
// 定义一个接口
interface Flyable {
public abstract void fly();
void stop();
}
// 继承一个接口
interface Bird extends Flyable {
void eatBug();
}
// 实现接口
class Sparrow implements Bird {
@Override
public void fly() {
}
@Override
public void stop() {
}
@Override
public void eatBug() {
}
}
多重継承
Javaでは、クラスの多重継承は違法ですが、インターフェースは多重継承を許可します。インターフェイスの多重継承では、extendsキーワードを1回だけ使用し、その後に継承されたインターフェイスを使用して多重継承を実現する必要があります。
インターフェイスの多重継承により、クラスの多重継承を実現できます。
// 定义一个接口
interface Flyable {
void fly();
}
interface Reproduction {
void breedingOffspring();
}
// 继承一个接口
interface Bird extends Flyable, Reproduction {
void eatBug();
}
// 实现接口
class Sparrow implements Bird {
@Override
public void fly() {
}
@Override
public void eatBug() {
}
@Override
public void breedingOffspring() {
}
}
3、マークインターフェイス
タグインターフェイスは、タグインターフェイス(タグインターフェイス)と呼ばれることもあります。つまり、インターフェイスにはメソッドが含まれていません。
例は、Javaでタグ付けされたインターフェースを簡単に見つけることができSerializable
ます。たとえば、JDKインターフェースはマーカーインターフェースです。
マークされたインターフェイスは、メソッドや属性のないインターフェイスです。他のコードがテストして何かを実行できるように、そのクラスが特定のタイプに属していることを示すだけです。
マーキングインターフェース機能:簡単に言えば、オブジェクトに特定の特権を持たせるために、オブジェクト(スタンプ)にマークを付けることです。
public interface Flyable {
}
第四に、インターフェースとクラスの比較
- インターフェイスを使用してオブジェクトをインスタンス化することはできません。オブジェクトはインスタンス化できます。
- インターフェイスにはコンストラクタがなく、クラスにはコンストラクタがあります
- インターフェイスのすべてのメソッドは抽象メソッドである必要があり、クラスのすべてのメソッドを抽象メソッドにすることはできません。
- 静的変数と最終変数を除いて、インターフェイスにメンバー変数を含めることはできません。クラスにはメンバー変数を含めることができます。
- インターフェイスはクラスに継承されませんが、クラスによって実装されます。
- インターフェイスは多重継承をサポートし、クラスは単一継承のみをサポートします。
5、インターフェイスのデフォルトメソッドの競合
最初にメソッドをインターフェイスのデフォルトメソッドとして定義し、次に同じメソッドをスーパークラスまたは別のインターフェイスで定義すると、あいまいエラーが発生します。
この問題を解決するために、Javaには次のルールがあります。
- **スーパークラスファースト:**スーパークラスが特定のメソッドを提供する場合、同じ名前と同じパラメーターを持つデフォルトのメソッドは無視されます。
- **インターフェースの競合:** 1つのインターフェースがデフォルトのメソッドを提供する場合、別のインターフェースが同じ名前と同じパラメータータイプのメソッドを提供します。競合を解決するには、実装クラスがこのメソッドをオーバーライドする必要があります。