接口
一、關(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,喜歡你的房子
好的,謝謝