Javaの抽象クラスとインタフェースのいくつかの違い

3555 ワード

一、抽象類
(1)抽象クラスはクラス名の前にキーワードabstract宣言を使用し,以下のようにする.
public abstract class AbstractMammal{}

(2)抽象クラスには抽象的な方法がなくてもよいが,以下のようにする.
package main.abstractclass;

/**
 * Created by leboop on 2018/11/17.
 *             
 */
public abstract class AbstractMammal {
    void eat() {
        System.out.println(" ");
    }
}

(3)抽象クラスの変数とメソッドはprivate/protected/public/final/staticキーワード修飾を使用するか、デフォルトで次のようにすることができます.
package main.abstractclass;

/**
 * Created by leboop on 2018/11/17.
 *             
 */
public abstract class AbstractMammal {
    //private  ,       
    private int a;
    //  ,      
    int b;
    //protected  ,           
    protected int c;
    //public  ,     
    public int d;
    //static,   
    static int e;
    //final,     ,      
    final int f = 0;

    //     /  (      ),      
    private void a() {
        System.out.println("a");
    }

    //      /  /  
    protected void b() {
        System.out.println("b");
    }

    //      /  /  
    void c() {
        System.out.println("c");
    }

    //      /  /  
    public void d() {
        System.out.println("d");
    }
    //      /  /  
    static void e() {
        System.out.println("e");
    }
    //      ,    ,    
    final void f() {
        System.out.println("f");
    }
}

(4)抽象クラスには、以下のように構築方法(デフォルトまたはカスタム)があります.
package main.abstractclass;

/**
 * Created by leboop on 2018/11/17.
 *             
 */
public abstract class AbstractMammal {
    //      ,  
   AbstractMammal(){}
   //      
   AbstractMammal(String name){
       System.out.println(name);
   }
}


package main.abstractclass;

/**
 * Created by leboop on 2018/11/17.
 */
public class Test {
    public static void main(String[] args) {
        AbstractMammal abstractMammal=new AbstractMammal() {
        };
        AbstractMammal mammal=new AbstractMammal("  ") {
        };
    }
}

(5)抽象クラスにおけるメソッドはメソッド体がなくてもよい(メソッド体は一対の括弧を指す)が、abstract修飾(抽象メソッドと呼ばれる)を使用しなければならない.抽象メソッドはprivate修飾(サブクラスでは実現できない)を使用してはならない.以下のようにする. 
package main.abstractclass;

/**
 * Created by leboop on 2018/11/17.
 *             
 */
public abstract class AbstractMammal {
   abstract void eat();
}

(6)クラスが抽象クラスに継承されている場合、そのクラスは抽象クラスの抽象メソッドを実現しなければならない.抽象メソッドが実装されていない場合は、クラスもabstractクラスとして定義する必要があります.
 
二、インタフェース
(1)インタフェースはインタフェース名の前にinterfaceキーワード修飾を用い,以下のようにする.
package main.abstractclass;

/**
 * Created by leboop on 2018/11/17.
 */
public interface Animal {
}

(2)インタフェースのメソッドはすべてpublic(キーワードは通常省略)であり、インタフェースのメソッドはメソッド体(この場合public abstract)がなくてもよいし、具体的な実装があってもよい.具体的な実装方法はdefaultキーワード修飾(JDK 1.8導入)を使用しなければならないが、以下のようにする.
package main.abstractclass;

/**
 * Created by leboop on 2018/11/17.
 */
public interface Animal {
    void walk(); //public

    default void eat() {//JDK1.8          ,    default   ,   public
        System.out.println(" ");
    }
}

(3)インタフェースで定義された変数はpublic static finalであり、初期化が必要であり、実装クラスは変更できない.以下のようにする.
package main.abstractclass;

/**
 * Created by leboop on 2018/11/17.
 */
public interface Animal {
    int a = 0;  //final static,     ,       
}

(4)インタフェースに構造方法があってはならない
 
三、両者の区別
以上、一部の違いを示しましたが、以下の点が異なります.
(1)1つのクラスは1つの抽象クラスしか継承できないが,1つのクラスは複数のインタフェースを実現できる.
(2)サブクラスはextendsを使用して抽象クラスを継承し、1つのクラスはimplementsを使用してインタフェースを実現する