9 回答

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊
比如說(shuō)生物和人 此時(shí)生物可以當(dāng)做接口,人當(dāng)做實(shí)現(xiàn)生物的抽象類,男人女人作為具體實(shí)現(xiàn)類,為什么可以這樣設(shè)計(jì)?因?yàn)樯锸莻€(gè)非常非常抽象的概念,你很難抽象出它的具體行為(也就是具體的方法實(shí)現(xiàn)),此時(shí)可以當(dāng)做接口,人為何可以作為抽象類,因?yàn)樗梢杂芯唧w的行為動(dòng)作實(shí)現(xiàn),比如,摸爬滾走,但是可能男人女人的性征不一樣,同時(shí)可能還有一些公有的行為 但是行為特征不一樣 這可以當(dāng)做抽象類的抽象方法,讓子類實(shí)現(xiàn)。大概是這樣。

TA貢獻(xiàn)1779條經(jīng)驗(yàn) 獲得超6個(gè)贊
接口表示一個(gè)能力/行為。例如:人會(huì)跑,狗也會(huì)跑,就可以定義接口IRunable。 使用接口很好實(shí)現(xiàn)組件間解耦。
抽象類就是為了實(shí)現(xiàn)多態(tài),使代碼更方便擴(kuò)展。

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超6個(gè)贊
接口的話更偏向于為一群類定一個(gè)協(xié)議, 而抽象類的話已經(jīng)向?qū)崿F(xiàn)邁進(jìn)了一步。
例如模板方法模式中就用到了抽象類,實(shí)現(xiàn)了一些通用的方法, 而將不同的方法延遲到子類再實(shí)現(xiàn)。

TA貢獻(xiàn)1844條經(jīng)驗(yàn) 獲得超8個(gè)贊
舉個(gè)簡(jiǎn)單的例子,你現(xiàn)在想要抽象所有國(guó)家的人,那么你會(huì)想到抽象成一個(gè)接口,然后有個(gè)方法叫sayHello:
public interface Human{
String sayHello();
}
OK,現(xiàn)在每個(gè)實(shí)現(xiàn)了這個(gè)接口的對(duì)象只要實(shí)現(xiàn)sayHello方法,就表示了各個(gè)國(guó)家的人,他們擁有了不同的打招呼的的方式。
但是現(xiàn)在業(yè)務(wù)復(fù)雜起來(lái)了,你需要這些人還具備一些通用的能力,比如cry,walk,那么這個(gè)時(shí)候,你是不是應(yīng)該考慮把Human抽象成為一個(gè)抽象類,像這樣:
public abstract class Human{
public abstract String sayHello();
public String cry(){
System.out.println("wu~wu~wu~wu~wu~");
}
public String walk(){
System.out.println("左右左 左右左");
}
}
總結(jié)一下,就是如果只有抽象的方法,那么就用接口,如果還有通用的具體方法實(shí)現(xiàn),則用抽象類

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個(gè)贊
參考:
The Java? Tutorials :: Learngin The Java Language :: Interfaces and Inheritances :: Inheritances :: Abstract Methods and Classes :: Abstract Classes Compared to Interfaces
添加回答
舉報(bào)