国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java思想之容器implements與接口interface

MockingBird / 3157人閱讀

摘要:類似于中的事件驅動函數,當有事件發生時候,通過回調函數,通知主函數。一旦或內的某個函數觸發了某個事件,就能通過監聽接口發送給主函數,類似中的事件回調函數。父類與子類通過實現接口調用,此時即為父類本身。

  

http://homeway.me/


0x01.About

查了一些國內資料,都說java中extended與implements的區別是,一個類只能有一個繼承,一個類可以有多個容器。

后來去看了些國外資料。

在我理解上,interface就是一個公共的類,可以包含公共函數、變量。

Java接口是用于指定一組抽象方法的類來實現一個抽象類型。

當一個類實現一個接口,它必須繼承所有的內聲明的抽象方法,好像簽訂了一份合同,并履行協議。


0x02.Example

先來看看怎么聲明一個接口,文件保存為 InterFace.java

public class InterFace {
    public static void main(String[] args) {
        MyTest x = new MyTest();
        x.speak();
        x.say();
        x.fuck();
    }
}
class MyTest implements MyInterface2, MyInterface3 {
    @Override
    public void speak() {
        System.out.println("MyTest Called => jump() =>"+MyInterface.hello);
    }
    @Override
    public void fuck() {
        System.out.println("MyTest Called => fuck()");
    }
    @Override
    public void say() {
        System.out.println("MyTest Called => say()");
    }    
}
interface MyInterface1{
    public String hello = "hello";
    public void speak();
}
interface MyInterface2{
    public int num = 1;
    public void fuck();
}
// 接口之間可以相互繼承
interface MyInterface3 extends MyInterface1{
    public void say();
}

輸出如下:

$javac InterFace.java
$java InterFace

MyTest Called => jump() =>hello
MyTest Called => say()
MyTest Called => fuck()

這里我們聲明了3個接口,并且interface3繼承自interface1,所以當類容器導入接口interface3就會導入父類接口interface1。

只要添加了容器implements,就會包含接口中的所有東西,所以必須在MyTest類中添加該重寫函數,否則找不到該函數會報錯。

再看下面一個例子,多個類共同使用一個interface接口,保存為Account.java

interface Transaction {
    int BALANCE = 500;
    Object transaction(Object input);
}
class CurrentAccount implements Transaction {
    int bal;
    public Object transaction(Object input) {
        this.bal = BALANCE - (int)input;
        return bal;
    }
    public String toString() { return "Current acc"; }
}
class SavingsAccount implements Transaction {
    int bal;
    public Object transaction(Object input) {
        this.bal = BALANCE + (int)input;
        return bal;
    }
    public String toString() { return "Savings acc"; }
}
public class Account {
    public static void payment(Transaction t, Object input) {
        System.out.println(t + " is debited:   " +  t.transaction(input));
    }
    public static void deposit(Transaction t, Object input) {
        System.out.println(t + " is credited:   " +  t.transaction(input));
    }
    public static void main(String[] args) {
        Integer input = new Integer(600);
        deposit(new SavingsAccount(), input);
        payment(new CurrentAccount(), input);
    }
}

代碼輸出:

$javac Account.java
$java Account

Savings acc is credited:   1100
Current acc is debited:   -100

一個接口可以供多個類共同使用,并且多個類之間使用不沖突,這樣看來,interface倒有點像是靜態函數了。

觀察一下這兩個實現類活期賬戶和儲蓄賬戶自動的向上轉型在接受Transaction接口Account類中的方法。

payment()和deposit()方法利用我們所講的戰略設計模式,代表了接口的實現完全脫鉤的一個實例。

從理論上說,你可以適應任何類,只需使它們符合的界面,使用這些方法。

對于接口與容器,我見過的一個更具有實用價值的地方,在于類之間的監聽函數調用。

類似于js中的事件驅動函數,當有事件發生時候,通過回調函數,通知主函數。

實例代碼如下,文件命名為Homeway.java:

public class Homeway {
    public static void main(String[] args) {
        System.out.println("
=======================Implements======================
");
        ClassImplements mClassImplements = new ClassImplements();
        mClassImplements.run();
    }
}
class ClassImplements implements Implements1.Listener {
    public Implements1 mImplements1 = null;
    public ClassImplements(){
        mImplements1 = new Implements1();
        mImplements1.setListener(this);
    }
    @Override
    public void onCallStart(){
        System.out.println("ClassImplements => onCallStart()");
    }
    @Override
    public void onCallStop(){
        System.out.println("ClassImplements => onCallStop()");
    }
    public void run(){
        mImplements1.run();
    }
}
//test 2level implements for class
class Implements1 implements Implements2.Listener {
    private Listener mListener;
    private Implements2 mImplements2;
    public Implements1(){
        mImplements2 = new Implements2();//把當前類傳給下個類
        mImplements2.setListener(this);
        System.out.println("Init Implements1 =>...");
    }
    public static interface Listener {
        void onCallStart();
        void onCallStop();
    }
    public void setListener(Listener listener) {
        mListener = listener;
    }
    @Override
    public void onCallStart(){
        System.out.println("Implements1 => onCallStart()");
        mListener.onCallStart();//call at Implements1 and then throw to ClassImplements
    }
    @Override
    public void onCallStop(){
        System.out.println("Implements1 => onCallStop()");
        mListener.onCallStop();//call at Implements1 and then throw to ClassImplements
    }
    public void run(){
        this.mImplements2.run();
    }
}

//3 level implement test
class Implements2{
    private Listener mListener;
    public Implements2(){
        System.out.println("Init Implements2 =>...");
    }
    public static interface Listener {
        void onCallStart();
        void onCallStop();
    }
    public void setListener(Listener listener) {
        mListener = listener;
    }
    public void onCallStart(){
        System.out.println("Implements2 => onCallStart()");
    }
    public void onCallStop(){
        System.out.println("Implements2 => onCallStop()");
    }
    public void run() {
        System.out.println("Run some functions and then callback from Listener...");
        mListener.onCallStart();
        mListener.onCallStop();
    }

}

輸出如下:

$javac Homeway.java
$java Homeway
=======================Implements======================
Init Implements2 =>...
Init Implements1 =>...
Run some functions and then callback from Listener...
Implements1 => onCallStart()
ClassImplements => onCallStart()
Implements1 => onCallStop()
ClassImplements => onCallStop()

我們先是聲明了類ClassImplements,這個是我們的主類,并且implements了Implements1.Listener通過一個Listener建立了監聽接口,

然后Implements1又implements了Implements2.Listener建立了第2級的監聽。

一旦Implements1Implements2內的某個函數觸發了某個事件,就能通過監聽接口發送給主函數ClassImplements,類似js中的事件回調函數。

父類與子類通過Listener實現接口調用,此時Listener即為父類本身。

大致的模型如下:

implements容器與interface接口在java類中有很多很好用的模型,有時間該多去研究研究。


參考資料:

《Java Interfaces》

《Java interfaces and the concept of multiple inheritance》

《Java Interface Example, Explanation, and Implementation》

本文出自 夏日小草,轉載請注明出處: http://homeway.me/2015/04/13/java-implements-and-interface/ by 小草 2015-04-13 20:10:20

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/64316.html

相關文章

  • java編程思想》—— 泛型

    摘要:引用泛型除了方法因不能使用外部實例參數外,其他繼承實現成員變量,成員方法,方法返回值等都可使用。因此,生成的字節碼僅包含普通的類,接口和方法。 為什么要使用泛型程序設計? 一般的類和方法,只能使用具體的類型:要么是基本類型,要么是自定義類的對應類型;如果要編寫可以應用于多種類型的代碼,這種刻板的限制對代碼的束縛就會很大。----摘自原書Ordinary classes and meth...

    CODING 評論0 收藏0
  • Java編程思想》筆記9.接口

    摘要:抽象類和抽象方法抽象方法這種方法是不完整的,僅有聲明而沒有方法。創建抽象類和抽象方法非常有用,因為他們可以使累的抽象性明確起來,并告訴用戶和編譯器打算怎樣來使用它們。接口用于建立類于類之間的協議。與抽象類相同,防止客戶端程序員創建該類對象。 點擊進入我的博客 接口和內部類為我們提供了一種將接口與實現分離的更加結構化的方法。 9.1抽象類和抽象方法 抽象方法:這種方法是不完整的,僅有...

    JessYanCoding 評論0 收藏0
  • 設計模式享元模式

    摘要:類圖相關的設計模式享元模式和代理模式當代理模式消耗性能比較大的時候,就可以用享元模式享元模式和單例模式容器單例,享元模式就是復用對象的思想。源碼中的享元模式源碼地址享元模式參考慕課網設計模式精講設計模式讀書筆記享元模式 0x01.定義與類型 定義:提供了減少對象數量從而改善應用所需的對象結構的方法,系統使用少量對象,而且這些都比較相似,狀態變化小,可以實現對象的多次復用。 運用共享技...

    vvpale 評論0 收藏0
  • 慕課網_《模式的秘密工廠模式》學習總結

    摘要:時間年月日星期日說明本文部分內容均來自慕課網。這對所有形態的工廠模式都是重要的這個系統的產品有至少一個的產品族同屬于一個產品族的產品是設計成在一起使用的。 時間:2017年08月27日星期日說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s...學習源碼:https://github.c...

    jsyzchen 評論0 收藏0
  • Java 學習筆記

    摘要:參考資料程序設計北大唐大仕零基礎學語言浙大翁愷面向對象程序設計語言浙大翁愷在里面搜索可以查看和修改快捷鍵自動補全代碼格式化簡介歷史與一起發展萬維網所有信息用鏈接連接起來靜態網頁動態網頁的出現年開發工具包語法增加廣泛動態編譯腳本 參考資料 Java程序設計 - 北大 - 唐大仕 零基礎學Java語言 - 浙大 - 翁愷 面向對象程序設計——Java語言 - 浙大 - 翁愷 Ecl...

    tianlai 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<