第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Java-從接口類(lèi)型而不是類(lèi)聲明

Java-從接口類(lèi)型而不是類(lèi)聲明

呼啦一陣風(fēng) 2019-10-28 14:35:00
在正確掌握接口最佳實(shí)踐的過(guò)程中,我注意到一些聲明,例如:List<String> myList = new ArrayList<String>();代替ArrayList<String> myList = new ArrayList<String>();-據(jù)我所知,原因是因?yàn)樗幸欢ǖ撵`活性,以防萬(wàn)一您不想實(shí)現(xiàn)ArrayList,但又可能實(shí)現(xiàn)另一種類(lèi)型的列表。通過(guò)這種邏輯,我建立了一個(gè)示例:public class InterfaceTest {    public static void main(String[] args) {        PetInterface p = new Cat();        p.talk();    }}interface PetInterface {                    public void talk();}class Dog implements PetInterface {    @Override    public void talk() {        System.out.println("Bark!");    }}class Cat implements PetInterface {    @Override    public void talk() {        System.out.println("Meow!");    }    public void batheSelf() {        System.out.println("Cat bathing");    }}我的問(wèn)題是,我無(wú)法訪問(wèn)batheSelf()方法,因?yàn)樗鼉H適用于Cat。這使我相信,如果僅使用接口中聲明的方法(而不是子類(lèi)中的其他方法),則僅應(yīng)從接口中聲明,否則應(yīng)直接從類(lèi)中聲明(在本例中為Cat)。我對(duì)這個(gè)假設(shè)是否正確?
查看完整描述

3 回答

?
智慧大石

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊

如果可以通過(guò)“ a” interface或“ a” 來(lái)引用對(duì)象class,則應(yīng)首選后者,但前提是存在適當(dāng)?shù)念?lèi)型。


考慮一個(gè)例子。你不應(yīng)該只是一味地用在preferrence到所有情況,因?yàn)檫@會(huì)剝奪你喜歡簡(jiǎn)單的操作,等等。StringimplementsCharSequenceCharSequenceStringtrim()toUpperCase()


但是,應(yīng)該改用String只關(guān)心其char值序列的方法,因?yàn)樵谶@種情況下,這是合適的類(lèi)型。實(shí)際上,在課堂上就是這種情況。CharSequencereplace(CharSequence target, CharSequence replacement)String


另一個(gè)例子是java.util.regex.Pattern它的Matcher matcher(CharSequence)方法。這樣一Matcher來(lái)Pattern,不僅可以從創(chuàng)建String,而且還可以為所有其他創(chuàng)建的對(duì)象CharSequence。


可以在以下位置找到庫(kù)中的一個(gè)很好的例子,該例子中interface應(yīng)該使用a,但不幸的是沒(méi)有使用a Matcher:它的appendReplacement和appendTail方法僅接受StringBuffer。StringBuilder從1.5 開(kāi)始,該類(lèi)別已被其更快的表親取代。


A StringBuilder不是a StringBuffer,因此我們不能將前者與中的append…方法一起使用Matcher。但是,它們兩者implementsAppendable(也在1.5中引入)。理想情況下Matcher,的append…方法應(yīng)該接受any Appendable,然后我們就可以使用StringBuilder,以及所有其他Appendable可用的方法!


因此,我們可以看到,當(dāng)存在適當(dāng)?shù)念?lèi)型時(shí),如何通過(guò)它們的接口引用對(duì)象可以成為強(qiáng)大的抽象,但是前提是這些類(lèi)型存在。如果類(lèi)型不存在,那么可以考慮定義自己的類(lèi)型。Cat例如,在此示例中,您可以定義interface SelfBathable。然后Cat,您可以接受任何SelfBathable對(duì)象(例如Parakeet),而不是引用a


如果創(chuàng)建新類(lèi)型沒(méi)有意義,那么您可以通過(guò)其引用它c(diǎn)lass。


也可以看看

有效的Java 2nd Edition,項(xiàng)目52:通過(guò)其接口引用對(duì)象

如果存在適當(dāng)?shù)慕涌陬?lèi)型,則應(yīng)使用接口類(lèi)型聲明參數(shù),返回值和字段。如果您習(xí)慣于使用接口類(lèi)型,那么您的程序?qū)⒏屿`活。如果不存在適當(dāng)?shù)慕涌?,則完全可以通過(guò)類(lèi)來(lái)引用對(duì)象。


查看完整回答
反對(duì) 回復(fù) 2019-10-28
?
楊__羊羊

TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個(gè)贊

您是正確的,但是如果需要,可以從界面投射到所需的寵物。例如:


PetInterface p = new Cat();

((Cat)p).batheSelf();

當(dāng)然,如果您嘗試將寵物扔給狗,則無(wú)法調(diào)用batheSelf()方法。它甚至不會(huì)編譯。因此,為避免出現(xiàn)問(wèn)題,您可以使用以下方法:


public void bathe(PetInterface p){

    if (p instanceof Cat) {

        Cat c = (Cat) p;

        c.batheSelf();

    }

}

使用時(shí)instanceof,請(qǐng)確保不會(huì)在運(yùn)行時(shí)嘗試讓狗自己洗澡。這將引發(fā)錯(cuò)誤。


查看完整回答
反對(duì) 回復(fù) 2019-10-28
  • 3 回答
  • 0 關(guān)注
  • 814 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)