接口和抽象類區別實測

接口和抽象類

一、相同點:

都是上層的抽象、都不能被實例化、都能包含抽象方法。

二、不同點

1 接口

接口可以多繼承

public interface Parent extends A, B {
    
    // 成員的public都可省略

    //-----------------------------很久以前-----------------------------
    // 【變量】
    String NAME = "csq&hly";// public static final 省略了

    // 【抽象方法】,供重寫(必須重寫)
    void abstractMethod();// public abstract 省略了

    //-----------------------------JDK 1.8-----------------------------
    // 【靜態方法】,供通過接口直接調用
    static void staticMethod() {
        privateStaticMethod();
    }

    // 【默認方法】,供子類調用、重寫(可以不重寫)
    default void defaultMethod() {
        privateMethod();
        privateStaticMethod();
    }

    //-----------------------------JDK 1.9-----------------------------
    // 【私有方法】,增強默認方法
    private void privateMethod() {
    }

    // 【私有靜態方法】,增強默認方法、靜態方法
    private static void privateStaticMethod() {
    }


    //-----------------------------測試接口多繼承-----------------------------
/*
重寫接口中抽象方法【必須】,接口多繼承如果抽象方法有重名的,
實現類必須重寫一次(子接口中可不用重寫,重寫了變成默認方法)

重寫接口中默認方法【可選】,接口多繼承如果默認方法有重名的,子接口必須重寫一次
*/

//    @Override
//    default void abstractMethodAB() {
//    }

    @Override
    default void defaultMethodAB() {
    }
}

class Us implements Parent, A, B {

    @Override
    public void abstractMethod() {
        Parent.staticMethod();
        defaultMethod();
    }

//    @Override
//    public void defaultMethod() {
//
//    }

    @Override
    public void abstractMethodAB() {
    }

    public static void main(String[] args) {
        Parent.staticMethod();// 【靜態方法】,供通過接口直接調用
        new Us().defaultMethod();// 【默認方法】,供子類調用、重寫(可以不重寫)
    }
}

interface A {
    void abstractMethodAB();

    default void defaultMethodAB() {
    }
}

interface B {
    void abstractMethodAB();
    default void defaultMethodAB() {
    }
}

2 抽象類

單繼承,實現多個接口

(1) 抽象類不能創建對象,如果創建,編譯無法通過而報錯。只能創建其非抽象子類的對象。

理解:假設創建了抽象類的對象,調用抽象的方法,而抽象方法沒有具體的方法體,沒有意義。

(2) 抽象類中,可以有構造方法,是供子類創建對象時,初始化父類成員使用的。

理解:子類的構造方法中,有默認的super(),需要訪問父類構造方法。

public abstract class AbstractClass {  
    int score;  
    public AbstractClass(int score) {    
        this.score = score;  
    }
}

class Son1 extends AbstractClass{  
    public Son1() {    
        super(1);  
    } 
}

class c{  
    public static void main(String[] args) {    
        Son1 son1 = new Son1();    
        System.out.println(son1.score);  
    }
}

(3) 抽象類中,不一定包含抽象方法,但是有抽象方法的類必定是抽象類。

理解:未包含抽象方法的抽象類,目的就是不想讓調用者創建該類對象,通常用於某些特殊的類結構設計。

(4) 抽象類的子類,必須重寫抽象父類中所有的抽象方法,否則,編譯無法通過而報錯。除非該子類也是抽象類。

理解:假設不重寫所有抽象方法,則類中可能包含抽象方法。那麼創建對象後,調用抽象的方法,沒有意義。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章