一、面接準備--インタフェースと抽象クラスの違い


オブジェクト向けプログラミングにとって抽象はその大きな特徴の一つである.Javaでは,OOPの抽象:インタフェースと抽象クラスの2つの形式で表現できる.
まず、両者の定義を見てみましょう.
1、抽象クラス
抽象クラスは、サブクラスの汎用特性をキャプチャするために使用されます.インスタンス化できず、サブクラスのスーパークラスとしてのみ使用できます.抽象クラスは、継承レベルのサブクラスを作成するために使用されるテンプレートです.
[public] abstract class ClassName {
    abstract void fun();
}

1)抽象メソッドはpublicまたはprotectedでなければなりません(privateの場合、クラスに継承されず、サブクラスでは実現できません).デフォルトではpublicがデフォルトです.
2)抽象クラスはオブジェクトの作成に使用できません.
3)クラスが抽象クラスに継承されている場合、子クラスは親クラスの抽象メソッドを実装する必要があります.サブクラスが親クラスの抽象メソッドを実装していない場合は、サブクラスもabstractクラスとして定義する必要があります.
 
2、インタフェース
インタフェースは抽象メソッドの集合である.クラスがインタフェースを実装すると、そのインタフェースの抽象的な方法が継承されます.これは契約モードのようなもので,このインタフェースが実現されると,これらの方法の使用を確保しなければならない.インタフェースはただの形式で、インタフェース自体は何もできません.
[public] interface InterfaceName {
  abstract void fun();
}
 

 
インタフェースには変数とメソッドが含まれます.ただし、インタフェース内の変数はpublic static final変数として暗黙的に指定され(かつpublic static final定数のみであり、変数属性がなくprivate修飾でコンパイルエラーが報告される)、すべての抽象メソッド(修飾語を付けないメソッド)はpublic abstractメソッドと暗黙的に指定され、public abstractメソッドのみであり、public abstractメソッドのみである(private、protected、static、finalなどの他のキーワードでコンパイルエラーが報告されます)、インタフェースのメンバーメソッドは抽象的なメソッドでなければなりません.つまり、すべてのメソッドはメソッド名のみで、メソッドはありません.ただし、インタフェースにはメソッドを持つクラスメソッドもあります.たとえば、
public interface InterfaceTest {
    static void test(){//    ,       public  
        System.out.println("hello world");
    }

    static void hello();//   ,       static  
}

 
抽象メソッド
抽象メソッドは特殊なメソッドです.宣言のみで、具体的な実装はありません.一般的には、メソッド名のみで、メソッド体はありません.抽象メソッドはabstractキーワードで修飾する必要があります.クラスに抽象メソッドが含まれている場合は、このクラスを抽出クラスと呼び、抽象クラスはクラスの前にabstractキーワードで修飾する必要があります.
--』抽象的な方法があるのは抽象的なクラスに違いないが、抽象的なクラスには抽象的な方法があるとは限らない.抽象的なクラスには非抽象的な方法がある.
 
抽象クラスとインタフェースの比較
パラメータ
抽象クラス
インタフェース
デフォルトのメソッド実装
デフォルトの方法で実現できます
インタフェースは完全に抽象的です.メソッドの実装は存在しません.
インプリメンテーション
サブクラスはextendsキーワードを使用して抽象クラスを継承します.サブクラスが抽象クラスでない場合は、抽象クラス内のすべての宣言方法の実装を提供する必要があります.
サブクラスはキーワードimplementsを使用してインタフェースを実装します.インタフェース内のすべての宣言方法の実装を提供する必要があります.
コンストラクタ
抽象クラスにはコンストラクタはありますが、newインスタンス化はできません.
インタフェースにコンストラクタは使用できません
インスタンス化
インスタンス化できません
インスタンス化できません
アクセス修飾子
抽象メソッドにはpublic、protected、defaultなどの修飾子(抽象メソッドはクラスに上書きされるためprivateできません.privateで宣言すると、サブクラスは上書きできません)があります.ただし、メンバーメソッド(抽象メソッドではありません)とメンバー属性はprivateであってもよい.
インタフェースメンバーメソッド(正方法体なし)デフォルト修飾子はpublic abstractです.クラスメソッド(メソッド体あり)デフォルト修飾子はpublicです.プロパティのデフォルト修飾子はpublic static finalです.
mainメソッド
抽象的なメソッドにはmainメソッドがあり、実行できます.
インタフェースにはmainメソッドがないので、実行できません.
マルチ継承
抽象クラスは1つのクラスを継承できます.1つのクラスは複数のインタフェースを実現できます.
1つのインタフェースが複数のインタフェースを継承
スピード
インタフェースよりも高速です
インタフェースは、クラスで実装する方法を探すのに時間がかかるため、少し遅いです.
新しいメソッドの追加
抽象クラスに新しいメソッドを追加すると、デフォルトの実装を提供できます.そのため、現在のコードを変更する必要はありません.
インタフェースにメソッドを追加する場合は、インタフェースを実装するクラスを変更する必要があります.
静的プロパティ
抽象クラスには、静的コードブロックと静的メソッドがあります.
インタフェースに静的コードブロックを含めることはできませんが、静的メソッドがあります.
抽象クラスはfinalで宣言できません.抽象クラスにはサブクラスが必要ですが、finalで定義されたクラスにはサブクラスがありません.final定義を補充する方法はクラスの方法で書き換えることはできません.