Java基礎學習筆記(三) – 抽象類和介面

  • 2019 年 10 月 8 日
  • 筆記

一、抽象類

沒有方法主體的方法稱為抽象方法,包含抽象方法的類就是抽象類。

Java中使用 abstract 關鍵字修飾方法和類,抽象方法只有一個方法名,沒有方法體。

public  abstract class TestAbstract { //抽象類      public abstract void run();//抽象方法  }

  1. 如果一個類繼承了抽象類,那麼該類必須重寫父類的所有抽象方法,否則該類也必須聲明抽象類。
  2. 抽象類不能創建對象,只能由其子類創建。
  3. 抽象類可以擁有構造方法,是用來給子類創建對象時,初始化父類成員使用的。
  4. 必須有一個子類來實現抽象父類的抽象方法,否則,抽象類的存在無任何意義。
  5. 抽象類不一定擁有抽象方法,但包含抽象方法的類必定是抽象類
public  abstract class Animal { //抽象類      public abstract void eat();//抽象方法  }

public class Test{      public static void main(String[] args){          Dog d = new Dog();          d.eat();      }  }  class Dog extends Animal{   //繼承動物類並重寫eat方法      public void eat(){          System.out.println("小狗吃飯了");      }  }

方法重寫,其實是子類對父類抽象方法的完成實現,所以也叫做抽象父類的實現方法。

二、介面

概念: 介面,是Java語言中一種引用數據類型,是方法的集合。

注意:介面雖然和定義類的方式相似,但是一定要明確介面不是類,是一種引用數據類型。

使用:介面不能創建對象,但是可以被實現,使用 interface 關鍵字定義介面,使用 implements 關鍵字創建一個實現介面的類(類似於抽象類的實現),然後創建該類對象,就可以調用方法了。

特點:

  1. 介面中,無法定義成員變數,但是可以定義常量,其值不可以改變,默認使用 public static final (下篇介紹)修飾。
  2. 介面沒有構造方法,不可以創建對象。
  3. 介面中沒有靜態程式碼塊(static{},載入類時創建,只載入一次)。

內部主要封裝了方法:

  1. 抽象方法:使用 abstract 關鍵詞修飾,可以省略,沒有方法體。該方法供子類重寫實現使用。
  2. 默認方法:使用 default 修飾,不可省略,供子類調用或子類重寫。
  3. 靜態方法:使用 static 修飾,供介面直接使用。
  4. 私有方法:使用 private 修飾,供介面中的默認方法或者靜態方法調用。
public interface LiveAble { //介面      //抽象方法(必須重寫)      public  abstract void eat();      //默認方法(可以被重寫,也可以繼承默認方法)      public  default  void  play(){        System.out.println("玩遊戲");      };      //靜態方法(只能用介面名調用,不可以被實現類的對象調用)      public static void  run(){          System.out.println("跑步");      }      //私有方法 (輔助默認方法和靜態方法)      private void sing(){          System.out.println("唱歌");      }  }

public class Animal implements LiveAble{//實現類      //重寫抽象方法(必須)      @Override      public  void  eat(){          System.out.println("吃大餐");      };      //重寫默認方法(非必須,默認繼承介面方法)      @Override      public void play(){          System.out.println("玩電腦");      }  }

@Override是偽程式碼,表示重寫(當然不寫也可以),不過寫上有如下好處:

  • 可以當注釋用,方便閱讀
  • 編譯器可以給你驗證@Override下面的方法名是否是你父類中所有的,如果沒有則報錯。例如,你如果沒寫@Override,而你下面的方法名又寫錯了,這時你的編譯器是可以編譯通過的,因為編譯器以為這個方法是你的子類中自己增加的方法。

介面的多實現:一個類可以繼承一個父類,同時實現多個介面。

    • 如果介面中的方法和父類方法重名,實現類的對象在調用該方法時會優先調用。
    • 如果多個介面的默認方法存在重複,那麼必須對該默認方法進行重寫。
//介面
interface
A { public abstract void showA(); public default void show(){ System.out.println("我是介面A的show方法"); }; } interface B { public abstract void showA(); public abstract void showB(); public default void show(){ System.out.println("我是介面B的show方法"); }; }

//父類  public class D {      public void show(){        System.out.println("我是父類D的show方法");      };  }

//繼承實現類  public class C extends D implements A,B{      @Override      public void showA(){//抽象方法重名重寫一次就好          System.out.println("我是A");      };      @Override      public  void showB(){//抽象方法          System.out.println("我是B");      };      @Override      public void show(){ //如果父類存在同名方法,優先執行父類。不存在,默認方法重名必須重寫。      }  }

介面的多繼承:
  介面之間可以相互繼承,一個介面能繼承另一個或多個介面。

  介面繼承使用 extends 關鍵字,子介面繼承父介面的方法,如果默認方法存在重名,則需要重寫一次。

interface C extends A,B{      @Override      public default void show(){  //介面重寫方法時,可以保留default關鍵字(子類重寫不可以保留)。          System.out.println("我是C");      };  }

 

溫馨提示

  • 如果您對本文有疑問,請在評論部分留言,我會在最短時間回復。
  • 如果本文幫助了您,也請評論關注,作為對我的一份鼓勵。
  • 如果您感覺我寫的有問題,也請批評指正,我會盡量修改。