日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java接口与抽象类异同分析

發布時間:2024/1/1 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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繼承抽象類

    同一個包下繼承:


    不同的包下面繼承:


    同個包下正確的代碼如下(不重寫私有的方法):
public class teacher extends person {@Overridepublic void run(){System.out.println("我是實體類的方法跑步");}@Overridevoid walk(){System.out.println("我是實體類的方法走路");}@Overrideprotected void sleep(){System.out.println("我是實體類的方法睡覺");} }
  • 結果如下(沒有覆蓋抽象類吃東西的方法,所以會調用抽象類默認的):


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

  • 抽象類不能被實例化,比如:

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

    <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
public interface Teacher {public static final int i=5;public int number =0;public void teach();void study(); }
  • 實現類TeacherClass.class
public class TeacherClass implements Teacher{@Overridepublic void teach() {System.out.println("我是一名老師,我要教書");System.out.println("接口的static int是:"+i);}@Overridepublic void study() {System.out.println("我是一名老師,我也要學習");System.out.println("接口的int number是:"+number);} }
  • 測試類Test.class
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();} }

結果:


分析:接口里面所定義的成員變量都是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接口与抽象类异同分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。