java接口与抽象类异同分析
生活随笔
收集整理的這篇文章主要介紹了
java接口与抽象类异同分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 在java中,通常初學者搞不懂接口與抽象類,這也是面試比較容易問到的一個問題。下面我來談談自己的理解。如有不妥之處,還望批評指正,不勝感激。
1.抽象類
我們定義一個抽象類person.class表示人:
//使用關鍵字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繼承抽象類
同一個包下繼承:
不同的包下面繼承:
同個包下正確的代碼如下(不重寫私有的方法):
- 結果如下(沒有覆蓋抽象類吃東西的方法,所以會調用抽象類默認的):
- 下面代碼是重寫了eat()方法的代碼,重寫是即使沒有使用@Override也是起作用的:
- 結果如下,吃東西的方法被覆蓋掉了:
- 抽象類不能被實例化,比如:
- 子類可以實現抽象類的方法,也可以不實現,也可以只實現一部分,這樣跑起來都是沒有問題的,不實現的話,調用是默認使用抽象類的空實現,也就是什么都沒有輸出,要是抽象類有實現,那么會輸出抽象類默認方法。
比如:
<br> - 抽象類中可以有具體的方法以及屬性(成員變量)
- 抽象類和普通類之間有很多相同的地方,比如他們都可以都靜態成員與靜態代碼塊等等。
2.接口
- 接口就是對方法或者動作的抽象,比如person.class想要成為教師,可以實現教師的接口,可以理解為增加能力。
- 接口不允許定義沒有初始化的屬性變量,可以定義public static final int i=5;,以及public int number =0;,但不允許public int num;這樣定義,所有private的變量都不允許出現,下面是圖片
定義public int number =0;默認是final修飾的,所以也不能改變它的值:
下面是正確的接口代碼:
- Teacher.class
- 實現類TeacherClass.class
- 測試類Test.class
結果:
分析:接口里面所定義的成員變量都是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這個抽象類,提供相關的方法,屬性,但是接口是只提供方法的,也就是像增加功能的,那么也就是對方法的抽象。
- 如果需要默認實現,或者基本功能不斷改變,那么建議使用抽象類,如果只是增加一種方法,那么建議使用接口,如果想實現多重繼承,只能是接口與抽象類一起使用已達到想要實現的功能。
此文章僅代表自己(本菜鳥)學習積累記錄,或者學習筆記,如有侵權,請聯系作者刪除。人無完人,文章也一樣,文筆稚嫩,在下不才,勿噴,如果有錯誤之處,還望指出,感激不盡~
技術之路不在一時,山高水長,縱使緩慢,馳而不息。
公眾號:秦懷雜貨店
總結
以上是生活随笔為你收集整理的java接口与抽象类异同分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 消防应急疏散照明在体育馆的应用
- 下一篇: svg怎么转为jpg格式?