【java基礎】-- java接口和抽象類的異同分析

  • 在java中,一般初學者搞不懂接口與抽象類,這也是面試比較容易問到的一個問題。下面我來談談本身的理解。若有不妥之處,還望批評指正,不勝感激。

1.抽象類怎麼定義和繼承?

咱們定義一個抽象類person.class表示類(人):java

//使用關鍵字abstract
public abstract class person {
    //吃東西的抽象方法,已經有所實現
    public void eat(){
        System.out.println("我是抽象方法吃東西");
    }
    
    //public 修飾的空實現的方法
    public void run(){}
    
    //無修飾,空實現
    void walk(){}
    
    //protected修飾的方法,空實現
    protected void sleep(){}
    
    //private修飾的空實現方法
    private void read(){}
}
  • 1.抽象類使用abstract修飾,能夠有抽象方法,也能夠徹底沒有抽象方法,也能夠是實現了的方法,可是全部的方法必須實現,空實現(public void walk(){})也是實現的一種,而不能寫 public void eat(),後面必須帶大括號。
  • 2.方法修飾符可使public,protected,private,或者是沒有,沒有默認爲只能在同一個包下面繼承,若是是private那麼子類繼承的時候就沒法繼承這個方法,也沒有辦法進行修改.
  • 下面咱們來寫一個Teacher.class繼承抽象類

同一個包下繼承:
面試

不一樣的包下面繼承:
ide

同個包下正確的代碼以下(不重寫私有的方法):學習

public class teacher extends person {
    @Override
    public void run(){
        System.out.println("我是實體類的方法跑步");
    }
    @Override
    void walk(){
        System.out.println("我是實體類的方法走路");
    }
    @Override
    protected void sleep(){
        System.out.println("我是實體類的方法睡覺");
    }
}
  • 結果以下(沒有覆蓋抽象類吃東西的方法,因此會調用抽象類默認的):

  • 下面代碼是重寫了eat()方法的代碼,重寫是即便沒有使用@Override也是起做用的:
public class teacher extends person {
    public void eat(){
        System.out.println("我是實體類的方法吃東西");
    }
    @Override
    public void run(){
        System.out.println("我是實體類的方法跑步");
    }
    @Override
    void walk(){
        System.out.println("我是實體類的方法走路");
    }
    @Override
    protected void sleep(){
        System.out.println("我是實體類的方法睡覺");
    }
}
  • 結果以下,吃東西的方法被覆蓋掉了:
    測試

  • 抽象類不能被實例化,好比:
    設計

  • 子類能夠實現抽象類的方法,也能夠不實現,也能夠只實現一部分,這樣跑起來都是沒有問題的,不實現的話,調用是默認使用抽象類的空實現,也就是什麼都沒有輸出,要是抽象類有實現,那麼會輸出抽象類默認方法。
    好比:3d

  • 抽象類中能夠有具體的方法以及屬性(成員變量)
  • 抽象類和普通類之間有不少相同的地方,好比他們均可以都靜態成員與靜態代碼塊等等。

2.接口怎麼定義和實現?

  • 接口就是對方法或者動做的抽象,好比person.class想要成爲教師,能夠實現教師的接口,能夠理解爲增長能力。
  • 接口不容許定義沒有初始化的屬性變量,能夠定義public static final int i=5;,以及public int number =0;,但不容許public int num;這樣定義,全部private的變量都不容許出現,下面是圖片

定義public int number =0;默認是final修飾的,因此也不能改變它的值:
code

下面是正確的接口代碼:Teacher.java對象

public interface Teacher {
    public static final int i=5;
    public int number =0;
    public void teach();
    void study();
}
  • 實現類TeacherClass.java
public class TeacherClass implements Teacher{
    @Override
    public void teach() {
        System.out.println("我是一名老師,我要教書");
        System.out.println("接口的static int是:"+i);
    }

    @Override
    public void study() {
        System.out.println("我是一名老師,我也要學習");
        System.out.println("接口的int number是:"+number);
    }
}
  • 測試類Test.java
public class Test {
    public static void main(String[] args){
        TeacherClass teacherClass = new TeacherClass();
        teacherClass.study();
        teacherClass.teach();
        System.out.println("-----------------------------------------------------");
        Teacher teacher =teacherClass;
        teacher.study();
        teacher.teach();
    }
}

結果:
blog

分析:接口裏面所定義的成員變量都是final的,不可變的,實現接口必須實現接口裏面全部的方法,不能只實現一部分,沒有使用static final修飾的,默認也是final,同時必須有初始化的值,接口不能直接建立對象,好比Teacher teacher = new Teacher() ,可是能夠先建立一個接口的實現類,而後再賦值於接口對象。

3.總結與對比

抽象類 接口
使用關鍵字abstract修飾 使用關鍵字interface
使用關鍵字extends實現繼承,能夠只實現一部分方法,一部分不實現,或者不實現也能夠 implements來實現接口,實現接口必須實現裏面都有的方法
抽象類裏面的方法能夠是空實現,能夠默認實現,可是必需要帶{} 接口裏面的方法都沒有實現體,也就是{}
抽象類中能夠有具體的方法以及屬性,也能夠有靜態代碼塊,靜態成員變量 接口裏面不能有普通成員變量,必須都是不可變的final成員變量,並且全部的成員變量都必須是public
抽象類裏面的方法能夠是public,protect,private,可是private沒法繼承,因此不多人會這麼寫,若是沒有修飾符,那麼只能是同一個包下面的類才能繼承 接口的方法只能是public或者無修飾符,全部的private修飾都是會報錯的
若是有改動,添加新的方法,能夠直接在抽象類中實現默認的便可,也能夠在實現類中實現 接口增長新方法必須在接口中聲明,而後在實現類中進行實現
抽象類不能直接建立對象 接口也不能直接建立對象 ,能夠賦予實現類的對象
抽象類能夠有main方法,並且咱們能夠直接運行,抽象類也能夠有構造器 接口不能有main方法,接口不能有構造器

那麼咱們何時使用接口何時使用抽象類呢?

  • java有一個缺點,只能實現單繼承,我的以爲接口是爲了彌補單繼承而設計的。
  • 接口是對本質的抽象,好比人,能夠設計爲person.class這個抽象類,提供相關的方法,屬性,可是接口是隻提供方法的,也就是像增長功能的,那麼也就是對方法的抽象。
  • 若是須要默認實現,或者基本功能不斷改變,那麼建議使用抽象類,若是隻是增長一種方法,那麼建議使用接口,若是想實現多重繼承,只能是接口與抽象類一塊兒使用以達到想要實現的功能。

本文章是初學時的記錄,僅是初級的對比,深刻學習還需各位保持Keep going~

此文章僅表明本身(本菜鳥)學習積累記錄,或者學習筆記,若有侵權,請聯繫做者刪除。人無完人,文章也同樣,文筆稚嫩,在下不才,勿噴,若是有錯誤之處,還望指出,感激涕零~

技術之路不在一時,山高水長,縱使緩慢,馳而不息。Keep going~

公衆號:秦懷雜貨店

相關文章
相關標籤/搜索