抽象類abstract與接口interface區別代碼實戰演示——觀止

請自己閱讀以下代碼,每個修飾符我都仔細斟酌寫上去的,都很有考究。

筆者爲了寫好這篇文章,查閱了很多相關資料,以求總結地準確和全面,花了很多工夫,希望大家珍惜。

把這些代碼讀懂了,抽象類與接口的區別你就過關了。

你能通過這些代碼很直觀地總結出所有抽象類和接口的性質及區別,面試這個知識點基本逃不過下面的代碼。

爲什麼我只放代碼,不直接寫出結論讓大家直接觀閱呢?

因爲你直接看結論,記不住!!!過兩天你就忘記了。這東西本來沒可遵循的規律,記憶點還多,如果你不懂底層源碼那忘記更快。

你可以對着我親自實驗的代碼,自己總結規律。

最好的辦法,是把這些代碼拿走,自己動手實驗,再總結,這樣印象更深刻。

建議收藏本文以便時不時實踐、複習一下。

等你熟悉到一定程度,只需瀏覽、對比一下代碼就能迅速想起來所有的區別點。

以下所有測試基於jdk1.8

抽象類: 

//抽象類不能用final、private、static修飾
public abstract  class TestAbstract {
    //可以有有參和無參構造器,但必須有方法體
    public TestAbstract() {

    }
    public TestAbstract(String s,int d){
        this.s = s;
        this.d = d;
    }
    public String s;//成員屬性不可定義爲abstract
    private int d;//可爲private
    private  static int ds;//靜態屬性可不初始化
    private final static int q = 0;//final修飾必須初始化
    //可以有靜態塊
    static {
//        public int d;//不能爲public
//        private String as;//不能爲private
//        protected int b;//不能爲protected
//        static int d = 0;//不能爲static
        int a;//可不初始化
    }

    //private修飾時只能帶方法體,不能轉爲抽象方法,即abstract不能與private、static、final共存
    private String abs() {
        return null;
    }
//    public String abp() ;//public修飾時要麼抽象方法要麼有方法體

    //    private abstract String pa();//不能是私有抽象方法
    //抽象方法必無方法體,且可沒有抽象方法,abstract不能與private、default、static、final共存
    protected abstract  String pa();
    //static 不能與abstract、default共存,且必帶方法體
    private static String pas() {
        return null;
    }
    //可以final修飾
    private final static String psv() {
        return null;
    }
//不能有default修飾的方法
    /*default String hu() {
        return null;
    }*/

    //final不能與default共存
    private final int f() {
        return 0;
    }
    //內部抽象類可以用static、private修飾,但是不能用final修飾,抽象類可實現接口,不能繼承抽象類TestAbstract
    private abstract  static class innerAbs implements testInterface {

    }
    //抽象類內部可定義接口,接口可繼承接口(不可實現implements),不可繼承抽象類TestAbstract
    private static interface innerAbsI extends testInterface {

    }
}

接口

//接口不能使用private、static、final修飾
public interface  testInterface {
    //    public testInterface();//無參構造器不被允許
//    public testInterface(String ww);//有參構造器不被允許
    int dig=0;
    public final static String s = null;//不可爲private、protected且成員變量必須初始化,但可以是public和缺省符
    static final String  sw=null;
    final String ww = null;//final可有可無,但變量必須賦值
    //    private static String ss = new String();//不能爲private
    //不允許靜態塊
    /*static {
        String s = "";
    }*/

    //public abstract  int a ;//不允許爲抽象屬性
    abstract String asb();//可有抽象方法,且不能有方法體,abstract不能與private、protected、default、static、final共存

    //靜態方法必須有方法體,static不能與default、private、protected、abstract、final共存
     static String qq() {
        return null;
    }

    //    public String d(){};//無static就不能有方法體
    int dd();

    //default修飾必須要有方法體,default不可與abstract、static、final共存
    default int d() {
        return 0;
    }
//    private String df();//方法不能是private和protected的
//    public static final  t(){};//方法中final不能與static共存
//接口內部抽象類不能被private、final修飾,不能繼承抽象類TestAbstract
    abstract static class innerIAbs implements testInterface {

    }
//內部接口不能被private、final修飾,接口可繼承接口,但不可實現implements接口,不能繼承抽象類,
     static  interface innerI extends testInterface {

    }
}

外部測試抽象類:

//如果TestAbstract類的構造是私有的,抽象類則不能繼承,此處可繼承抽象類(也可繼承實體類)、可實現接口
public abstract class testAbs extends TestAbstract implements testInterface{
}

外部測試接口:

//外部接口還是隻能繼承接口不能實現,不能繼承抽象類和實體類
public interface testInt extends testInterface {
}

 

參考(下面兩篇文章中總結的有錯誤,以我代碼試驗爲準):

https://blog.csdn.net/m0_38105216/article/details/85067156

https://blog.csdn.net/qq_44543508/article/details/102609910

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