抽象類和接口的異同、區別

Java中抽象類和接口的區別

抽象類和接口的定義
抽象類:關鍵字abstract修修飾的類稱爲抽象類,抽象類是一種沒有完全實現的類,它的主要用途是描述一些概念性的內容,然後在子類中具體去實現這些概念。
接口:接口是抽象類的一種變體,接口用關鍵字interface來定義。

抽象類和接口的區別
1、抽象類中的方法可以爲抽象的,也可以爲非抽象的,如果一個類包含抽象方法,則必須定義爲抽象類;而接口中的所有方法默認爲抽象的,接口中的所有數據都是共有靜態常量,即具有public、static、final屬性,但一般不寫這些修飾符。
2、抽象類中可以包含靜態方法,而接口中不可以包含靜態方法。
3、抽象類的子類如果被定義爲abstract類型的,那麼子類可以不實現抽象類中的方法;而接口的實現類如果被定義爲abstract類型的,也可以不實現接口中的方法。
4、一個類可以實現多個接口,但只能繼承一個抽象類。
5、接口的修飾符只能爲public或者abstract或者public abstract,不允許爲private或者protected之類的,否則不能被繼承或實現;而抽象類的修飾符只能爲public,否則不能被繼承。
6、接口只能繼承接口,而不能實現接口;抽象類只能實現接口而不能繼承接口。
7、抽象類可以包含構造方法,而接口不能包含構造方法。下面是關於抽象類可以包含構造方法的一個簡單例子:

abstract class Hello {
    int i;
    abstract void show();
    protected void show(int i) { 
        System.out.println("i=" + i);
    }

    public final void show1() { //抽象類可以包含靜態方法
        System.out.println("Beautiful World!");
    }

    //抽象類不帶參數的構造方法
    public Hello() {
        this.i = i;
    }
}

public class Pass extends Hello {
     public Pass() {
        super(); //訪問父類構造方法Hello()
    }

    void show() { //實現父類抽象方法show()
        System.out.println("Hello World!");
    }

    protected final void show(int i) { //重寫父類方法show(int i)
        System.out.println("i=" + i);
    }

    public static void main(String[] args) {
        /*聲明一個抽象類變量(抽象類的引用)指向繼承它的子類的對象*/
        Hello r = new Pass(); 
        r.show();
        r.show(10);
        r.show1();
    }
}

抽象類和接口的共同點
1、抽象類和接口都不能被定義爲私有的或final的,否則不能被繼承或實現。
2、抽象類和接口中的抽象方法都不能有方法體(接口中的全部方法都是abstract的,所以都不能有方法體)。
3、抽象類和接口都不可以直接實例化,但抽象類可以聲明一個變量(抽象類的引用)指向繼承了它的子類的對象;而接口可以聲明一個變量(接口的引用)指向它的實現類的對象。比如下面有關接口的一個簡單例子(抽象類也類似的道理):

interface A {
    abstract void show();
    abstract void show(int i);
}

class B implements A {
    int x;
    public void show() {
        System.out.println("x=" + x);
    }

    public void show(int i) {
        x = i;
        System.out.println("x=" + x);
    }
}

public class Test {
    A a = new B(); //聲明一個接口變量(接口A的引用)指向它的實現類B的對象
    a.show();
    a.show(8);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章