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"); }; }
溫馨提示
- 如果您對本文有疑問,請在評論部分留言,我會在最短時間回復。
- 如果本文幫助了您,也請評論關注,作為對我的一份鼓勵。
- 如果您感覺我寫的有問題,也請批評指正,我會盡量修改。