05.Javaの基礎 - インターフェース

黄舟
リリース: 2017-02-27 10:21:56
オリジナル
1739 人が閲覧しました

基本概念

インターフェース(interface)とは、ソフトウェア工学において、一般に他者から呼び出されるメソッドや関数を指します。抽象的な概念をさらに一歩進めます。

Javaでは、キーワードinterfaceを通じてインターフェースを定義し、キーワードimplementsを通じてインターフェースを実装します。

インターフェイスは抽象クラスよりも抽象的なため、非常に抽象的なクラスとして理解できます。


サンプルスタディ

例を通してインターフェースの特徴を見てみましょう:

  • インターフェースを定義する

// 1.接口,访问权限只能是 默认(包访问权限)或 publicpublic interface Parent {

    // 2.成员变量,准确来说应该叫常量。具有以下特点:

    // 2.1.访问权限只能是 public (缺省也代表 public) ,修饰符只能是 final & static
    public final static String WORD = "a";    // 2.2.即使不指定,默认也是被 public fainl static 修饰
    String NAME = "b";    // 2.3.不能存在空的 final 变量 ,如 int num; 但是可以被非常量表达式初始化
    int num = new Random().nextInt(100);    // 3.抽象方法,访问权限只能是 默认(包访问权限)或 public
    public abstract void print();    abstract void print(int i);    // 4.普通方法,访问权限只能是 默认(包访问权限)或 public
    public void play();    void play(int i);
}
ログイン後にコピー
  • インターフェースを実装する

public class Son implements Parent {
    @Override
    public void print() {
        System.out.println("I am Son");
    }    @Override
    public void play() {
        System.out.println("Son is playing");
    }
}
ログイン後にコピー

ネストされたインターフェイス

ネストされたインターフェイスには 2 つの形式があります:

  • クラス内でインターフェイスを定義する;

  • インターフェイス内でインターフェイスを定義する。


1. クラスでインターフェースを定義します

インターフェースはクラス内でネストされており、次の特徴があります:

  • インターフェースのアクセス権は制限されず、プライベートを使用して変更できます

  • メソッド/抽象メソッド/変数のアクセス権は外部インターフェースと一致しています

以下は例を通して検証されます:

public class Demo {
    // 内部接口
    private interface A {
        void f();
    }    // 内部类
    class AImpl implements A {        @Override
        public void f() {
            System.out.println("AImpl.f()");
        }
    }

    A getA(){        return new AImpl();
    }    private A a;    public void receive(A a){        this.a = a;
        a.f();
    }
}
ログイン後にコピー

その呼び出しプロセスを見てみましょう:

Demo demo = new Demo();// 错误,因为 A 是私有接口,不可被外部访问
// Demo.A a = demo.getA();  // 因为 A 接口不可视,所以只能通过内部类来访问
Demo.AImpl a = (Demo.AImpl) demo.getA();a.f();// 或者是这样
demo.receiveA(demo.getA());
ログイン後にコピー

2.インターフェース内のインターフェース

インターフェース内のインターフェースを定義します。呼び出しを除いて、それらは通常のインターフェースと同じです。

public interface Demo {
    // 内部接口
    interface A {        void play();
    }    void print();
}public class DemoImpl implements Demo,Demo.A{

    @Override
    public void play() {
        System.out.println("DemoImpl.play()");
    }    @Override
    public void print() {
        System.out.println("DemoImpl.print()");
    }

}public class Test{
    public static void main(String[] args) {        // 向上转型,只能调用 print()
        Demo demo  = new DemoImpl();        // 向上转型,只能调用 play() 
        Demo.A a = new DemoImpl();      
    }
}
ログイン後にコピー

インターフェースと抽象クラス

上で述べたように、インターフェースは抽象クラスよりも抽象的なため、非常に抽象的なクラスとして理解できます。

実際の応用では、両者の間にはまだ違いがあります。


1. 構文の違い

  • 抽象クラスには非抽象メソッドを含めることができますが、インターフェイスには抽象メソッドのみが存在できます。

  • 抽象クラスのメンバー変数はさまざまな型にすることができますが、インターフェイスのメンバー変数は public static constants(public static Final) のみにすることができます。

  • 抽象クラスには静的コード ブロックと静的メソッドを含めることができますが、インターフェイスには静的コード ブロックと静的メソッドを含めることはできません。

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


2. 違いを利用する

抽象クラスは全体 (プロパティ、動作) を抽象化したものですが、インターフェイスは一部 (動作) を抽象化したものです。

簡単な例を挙げると、飛行機と鳥は異なる種類のものですが、共通点は 1 つあります。それは、飛行できるということです。

デザインする際、飛行機は飛行機風に、鳥は鳥風にデザインできます。

しかし、飛行の特徴はクラスとして設計することができないので、それは単なる行動の特徴であり、物事のクラスの抽象的な記述ではありません。

この時点で、Flight はメソッド fly() を含む Fly インターフェイスとして設計でき、Airplane と Bird はそれぞれ独自のニーズに応じて Fly インターフェイスを実装します。

その後、戦闘機や民間航空機などのさまざまな種類の航空機については、Airplane クラスを直接継承できます。同様に、さまざまな種類の鳥も Bird クラスを直接継承できます。

ここから、継承は「ある」関係であるのに対し、インターフェース実装は「ある」関係であることがわかります。

クラスが抽象クラスを継承する場合、サブクラスは抽象クラスの型である必要があり、インターフェイスの実装は、鳥が飛べるかどうか(または飛ぶ性質があるかどうかなど)の有無に関係します。 , 飛べるならこのインターフェースを実装できます、飛べないならこのインターフェースは実装できません。

上記は 05.Java Basics - Interface の内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!