Java基礎學習筆記(三) – 抽象類和介面
- 2019 年 10 月 8 日
- 筆記
一、抽象類
沒有方法主體的方法稱為抽象方法,包含抽象方法的類就是抽象類。
Java中使用 abstract 關鍵字修飾方法和類,抽象方法只有一個方法名,沒有方法體。
public abstract class TestAbstract { //抽象類 public abstract void run();//抽象方法 }
- 如果一個類繼承了抽象類,那麼該類必須重寫父類的所有抽象方法,否則該類也必須聲明抽象類。
- 抽象類不能創建對象,只能由其子類創建。
- 抽象類可以擁有構造方法,是用來給子類創建對象時,初始化父類成員使用的。
- 必須有一個子類來實現抽象父類的抽象方法,否則,抽象類的存在無任何意義。
- 抽象類不一定擁有抽象方法,但包含抽象方法的類必定是抽象類
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 關鍵字創建一個實現介面的類(類似於抽象類的實現),然後創建該類對象,就可以調用方法了。
特點:
- 介面中,無法定義成員變數,但是可以定義常量,其值不可以改變,默認使用 public static final (下篇介紹)修飾。
- 介面沒有構造方法,不可以創建對象。
- 介面中沒有靜態程式碼塊(static{},載入類時創建,只載入一次)。
內部主要封裝了方法:
- 抽象方法:使用 abstract 關鍵詞修飾,可以省略,沒有方法體。該方法供子類重寫實現使用。
- 默認方法:使用 default 修飾,不可省略,供子類調用或子類重寫。
- 靜態方法:使用 static 修飾,供介面直接使用。
- 私有方法:使用 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"); }; }
溫馨提示
- 如果您對本文有疑問,請在評論部分留言,我會在最短時間回復。
- 如果本文幫助了您,也請評論關注,作為對我的一份鼓勵。
- 如果您感覺我寫的有問題,也請批評指正,我會盡量修改。