Java實(shí)戰(zhàn)開(kāi)發(fā)篇-6 接口

接口

一、關(guān)鍵字和使用規(guī)則

1.關(guān)鍵字:interface
說(shuō)明:接口類似于抽象類,有點(diǎn)像模板
用處:減少代碼量,且降低代碼耦合度
2.使用規(guī)則
(1)接口不能被實(shí)例化,即不能創(chuàng)造對(duì)象,所以沒(méi)有構(gòu)造方法
(2)接口中的變量只能是靜態(tài)成員常量
(3)接口的默認(rèn)修飾符是static final,所以聲明接口的時(shí)候不用再寫修飾符
(4)接口之間可以互相實(shí)現(xiàn)繼承,并且接口可以多繼承。這也是Java語(yǔ)言間接實(shí)現(xiàn)多繼承的方法
(5)接口中的方法一般為抽象方法,不能在接口中實(shí)現(xiàn),只能在使用這個(gè)接口的類里面去實(shí)現(xiàn)(模板)
(6)接口中的方法默認(rèn)修飾符為public abstract

二、接口使用方法:

修飾符 class 類名 implements 接口名1,接口名2...

//定義一個(gè)接口
public interface Student{
  void observe();
}
public class Student implements Student{
  void observe(){
System.out.println("姓名")
}
}

當(dāng)只需要使用到接口內(nèi)的某一個(gè)方法時(shí),可以使用內(nèi)部接口
通過(guò)修飾符 class 類名 implements 接口名1.內(nèi)部接口1,接口名1.內(nèi)部接口2,接口名2.內(nèi)部接口1
實(shí)現(xiàn)一接口對(duì)應(yīng)一方法

//定義一個(gè)接口內(nèi)接口
public interface Student {
    void observe();
    public interface write{
    void read();
    }
}
public class Student implements Student.write{
    void read(){
System.out.println("姓名")
}
}

三、接口最常用功能

實(shí)現(xiàn)數(shù)據(jù)回調(diào),通過(guò)下面找“中介租房子”例子來(lái)看使用接口的好處

//新建一個(gè)類Person,這個(gè)Person的對(duì)象需要租房子
class Person {
    public void needOneHouse(){
        //找一個(gè)中介,完成租房
        System.out.println("我想看下房子");
        Agent agent = new Agent();
        agent.setXM(this);
        agent.rentHouse();
    }
    public void callBackMSG(){
    }
    public void Thanks(){
        System.out.println("好的,謝謝");
    }
}
//如果Somebody也要租房子,看看在之后有多麻煩
class Somebody{
    public void needOneHouse(){
        //找一個(gè)中介,完成租房
        System.out.println("我想看下房子");
        Agent agent = new Agent();
        agent.setSome(this);
        agent.rentHouse();
    }
    public void callBackQQ(){
        
    }
    public void Thanks(){
        System.out.println("好的,謝謝");
    }
}
//定義一個(gè)中介類,實(shí)現(xiàn)租房子的功能
class Agent {
    private Person XM;
    private Somebody some;//每新增一個(gè)客戶,都要?jiǎng)?chuàng)建一個(gè)對(duì)象
    public void rentHouse(){
        System.out.println("幫你找房子");
        if(XM!= null){
        XM.callBackMSG();
    }
    if(some!= null){
        some.callBackQQ();
    }//這里必須加判斷語(yǔ)句,因?yàn)榈谝淮问菆?zhí)行XM的方法,還沒(méi)有創(chuàng)建好some對(duì)象,負(fù)責(zé)會(huì)報(bào)錯(cuò)
        System.out.println("我是中介,房子找到了");
    }
    public Person getXM() {
        return XM;
    }
    public void setXM(Person xM) {
        this.XM = xM;
    }
    public Somebody getSome() {
        return some;
    }
    public void setSome(Somebody some) {
        this.some = some;
    }
}
public class MyClass {
    public static void main(String[] args) {
        Agent a = new Agent();
        Person p = new Person();
        Somebody Some = new Somebody();
        p.needOneHouse();
        p.callBackMSG();
        p.Thanks();
        Some.needOneHouse();
        Some.callBackQQ();
        Some.Thanks();
    }
}

結(jié)果為
我想看下房子
幫你找房子
好的,謝謝
我想看下房子
幫你找房子
我是中介,房子找到了
好的,謝謝

從上面例子就可以看出,每增加一個(gè)對(duì)象,就需要寫許多功能重復(fù)的代碼,如果對(duì)象非常多,就很麻煩了
這個(gè)時(shí)候就可以體現(xiàn)出接口的好處
我們使用接口來(lái)改一下這個(gè)代碼
步驟
1.定義一個(gè)接口,統(tǒng)一返回?cái)?shù)據(jù)的方式
2.定義一個(gè)變量接收誰(shuí)來(lái)監(jiān)聽(tīng)網(wǎng)絡(luò)下載完畢的事件
3.提供set方法保存當(dāng)前監(jiān)聽(tīng)者
4.任務(wù)結(jié)束 回調(diào)數(shù)據(jù)
5.必須實(shí)現(xiàn)接口內(nèi)部的所有抽象方法
6.必須傳遞當(dāng)前對(duì)象給功能類
7.調(diào)用功能類,完成功能

public class Agent {
     private onAgentFinishListener listener;//用接口類型使用所有類型
     public void rentHouse(){
         if(listener!=null){
             System.out.println("幫你找房子");
             System.out.println("我是中介,房子找到了");
             listener.OnFinish("四合院");
         }
     }
    
     public interface onAgentFinishListener{
         void OnFinish(String msg);//找到房子后,用來(lái)回復(fù)
     }
    public onAgentFinishListener getListener() {
        return listener;
    }
    public void setListener(onAgentFinishListener listener) {
        this.listener = listener;
    }
}

class Person implements Agent.onAgentFinishListener {
    public void needOneHouse(){
        //找一個(gè)中介,完成租房
        Agent xm = new Agent();
        xm.setListener(this);
        System.out.println("我想看下房子");
        xm.rentHouse();
    }
    public void Thanks(){
        System.out.println("好的,謝謝");
    }
    @Override
    public void OnFinish(String msg) {
    System.out.println("我是xm,喜歡你的房子");
    }
}

class Somebody implements Agent.onAgentFinishListener{
    public void needOneHouse(){
        //找一個(gè)中介,完成租房
        Agent some = new Agent();
        some.setListener(this);
        System.out.println("我想看下房子");
        some.rentHouse();
    }
    public void Thanks(){
        System.out.println("好的,謝謝");
    }
    @Override
    public void OnFinish(String msg) {
    System.out.println("我是some,喜歡你的房子");
    }
}

結(jié)果為
我想看下房子
幫你找房子
我是中介,房子找到了
我是xm,喜歡你的房子
好的,謝謝
我想看下房子
幫你找房子
我是中介,房子找到了
我是some,喜歡你的房子
好的,謝謝

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容