目錄
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à)值更大!