java基礎(chǔ)9&實(shí)戰(zhàn)開(kāi)發(fā)Day6/接口Interface/2020-05-05

目錄

1.接口的理解和定義
2.接口實(shí)現(xiàn)數(shù)據(jù)回調(diào)
3.接口實(shí)現(xiàn)回調(diào)(中介租房)
4.接口補(bǔ)充:對(duì)象引用

1.接口的理解的定義

使用interface表示定義一個(gè)接口
接口也可以繼承多個(gè)接口(多個(gè)接口之間用逗號(hào)隔開(kāi))
接口內(nèi)部元素

1.接口不能被實(shí)例化(沒(méi)有構(gòu)造方法)
2.定義變量(只能是靜態(tài)成員變量)(默認(rèn)修飾符public static final)
3.方法

  • 抽象方法(常用):不需要自己實(shí)現(xiàn)蔫敲。誰(shuí)用誰(shuí)就實(shí)現(xiàn)(默認(rèn)修飾符public abstract)
    • 使用implements實(shí)現(xiàn)接口
    • 必須實(shí)現(xiàn)接口里面定義的方法
  • 類(lèi)方法、默認(rèn)方法、私有方法:可以實(shí)現(xiàn)
    4.內(nèi)部接口

一個(gè)Demo讓大家了解接口的定義和基本使用:
Step1.定義一個(gè)數(shù)據(jù)接口類(lèi):DataInteraction笋轨,并創(chuàng)建輸出和輸入方法

public interface DataInteraction {
    interface Input{
        void input();
    }

    interface Output{
        void output();
    }
}

Step2.創(chuàng)建三個(gè)子類(lèi)分別實(shí)行數(shù)據(jù)接口的方法(可自由挑選方法)

//Macbook的實(shí)行方法
public class Macbook implements DataInteraction.Input {
    @Override
    public void input() {
        System.out.println("電腦接收到數(shù)據(jù)");
    }
    
    public void printf(){
        System.out.println("電腦輸出數(shù)據(jù)");
    }
}

//打印機(jī)的實(shí)行方法
public class Printer implements DataInteraction.Input,DataInteraction.Output{

    @Override
    public void input() {
        System.out.println("打印機(jī)從電腦得到數(shù)據(jù)");
    }

    @Override
    public void output() {
        System.out.println("打印機(jī)開(kāi)始打印");
    }
}

//鼠標(biāo)的實(shí)行方法
public class Mouse implements DataInteraction.Output{
    @Override
    public void output() {
        System.out.println("鼠標(biāo)輸入坐標(biāo)位置:東經(jīng)38 北緯20");
    }
}

我們可以看到:在數(shù)據(jù)接口類(lèi)中可以定義內(nèi)部類(lèi)幌缝,后續(xù)的實(shí)行中就可以自由選擇需要的接口荸恕,接口之間用逗號(hào)隔開(kāi)

2.接口實(shí)現(xiàn)數(shù)據(jù)回調(diào)

我們直接做一個(gè)圖片下載請(qǐng)求Demo來(lái)看看具體的接口使用吧:

實(shí)現(xiàn)過(guò)程:
1.定義一個(gè)接口 統(tǒng)一返回?cái)?shù)據(jù)的方式粪糙;
2.定義一個(gè)變量接收誰(shuí)來(lái)監(jiān)聽(tīng)網(wǎng)絡(luò)下載完畢的事件肠缔;
3.任務(wù)結(jié)束 回調(diào)數(shù)據(jù)糖埋;
4.提供set方法保存當(dāng)前的監(jiān)聽(tīng)者宣吱;
5.必須實(shí)現(xiàn)接口內(nèi)部的的所有抽象方法;
6.必須傳遞當(dāng)前對(duì)象給功能類(lèi)瞳别;
7.調(diào)用功能類(lèi) 完成功能征候;

public class Http {
    
    //1.定義一個(gè)接口 統(tǒng)一返回?cái)?shù)據(jù)的方式
    public interface OnHttpFinishListener{
        void onSuccess(String img);
        void onFailure(String err);
    }
    
    //2.定義一個(gè)變量接收誰(shuí)來(lái)監(jiān)聽(tīng)網(wǎng)絡(luò)下載完畢的事件
    private OnHttpFinishListener listener;

    public void getData(String url){
        System.out.println("開(kāi)始下載...");
        System.out.println("圖片下載完畢...");

        //3.任務(wù)結(jié)束 回調(diào)數(shù)據(jù)
        listener.onSuccess("張柏芝和冠希哥的圖片下載成功");
    }

    //4.提供set方法保存當(dāng)前的監(jiān)聽(tīng)者
    public void setListener(OnHttpFinishListener listener){
        this.listener = listener;
    }
}

第二個(gè)類(lèi)來(lái)實(shí)行方法的調(diào)用:

//使用者必須實(shí)現(xiàn)這個(gè)接口
public class SplashView implements Http.OnHttpFinishListener {
    public SplashView(){
        //開(kāi)始下載數(shù)據(jù)
        Http http = new Http();
        //6.必須傳遞當(dāng)前對(duì)象給功能類(lèi)
        http.setListener(this);
        //7.調(diào)用功能類(lèi) 完成功能
        http.getData("www.baidu.com");
    }

    //5.必須實(shí)現(xiàn)接口內(nèi)部的的所有抽象方法
    @Override
    public void onSuccess(String img) {
        System.out.println("展示圖片:" + img);
    }

    @Override
    public void onFailure(String err) {
        System.out.println("下載失敗:" + err);
    }
}

最后在MyClass中運(yùn)行:

public class MyClass {
    public static void main(String[] args) {
        SplashView sv = new SplashView();
    }
}

運(yùn)行結(jié)果:開(kāi)始下載...
          圖片下載完畢...
          展示圖片:張柏芝和冠希哥的圖片下載成功

3.接口實(shí)現(xiàn)回調(diào)(中介租房)

Method1.callback_normal
Step1.定義一個(gè)中介類(lèi)

public class Agent {
    private Person fupo;
    private Dog keji;
    private Cat mCat;

    public void rentHouse(){
        System.out.println("我是中介:開(kāi)始找房源");
        System.out.println("房子找到了祟敛!");
        //返回?cái)?shù)據(jù)
        if (fupo != null){
            fupo.callBackUseQQ("你好");
        }
        if (keji != null){
            keji.callBackUsePhone();
        }
        if (mCat != null){
            mCat.callBackUseMsn();
        }
    }

    public void setFupo(Person fupo){
        this.fupo = fupo;
    }
    public void setKeji(Dog keji){
        this.keji = keji;
    }
    public void setmCat(Cat mCat){
        this.mCat = mCat;
    }
}

Step2.分別定義三個(gè)不同用戶的請(qǐng)求和回應(yīng)

//Person類(lèi)
public class Person {
    public void needOneHouse(){
        //找一個(gè)中介 完成租房功能
        Agent agent = new Agent();
        //告訴他是誰(shuí)讓他做到(告訴他有結(jié)果了返回給誰(shuí))
        agent.setFupo(this);
        //開(kāi)始找房
        agent.rentHouse();
    }
    
    //自己定義一個(gè)接收的方法
    public void callBackUseQQ(String mag){
        System.out.println("辛苦了");
    }
}

//Dog類(lèi)
public class Dog {
    public void wangwang(){
        //找中介
        Agent zs = new Agent();
        //告訴他結(jié)果返回給誰(shuí)(誰(shuí)接收返回的數(shù)據(jù))
        zs.setKeji(this);
        //開(kāi)始找房
        zs.rentHouse();
    }
    
    public void callBackUsePhone(){
        System.out.println("wangwangwang");
    }
}

//Cat類(lèi)
public class Cat {
    public void miaomaio(){
        //找一個(gè)中介 完成租房功能
        Agent agent = new Agent();
        //告訴他是誰(shuí)讓他做的(告訴他有結(jié)果了返回給誰(shuí))
        agent.setmCat(this);
        //開(kāi)始找房
        agent.rentHouse();
    }

    public void callBackUseMsn(){
        System.out.println("maiomiao");
    }
}

很明顯的看到:這種定義方法十分繁瑣而且沒(méi)有必要
對(duì)功能類(lèi)來(lái)說(shuō):
1.每增加一個(gè)使用者疤坝,需要添加一個(gè)成員變量保存;

  • 解決辦法:使用多態(tài)馆铁,用接口類(lèi)型的變量跑揉,接收所有子類(lèi)類(lèi)型

2.寫(xiě)一個(gè)set方法設(shè)置對(duì)象;
3.判斷并且調(diào)用這個(gè)對(duì)象的相應(yīng)方法接收數(shù)據(jù)埠巨;
對(duì)使用者來(lái)說(shuō):
1.必須自己來(lái)定義一個(gè)方法類(lèi)接收數(shù)據(jù)

  • 解決辦法:定義接口历谍,接口中規(guī)范接收的方式

為了解決以上問(wèn)題,我們采用第二種方法:
Method2.callback_interface
Step1.定義一個(gè)中介類(lèi)

public class Agent {
    private OnAgentFinishListener listener;

    public void setListener(OnAgentFinishListener listener) {
        this.listener = listener;
    }

    public void rentHouse(){
        System.out.println("我是中介:開(kāi)始找房源");
        System.out.println("房子找到了辣垒!");
        //回調(diào)數(shù)據(jù)
        if (listener != null){
            listener.onFinish("四合院");
        }
    }

    public interface OnAgentFinishListener{
        void onFinish(String des);
    }
}

Step2.分別定義兩個(gè)不同用戶的請(qǐng)求和回應(yīng)

//Person類(lèi)
public class Person implements Agent.OnAgentFinishListener{
    public void needOneHouse(){
        Agent xw = new Agent();
        xw.setListener(this);
        xw.rentHouse();
    }

    @Override
    public void onFinish(String des) {
        System.out.println("我是pxd 喜歡你的房子:" + des);
    }
}

//Dog類(lèi)
public class Dog implements Agent.OnAgentFinishListener{
    public void wangwang(){
        Agent xw = new Agent();
        xw.setListener(this);
        xw.rentHouse();
    }

    @Override
    public void onFinish(String des) {
        System.out.println("我是旺財(cái) 房子太大了:四合院");
    }
}

這里我們使用接口對(duì)用戶的回應(yīng)方式定了規(guī)范望侈,讓代碼更簡(jiǎn)潔,用戶也不用自己定義回應(yīng)方法勋桶,直接實(shí)行父類(lèi)提供發(fā)的接口就行了

4.接口補(bǔ)充:對(duì)象引用

多態(tài)只能子類(lèi)向父類(lèi)轉(zhuǎn)
接口可視為特殊的父類(lèi)

class Father implements Communicate{

}

abstract class Cute{

}


interface Communicate{
    //接口無(wú)法實(shí)例化
}

class Child extends Father implements Communicate{

}

/**
 * 多態(tài)只能子類(lèi)向父類(lèi)轉(zhuǎn)
 */

public class MyClass {
    public static void main(String[] args) {
        Child a = new Child();
        Father b = new Father();
        test1(a);
        test2(b);
        test3(a);
    }

    public static void test1(Child a){
        //使用的時(shí)候還是要轉(zhuǎn)化為子類(lèi)的對(duì)象 為了讓接口更統(tǒng)一
        System.out.println("孩子是父親的孩子");
    }

    public static void test2(Father b){
        System.out.println("父親");
    }

    public static void test3(Communicate a){
        System.out.println("跟孩子交流");
    }
}

總結(jié)

1.接口就是一套行為規(guī)范脱衙,有了接口,我們能在一套規(guī)范里面做事兒哥遮,免去繁瑣的自行創(chuàng)建步驟岂丘;
2.既然接口做到了規(guī)范一致性,我們就要為這個(gè)規(guī)范提供高質(zhì)量的服務(wù)(豐富的方法眠饮,使用的操作)奥帘,使使用接口的價(jià)值更大!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末仪召,一起剝皮案震驚了整個(gè)濱河市寨蹋,隨后出現(xiàn)的幾起案子松蒜,更是在濱河造成了極大的恐慌,老刑警劉巖已旧,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秸苗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡运褪,警方通過(guò)查閱死者的電腦和手機(jī)惊楼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)秸讹,“玉大人檀咙,你說(shuō)我怎么就攤上這事×Ь鳎” “怎么了弧可?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)劣欢。 經(jīng)常有香客問(wèn)我棕诵,道長(zhǎng),這世上最難降的妖魔是什么凿将? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任校套,我火速辦了婚禮,結(jié)果婚禮上丸相,老公的妹妹穿的比我還像新娘搔确。我一直安慰自己,他們只是感情好灭忠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布膳算。 她就那樣靜靜地躺著,像睡著了一般弛作。 火紅的嫁衣襯著肌膚如雪涕蜂。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,215評(píng)論 1 299
  • 那天映琳,我揣著相機(jī)與錄音机隙,去河邊找鬼。 笑死萨西,一個(gè)胖子當(dāng)著我的面吹牛有鹿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谎脯,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼葱跋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起娱俺,我...
    開(kāi)封第一講書(shū)人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤稍味,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后荠卷,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體模庐,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年油宜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掂碱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡慎冤,死狀恐怖顶吮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情粪薛,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布搏恤,位于F島的核電站违寿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏熟空。R本人自食惡果不足惜藤巢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望息罗。 院中可真熱鬧掂咒,春花似錦、人聲如沸迈喉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)挨摸。三九已至孩革,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間得运,已是汗流浹背膝蜈。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留熔掺,地道東北人饱搏。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像置逻,于是被迫代替她去往敵國(guó)和親推沸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354