- 在java中,一般初學者搞不懂接口與抽象類,這也是面試比較容易問到的一個問題。下面我來談談本身的理解。若有不妥之處,還望批評指正,不勝感激。
咱們定義一個抽象類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(){} }
public void walk(){}
)也是實現的一種,而不能寫 public void eat()
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
- 接口就是對方法或者動做的抽象,好比
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(); }
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); } }
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() ,可是能夠先建立一個接口的實現類,而後再賦值於接口對象。
抽象類 | 接口 |
---|---|
使用關鍵字abstract 修飾 |
使用關鍵字interface |
使用關鍵字extends 實現繼承,能夠只實現一部分方法,一部分不實現,或者不實現也能夠 |
implements 來實現接口,實現接口必須實現裏面都有的方法 |
抽象類裏面的方法能夠是空實現,能夠默認實現,可是必需要帶{} | 接口裏面的方法都沒有實現體,也就是{} |
抽象類中能夠有具體的方法以及屬性,也能夠有靜態代碼塊,靜態成員變量 | 接口裏面不能有普通成員變量,必須都是不可變的final 成員變量,並且全部的成員變量都必須是public |
抽象類裏面的方法能夠是public ,protect ,private ,可是private 沒法繼承,因此不多人會這麼寫,若是沒有修飾符,那麼只能是同一個包下面的類才能繼承 |
接口的方法只能是public 或者無修飾符,全部的private 修飾都是會報錯的 |
若是有改動,添加新的方法,能夠直接在抽象類中實現默認的便可,也能夠在實現類中實現 | 接口增長新方法必須在接口中聲明,而後在實現類中進行實現 |
抽象類不能直接建立對象 | 接口也不能直接建立對象 ,能夠賦予實現類的對象 |
抽象類能夠有main 方法,並且咱們能夠直接運行,抽象類也能夠有構造器 |
接口不能有main 方法,接口不能有構造器 |
那麼咱們何時使用接口何時使用抽象類呢?
- java有一個缺點,只能實現單繼承,我的以爲接口是爲了彌補單繼承而設計的。
- 接口是對本質的抽象,好比人,能夠設計爲
person.class
這個抽象類,提供相關的方法,屬性,可是接口是隻提供方法的,也就是像增長功能的,那麼也就是對方法的抽象。- 若是須要默認實現,或者基本功能不斷改變,那麼建議使用抽象類,若是隻是增長一種方法,那麼建議使用接口,若是想實現多重繼承,只能是接口與抽象類一塊兒使用以達到想要實現的功能。
本文章是初學時的記錄,僅是初級的對比,深刻學習還需各位保持Keep going~
此文章僅表明本身(本菜鳥)學習積累記錄,或者學習筆記,若有侵權,請聯繫做者刪除。人無完人,文章也同樣,文筆稚嫩,在下不才,勿噴,若是有錯誤之處,還望指出,感激涕零~
技術之路不在一時,山高水長,縱使緩慢,馳而不息。Keep going~
公衆號:秦懷雜貨店