java 中什么時(shí)候用抽象類,什么時(shí)候用 接口(面向?qū)ο蟮睦^承與多態(tài))

抽象類:強(qiáng)調(diào)的是把共同(共有、相同)的屬性方法, 抽象出來(lái),統(tǒng)一寫在一個(gè)地方(他們的實(shí)現(xiàn)代碼是一樣的),方便維護(hù)。(面向?qū)ο笕筇匦灾械睦^承特性)

接口: 抽象的是行為 - 同一種行為的不同實(shí)現(xiàn)方式。當(dāng)多個(gè)對(duì)象都擁有相同的行為,但是行為的具體實(shí)現(xiàn)方式不一樣的時(shí)候可以用接口抽象(面向?qū)ο笾械亩鄳B(tài)特性)

所以一般在實(shí)際項(xiàng)目中接口和抽象類是配合使用而不是相互替代

例如:

所有的訂單都有單號(hào),單價(jià),數(shù)量。都擁有,而且相同,所以可以用一個(gè)抽象類給統(tǒng)一描述出來(lái)。

public abstract class AbstractOrder {

private String serialNo; // 單號(hào)

private Double money;? // 單價(jià)

private int number;? // 數(shù)量

}

再有一個(gè)商品訂單 還有一個(gè)獨(dú)有的 商品名稱 屬性。所以 在新新建一個(gè) ProductOrder 繼承 AbstractOrder

public class ProductOrder extends AbstractOrder{

private String productName;

}

另外 所有的訂單都需要支付,但是支付方式又不一樣比如,微信支付,支付寶支付,同一種行為,但是具體的行為方式又不一樣。所以用一個(gè)接口給抽象出來(lái)(規(guī)定一個(gè)行為標(biāo)準(zhǔn))

public interface PayWay {

public boolean pay();

}

public class WeixinPayWay implements PayWay{

@Override

public boolean pay() {

System.out.println("微信支付成功");

return false;

}

}

public class ZhifubaoPayWay implements PayWay{@Overridepublic boolean pay() {System.out.println("支付寶支付成功");return false;}}

因?yàn)樗杏唵味夹枰Ц?所以 只需要 改造?AbstractOrder 類在里面增加一個(gè) 支付行為

public abstract class AbstractOrder {

private String serialNo; // 單號(hào)

private Double money;? // 單價(jià)

private int number;? // 數(shù)量

private PayWay payWay;? // 支付行為

}

在比如 ?每種支付方式 支付之前都需要校驗(yàn)一下支付金額是不是真確的,不能小于等于0 。因?yàn)樾r?yàn)方式,校驗(yàn)代碼都是一樣的,所以我們可以定義一個(gè) 抽象類給抽象出來(lái)

public abstract class AbstractPayWay implements PayWay{

private Double money;

private boolean verify(){

return ?money != null && money > 0;

}

/***

?這里實(shí)現(xiàn)了 ?PayWay 中的 ?pay 接口 方法 所以 AbstractPayWay 的子類 無(wú)需 實(shí)現(xiàn)該 方法,

* 只需要 實(shí)現(xiàn) doPay() 方法,并且 如果 ?doPay()方法被成功調(diào)用則說(shuō)明肯定 校驗(yàn)成功了。

*/

@Overridepublic boolean pay(){

boolean verify = this.verify();

if(!verify){

System.out.println("支付金額驗(yàn)證錯(cuò)誤!");

return false;

}

return this.doPay();

}

public abstract boolean doPay();

}

所以 ?WeixinPayWay ?ZhifubaoPayWay 支付的具體實(shí)現(xiàn)類可以改改為

/**

* 繼承? AbstractPayWay 所以無(wú)需 寫公共的校驗(yàn)邏輯,直接寫支付業(yè)務(wù)邏輯

* @author cyy

*/

public class WeixinPayWay extends AbstractPayWay{

@Override

public boolean doPay() {

System.out.println("這里無(wú)需校驗(yàn)支付金額,直接調(diào)用支付方法就行");

System.out.println("微信支付成功");

return false;

}

}

public class ZhifubaoPayWay extends AbstractPayWay{

@Override

public boolean doPay() {

System.out.println("這里無(wú)需校驗(yàn)支付金額,直接調(diào)用支付方法就行");

System.out.println("支付寶支付成功");

return true;

}

}



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,765評(píng)論 18 399
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,923評(píng)論 18 139
  • 小編費(fèi)力收集:給你想要的面試集合 1.C++或Java中的異常處理機(jī)制的簡(jiǎn)單原理和應(yīng)用。 當(dāng)JAVA程序違反了JA...
    八爺君閱讀 4,656評(píng)論 1 114
  • 這個(gè)標(biāo)題已經(jīng)擱置了好多天,看著看著,就寫不下去了…… 藏的很深的日記總會(huì)在非常切合的時(shí)機(jī)被人翻出來(lái)。我想寫你,想寫...
    丁?十弎閱讀 239評(píng)論 0 0
  • 2017年9月8日如是家人黃愈惠,種種子第39天。 發(fā)心:我今不是為了我個(gè)人而聞思修行,而是為了六道輪回一切如母有...
    愈惠閱讀 179評(píng)論 0 3