Java接口和抽象類(lèi)是什么拿撩,有什么區(qū)別

抽象(abstract)和接口(interface)在Java中都是關(guān)鍵字怔软,也就說(shuō)明他們足夠重要垦细,而抽象類(lèi)和接口為我們面向?qū)ο缶幊烫峁┝朔浅4蟮膸椭O旅嫖覀兙鸵黄饋?lái)回顧這基礎(chǔ)知識(shí)挡逼。

  • 抽象類(lèi)

    • 在構(gòu)建某些未實(shí)現(xiàn)方法的類(lèi)時(shí)括改,你可能會(huì)第一個(gè)想到接口,但是抽象類(lèi)也是實(shí)現(xiàn)這個(gè)目的一種重要而必要的工具挚瘟。

    • 創(chuàng)建抽象類(lèi)需要用到abstract關(guān)鍵字來(lái)修飾類(lèi)叹谁,我們希望通過(guò)這個(gè)通用的類(lèi)操作一系類(lèi)方法,如果沒(méi)有具體的內(nèi)容乘盖,這個(gè)抽象類(lèi)的意義只有一個(gè)焰檩,就是不讓其他類(lèi)實(shí)例化這個(gè)抽象類(lèi)的對(duì)象,只能實(shí)例化它的子類(lèi)對(duì)象订框;要達(dá)到操控析苫,Java給我們提供了抽象方法的機(jī)制,抽象方法也是使用abstract關(guān)鍵字來(lái)修飾穿扳,包含抽象方法的類(lèi)就叫做抽象類(lèi)

    • 抽象類(lèi)特點(diǎn)

        1. 抽象類(lèi)和抽象方法必須用abstract關(guān)鍵字修飾
        1. 抽象類(lèi)不一定有抽象方法衩侥,有抽象方法的類(lèi)一定是抽象類(lèi)或者接口
        1. 抽象類(lèi)不能實(shí)例化,也就是說(shuō)不能new出來(lái)矛物,抽象類(lèi)必須由子類(lèi)實(shí)例化茫死,這其實(shí)也就是多態(tài)的一種,抽象類(lèi)多態(tài)(為什么抽象類(lèi)不能實(shí)例化履羞? 如果抽象類(lèi)實(shí)例化峦萎,實(shí)例化的抽象類(lèi)對(duì)象意思就可以調(diào)用抽象類(lèi)的抽象方法,但是抽象方法是沒(méi)有具體實(shí)現(xiàn)的忆首,也就沒(méi)有任何意義爱榔,所以抽象類(lèi)不能實(shí)例化)
        1. 抽象類(lèi)的子類(lèi)要么是抽象類(lèi)(實(shí)例中的Car類(lèi)),要么就重寫(xiě)抽象類(lèi)中的抽象方法(實(shí)例中的Jetta類(lèi))
        1. 一個(gè)類(lèi)只能繼承一個(gè)抽象類(lèi)糙及,抽象類(lèi)也可以繼承抽象類(lèi)(實(shí)例中的SuperCar 類(lèi))
    • 抽象類(lèi)成員特點(diǎn):

        1. 成員既可以是常量也可以是變量详幽,但是abstract不能修飾成員變量,變量的值是不固定的,無(wú)法抽象
        1. 抽象類(lèi)也有構(gòu)造方法唇聘,他的意義在于子類(lèi)可以訪(fǎng)問(wèn)父類(lèi)的初始化數(shù)據(jù)(實(shí)例中Jetta構(gòu)造方法 super()調(diào)用了抽象父類(lèi)構(gòu)造方法)
        1. 成員方法既可以抽象的版姑,也可以是非抽象的,抽象方法一般是強(qiáng)制要求子類(lèi)去實(shí)現(xiàn)的方法雳灾,非抽象方法一般是重復(fù)的代碼漠酿,可以提高代碼復(fù)用性
        1. abstract關(guān)鍵字不能與static關(guān)鍵字(原理和抽象類(lèi)不能實(shí)例化其實(shí)是一個(gè)道理,staticx修飾的抽象方法不需要實(shí)例化可以直接調(diào)用谎亩,這顯然是沒(méi)有意義的)炒嘲、final關(guān)鍵字(final修飾的方法子類(lèi)不能重寫(xiě),abstract修飾的方法子類(lèi)強(qiáng)制重寫(xiě))匈庭、private關(guān)鍵同時(shí)出現(xiàn)(private修飾的方法子類(lèi)不能訪(fǎng)問(wèn)
    • 實(shí)例

      /**
       * @Author: mao.qitian
       * @Date: 2018/8/11 0011 16:25
       * @Description: 汽車(chē)抽象類(lèi)
       */
      public abstract class Car {
      
      public Car(){
          System.out.println("抽象類(lèi)的構(gòu)造方法被調(diào)用");
      }
      
      public void driver(){
          System.out.println("所有汽車(chē)都能駕駛");
      }
      //汽車(chē)的速度
      public abstract void speed();
      } 
      
      /**
       * @Author: mao.qitian@gxxmt.com
       * @Date: 2018/8/11 0011 16:29
       * @Description: 捷達(dá)
       */
       public class Jetta extends Car{
       
       public Jetta(){
          super();
       }
       
       @Override
       public void speed() {
          System.out.println("開(kāi)完蘭博基尼再開(kāi)捷達(dá)速度上無(wú)法適應(yīng)");
         }
       }
       
       
      /**
       * @Author: mao.qitian
       * @Date: 2018/8/11 0011 22:39
       * @Description: 超跑
       */
      public abstract class SuperCar extends Car {
      //超跑的價(jià)格
      public abstract void expensive ();
      }
      
      /**
       * @Author: mao.qitian
       * @Date: 2018/8/11 0011 16:27
       * @Description: 蘭博基尼
       */ 
      public class Lamborghini extends SuperCar {
      @Override
      public void speed() {
          System.out.println("蘭博基尼速度兩秒破百");
      }
      
      @Override
      public void expensive() {
        }
      } 
      
  • 接口(interface)

    • 接口使抽象的更向前邁進(jìn)了一步夫凸,interface關(guān)鍵字修飾方法產(chǎn)生的是完全抽象的類(lèi),它允許創(chuàng)建者定義方法名阱持,傳參和返回類(lèi)型夭拌,但是它沒(méi)有任何方法體,只提供了形式(規(guī)則)衷咽,而未提供任何具體實(shí)現(xiàn)鸽扁。

    • 接口的特點(diǎn)

        1. 接口使用interface關(guān)鍵字代替class修飾類(lèi),
        1. 類(lèi)實(shí)現(xiàn)接口用implement表示
        1. 和抽象類(lèi)一樣镶骗,接口也不能實(shí)例化桶现,只能由實(shí)現(xiàn)了接口的類(lèi)來(lái)進(jìn)行實(shí)例化
        1. 接口的子類(lèi)可以是抽象類(lèi),也可以是具體類(lèi)鼎姊,具體類(lèi)要重寫(xiě)接口的抽象方法
    • 接口成員特點(diǎn)

        1. 接口中定義的變量都是常量骡和,默認(rèn)修飾符為 public static final
        1. 接口沒(méi)有構(gòu)造方法
        /**
         * @Author: mao.qitian
         * @Date: 2018/8/12 0012 0:22
         * @Description:
         */
        public interface A {
          public  void b();
         }
        
         class C implements A{
          public C(){
          super();//調(diào)用的是Objetc類(lèi)的構(gòu)造方法,方法默認(rèn)繼承Objetc類(lèi)
          }
         @Override
          public void b() {
          }
         }
        
        1. 接口中的成員方法只能是抽象方法相寇,默認(rèn)修飾符為 public abstract
        1. 接口中的所以成員方法和變量都是公共的(public)
    • 接口的應(yīng)用

      • 策略模式:定義一系列算法慰于,把每一個(gè)算法封裝起來(lái),并且使他們可以相互替換唤衫。策略模式使得算法可獨(dú)立于使用它的客戶(hù)端而獨(dú)立變化婆赠。

      • 三個(gè)角色

        • 上下文角色(Context):操作我們制定策略的上下文環(huán)境,使用策略的通用調(diào)用
        • 抽象策略角色(Stragety):策略佳励,算法的抽象休里,通常是一個(gè)接口
        • 策略的實(shí)現(xiàn)角色(ConcreteStragety):實(shí)現(xiàn)抽象的策略接口,具體實(shí)現(xiàn)這個(gè)策略
        • 實(shí)例
        實(shí)現(xiàn)學(xué)校教師的獎(jiǎng)金發(fā)放植兰,教師有屬性:編號(hào)份帐、姓名璃吧,教學(xué)總工作量楣导,獎(jiǎng)金
        獎(jiǎng)金的計(jì)算方法為:
                        x*30   (當(dāng)職稱(chēng)為教授時(shí))
               y=       x*25   (當(dāng)職稱(chēng)為副教授時(shí))
                        x*20    (當(dāng)職稱(chēng)為講師時(shí))
        
        public interface Function {                             
        //接口定義抽象方法 (Stragety)
        public double Money(double x);
        }
        
        public class A implements Function  {
          //教授獎(jiǎng)金計(jì)算
          public double Money(double x) {
          return x*30;
          
         }
        
         public class B implements Function {
         //副教授獎(jiǎng)金計(jì)算
         public double Money(double x) {
          return x*25;
          }
         }
        
        public class C implements Function {
          //講師獎(jiǎng)金計(jì)算
          public double Money(double x) {
          return x*20;
          }
        }
        
        public class myMoney {
         //上下文角色
         Function s;
         double M;//工時(shí)
             String name;//教師姓名
             String type;//教師職稱(chēng)
             int number;//教師編號(hào)
        
         public void S(double X,String N,int Num,String Type){
         this.M=X;
         this.name=N;
         this.number=Num;
         this.type=Type;
         }
         //獎(jiǎng)金計(jì)算方式
         public double getMoney(){
         if(type.equals("教授")) s=new A();
         if(type.equals("副教授")) s=new B();
         if(type.equals("講師")) s=new C();
         return s.Money(M);
           }
         }
             //使用
         myMoney f=new myMoney();
                   Scanner sc=new Scanner(System.in);
                   System.out.println("請(qǐng)輸入職位:");
                   String Type=sc.next();
                   System.out.println("請(qǐng)輸入姓名:");
                   String N=sc.next();
                   System.out.println("請(qǐng)輸入編號(hào):");
                   int Num=sc.nextInt();
                   System.out.println("請(qǐng)輸入工時(shí):");
                   double X=sc.nextDouble();
                   f.S(X, N, Num, Type);
                   System.out.println(N+獎(jiǎng)金為"+f.getMoney());
        
  • 類(lèi)與類(lèi),類(lèi)與接口畜挨,接口與接口之間的關(guān)系

    • 類(lèi)與類(lèi)之間筒繁,一個(gè)類(lèi)只能繼承一個(gè)類(lèi)噩凹,但是類(lèi)可以多層繼承
    • 類(lèi)與接口則是實(shí)現(xiàn)關(guān)系,一個(gè)類(lèi)可以繼承一個(gè)接口毡咏,也可以繼承多個(gè)接口驮宴,也可以繼承一個(gè)類(lèi)的同時(shí)實(shí)現(xiàn)多個(gè)接口
    • 接口與接口之間是繼承關(guān)系,一個(gè)接口可以繼承另一個(gè)接口呕缭,也可以繼承多個(gè)接口
/**
 * @Author: mao.qitian
 * @Date: 2018/8/12 0012 0:22
 * @Description:
 */
 public interface A {
  public  void a();
  }
 interface B {
  public  void b();
  }
 interface C extends B,A{ //接口與接口之間繼承堵泽,多繼承
  public  void c();
  }
  class D implements A,B,C{
  @Override
  public void a() { }
  @Override
  public void b() { }
  @Override
  public void c() { }
  }
  • 抽象類(lèi)和接口的區(qū)別

類(lèi) 成員區(qū)別 繼承關(guān)系區(qū)別 設(shè)計(jì)理念區(qū)別
抽象類(lèi) 成員變量可以是常量,也可以是變量恢总,有構(gòu)造方法迎罗,成員方法可以是抽象的也可以是非抽象的 單繼承,多層繼承 被繼承的體現(xiàn)是“is a”的關(guān)系片仿,抽象類(lèi)中定義的是該繼承體系的共性功能
接口 成員變量只能是常量纹安,沒(méi)有構(gòu)造方法,成員方法只能是抽象的 實(shí)現(xiàn)砂豌,可以實(shí)現(xiàn)多個(gè)接口 被繼承的體現(xiàn)是“l(fā)ike a”的關(guān)系厢岂,接口中定義的是該繼承體現(xiàn)的擴(kuò)展功能

最后

還是那句話(huà),好記性不如爛筆頭阳距,通過(guò)這一篇文章塔粒,再次鞏固了基礎(chǔ)知識(shí)。如果文章中有寫(xiě)得不對(duì)的地方娄涩,請(qǐng)給我留言指出窗怒,大家一起學(xué)習(xí)進(jìn)步。

  • 參考資料:

    • 《Android進(jìn)階之光》
    • 《Java編程思想》(第四版)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蓄拣,一起剝皮案震驚了整個(gè)濱河市扬虚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌球恤,老刑警劉巖辜昵,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異咽斧,居然都是意外死亡堪置,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)张惹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)舀锨,“玉大人,你說(shuō)我怎么就攤上這事宛逗】材洌” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)替蔬。 經(jīng)常有香客問(wèn)我告私,道長(zhǎng),這世上最難降的妖魔是什么承桥? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任驻粟,我火速辦了婚禮,結(jié)果婚禮上凶异,老公的妹妹穿的比我還像新娘蜀撑。我一直安慰自己,他們只是感情好剩彬,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布屯掖。 她就那樣靜靜地躺著,像睡著了一般襟衰。 火紅的嫁衣襯著肌膚如雪贴铜。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,850評(píng)論 1 290
  • 那天瀑晒,我揣著相機(jī)與錄音绍坝,去河邊找鬼。 笑死苔悦,一個(gè)胖子當(dāng)著我的面吹牛轩褐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播玖详,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼把介,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蟋座?” 一聲冷哼從身側(cè)響起拗踢,我...
    開(kāi)封第一講書(shū)人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎向臀,沒(méi)想到半個(gè)月后巢墅,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡券膀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年君纫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芹彬。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蓄髓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舒帮,到底是詐尸還是另有隱情会喝,我是刑警寧澤眨唬,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站好乐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏瓦宜。R本人自食惡果不足惜蔚万,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望临庇。 院中可真熱鬧反璃,春花似錦、人聲如沸假夺。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)已卷。三九已至梧田,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侧蘸,已是汗流浹背裁眯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留讳癌,地道東北人穿稳。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像晌坤,于是被迫代替她去往敵國(guó)和親逢艘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法骤菠,類(lèi)相關(guān)的語(yǔ)法它改,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法商乎,異常的語(yǔ)法搔课,線(xiàn)程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,598評(píng)論 18 399
  • 抽象類(lèi) 在繼承的層次結(jié)構(gòu)中崩瓤,每個(gè)新子類(lèi)都使類(lèi)變得越來(lái)越明確具體袍啡。如果從一個(gè)子類(lèi)追溯到父類(lèi),類(lèi)就會(huì)變得更通用和抽象却桶。...
    Steven1997閱讀 1,368評(píng)論 0 5
  • 這是怎么啦境输? 難道是鎧甲搞鬼蔗牡? 我靠,不會(huì)是強(qiáng)迫我學(xué)習(xí)吧嗅剖? …… 張卓越想越有這種可能辩越,因?yàn)椋F(xiàn)在根本就無(wú)法遏制...
    嗨小睿閱讀 283評(píng)論 0 0
  • 有時(shí)候 真的很想和她 掏心掏肺地講述那些 因?yàn)橄胨叩囊?因?yàn)槟钏砭频慕?因?yàn)閻?ài)她而哭泣的淚 可每次話(huà)到嘴...
    納西奇麒閱讀 109評(píng)論 0 0
  • 樗散待逢春,天機(jī)倚四輪强缘。江湖一失足督惰,蝶我兩蒙塵。 對(duì)酒思高詠旅掂,臨風(fēng)憶故人赏胚。不堪翹首際,尼父困于陳商虐。
    抱樸堂主閱讀 215評(píng)論 0 0