抽象類(abstract)
- 包含一個抽象方法的類必須是抽象類
- 抽象類和抽象方法都是用abstract關鍵字聲明
- 抽象方法隻需要聲明而不需要實作
- 抽象類必須被子類繼承
- 子類不是抽象類時必須重寫父類中的所有抽象方法
- 子類是抽象類時仍可以繼續聲明成抽象方法
public abstract class Hero{ public abstract boolean canFight(Hero hero); public abstract void fight(Hero hero); } /** 子類不是抽象類*/ public class Worrior extends Hero{ @Overrride public boolean canFight(Hero hero){ return false; } @Override public void fight(Hero hero){} } /** 子類是抽象類*/ public abstract class LongRangerHero extends Hero{ //繼續作為抽象方法,也可以省略 public abstract void fight(Hero hero); @Override public boolean canFight(Hero hero){ return true; } } /** 子類不是抽象類*/ public class Ranger extends LongRanger{ @Override public void fight(Hero hero){} } /** 子類不是抽象類*/ public class Magical extends LongRangerHero{ @Override public void fight(Hero hero){} }
- 抽象類不可以用new執行個體化
接口(interface)
文法
修飾符 interface 接口名
如:public interface Demo{}
類 implements 接口
- 接口是一種與類相似的結構,隻包含常量和抽象方法
- 目的是指明相關或不相關類的多個對象的共同行為(功能)
- 在Java中,接口看做是一種特殊的類,與抽象類類似,不能使用new執行個體化
- 接口必須由其他類實作,實作類不能實作的方法可以繼續辨別為abstract
- 接口中所有的資料都是public static final,所有方法都是public abstract,預設情況下可以省略這些關鍵字
- 在Java8中,接口中也可以有方法的實作
接口的優點
使設計和實作完全分離,能夠更自然使用多态,可以更容易搭建程式架構,可以更容易更換實作
接口和抽象類的比較
差別 | 接口 | 抽象類 |
---|---|---|
定義關鍵字 | interface | abstract class |
組成 | 全局常量,抽象方法 | 常量,變量,抽象方法,普通方法,構造方法 |
權限 | 隻能是public | 可以使用各種權限 |
關系 | 接口不能夠繼承抽象類,但可以繼承多接口 | 一個抽象類可以實作多個接口 |
使用 | 子類使用implements實作接口 | 子類使用extends繼承抽象類 |
局限 | 一個子類可以實作多個接口 | 一個子類隻能繼承一個抽象類 |
抽象類的缺點:一個子類隻能繼承一個抽象類,存在單繼承的局限
實際開發中,抽象類和接口都可以用的情況下,優先使用接口,避免單繼承的局限