抽象クラス メソッドのクラス定義が、不特定のコードが実行される場合、この方法は、抽象抽象メソッドで修飾された抽象メソッドです。この抽象メソッドは、実行することはできませんので、このクラスは抽象クラス(として宣言されなければならない抽象 クラス) 定義されたその抽象メソッドを実装するサブクラスを強制的に、それ自身が連続するためにのみ使用するように設計されて抽象クラス。このため、実際には同等で定義された抽象メソッド「標準」。 // 実行Personクラスが定義する抽象メソッド()、その後、実行をオーバーライドする必要があり()メソッド学生のサブクラスを実装する パブリック クラスメイン{ 公共 静的 ボイドメイン(文字列[]引数)を{ 人P = 新しい新しいスチューデント(); p.run(); } } 抽象 クラス人{ パブリック 抽象 ボイドRUN(); } クラスの学生人{延び @Overrideを 公共 のボイドの実行(){ システム。OUT .println(" Student.run " ;) } } 注:親クラスPersonのrun()メソッドは、実用的な意味ではない親クラスのrun()メソッドを削除することはできません。親クラスのrun()メソッドを削除し、失われた多型の特徴。 抽象指向プログラミング 我々は抽象クラスの人、ならびに特定の学生、教師のサブクラスを定義するとき、私たちはこのリファレンスは抽象クラスのメリットということで、Person型によって抽象クラスのサブクラスのインスタンスを具体的に参照しに行くことができ、私たちのメソッドの呼び出しは、特定のサブタイプはPerson型の変数との関係ではありません。 可能な基準レベルのこのタイプは、抽象指向プログラミングと呼ばれる実際のリファレンスサブタイプを、避けるために。 S人 = 新しい新しい学生(); 人T = 新しい新しい先生(); の個人的な理解:サブクラス上方遷移親クラス、サブクラスによって特定の実装が"以来、すべてをオーバーライドし、親クラスカスタム「標準」、一方、特定の実装サブクラスを気にすることなく規範の存在」、方法の特定のタイプのために正確に同じシグネチャ全体継承ツリーは、特定の操作で、父親への参照のみ、。 インターフェース 電源を再生することができる多型ように、すべてのサブクラスは、同じインタフェースを持っていることを確実にするために、所定のクラスの高レベルインタフェース、抽象クラスでは、抽象メソッドは、本質的にインタフェース仕様に定義されています。 :フィールドが抽象クラスでない場合は、すべてのメソッドは、すべての抽象メソッドであり、それは抽象クラスインターフェースのように書き換えることができるインタフェース。 抽象 クラスは、人{ パブリック 抽象 ボイドRUN(); パブリック 抽象文字列のgetName(); } // インターフェイスインターフェイスにプログラム インターフェース人{ ボイドRUN(); 文字列のgetName(); } インタフェースと呼ばれるが、また、抽象クラスよりも抽象的です純粋な抽象インタフェースは、偶数フィールドが存在しません。デフォルトはパブリック抽象的であるので、2つの修飾子を省略することができるため、インターフェイスで定義されたすべてのメソッド。 特定のクラスがインタフェースを実装する場合は、Javaでimplementsキーワードを使用する必要があり、クラスが唯一の別のクラスから継承することができ、あなたは複数のクラスから継承することはできません。しかし、クラスは複数のインターフェイスを実装することができます。 クラスの学生が実装人、こんにちは{ //は、2種類のインタフェースを実装 プライベート文字列に名前を付け、 公共学生(文字列名){ この .nameの= 名; } @Override 公共 ボイドRUN(){ システム。OUT .println(この .nameの+ " RUN " ;) } } という語 :区別の用語 のJavaインターフェース特にインターフェース定義は、インターフェイスタイプおよびメソッドのシグネチャのセットを表し、インターフェース仕様は、メソッドシグネチャ、データ形式、ネットワークプロトコルとしてプログラミング・インターフェースを指します。 抽象クラスインターフェースとの比較は、以下:
------------------------------------------ -------------------------------- 抽象 クラス インターフェース の継承は、クラスは複数のインターフェイスを実装のみを拡張することができます フィールドがインスタンスフィールドインスタンスフィールド定義しない定義することができる 抽象メソッドで定義された抽象メソッドが定義された抽象メソッドであってもよい デフォルト方式で定義される非抽象メソッド定義された非抽象メソッド
------------------- -------------------------------------------------- ------ インターフェイスは継承する インターフェイスが別のインターフェイスから継承することができます。使用して、インターフェイスから継承されたインタフェースは、インタフェースのメソッドを拡張することと等価である、延びています。 インタフェースハロー{ ボイドハロー(); } インターフェースハロー延び人{ ボイドRUN()と、 文字列のgetName(); } // 者インタフェースは現在ハローハローインターフェース方法を実施することができるされます。 └──────── ───────┘ ▲┌───────────────────┐ 合理的な理由継承デザインインターフェイスと抽象クラス、あなたは完全にコードを再利用することができます。一般的に、共通のロジックは、抽象クラスの各サブクラスで特定の論理、抽象インタフェース階層のレベルの代表に適合する。 定義されたJavaコレクションクラスのインタフェースと抽象クラスの特定のサブクラスのセット継承: ┌───────────────┐ ││反復処理可能なインタフェース ▲▲ │││オブジェクトの親 ┌───────────────┐└───────────────────┘ │コレクション▲│ └─ ──────────────┘│ ▲▲┌───────────────────┐ │└───────── ─│AbstractCollection│抽象クラス ┌───────────────┐└───────────────────┘ ││一覧▲ └─ ──────────────┘│ ▲┌───────────────────┐ └──────────│ │AbstractList └───────────────────┘ ││ ││ ┌────────────┐┌──────── ────┐ │││ArrayListをLinkedListの具象サブクラス│ └────────────┘└────────────┘ 使用中、インスタンス化されたオブジェクトは今まですることができ特定のサブクラスが、常に抽象クラスよりも抽象インタフェース(インタフェースのコールバック)として、それを参照することにより、インターフェイスを介して: リスト一覧 = 新しい新しいのArrayList(); // 特定のサブリストのインタフェースクラスを参照して、 コレクションcoll =一覧; // アップキャストCollectionインタフェース ITはコルを=反復処理可能; // アップキャストのIterableインタフェース 注:反復処理可能なインタフェースも具象サブクラスを呼び出すことができます。 デフォルトの方法 インタフェースでは、既定の方法で定義することができます。通常、サブクラスは、すべてのインターフェイスのメソッドをオーバーライドするインタフェースのニーズから継承しますが、デフォルトの方法は、あなたがすべての変更のサブクラスを持っていない、あなただけの上書き必要な新しいメソッドをオーバーライドする必要があります。 デフォルトの方法と抽象クラスの一般的な方法が異なっています。インタフェースがフィールドではありませんので、抽象クラスの一般的な方法は、インスタンスフィールドにアクセスすることができますが、デフォルトの方法では、フィールドにアクセスすることはできません。 パブリック クラスメイン{ パブリック 静的 ボイドメイン(文字列[]引数){ 人物P = 新しい生徒(「暁明」)。 p.run(); } } インタフェース人{ 文字列のgetName()。 デフォルトの ボイドの実行(){ システム。アウト .println(のgetName()+ " 実行" ); } } クラスの学生は、人{実装 プライベート文字列名を、 公共学生(文字列名){ この .nameの= 名前。 } 公共関連項目GetName文字列(){ 戻り 、この.nameのを; } // runメソッドを上書きすることなく }