java中接口之間的繼承

最近在讀一些源碼的時候突然發現了一個很神奇的東西,它的原始形態是這樣的:

在這行代碼中,BlockingDeque、BlockingQueue和Deque是三個接口。剛發現這個問題時,我是十分喫驚的,因爲即使在《Thinking in Java》中也沒有提到接口之間的繼承。所以我立即把這個疑問提交到了stackoverflow上面。

這個問答的過程十分簡單,在這個鏈接上面的:http://stackoverflow.com/questions/22498245/one-uncertainty-on-multiple-inheritance-in-universal-image-loader

#########################################

正如在stackoverflow上面所討論的一樣,一個類只能extends一個父類,但可以implements多個接口。java通過使用接口的概念來取代C++中多繼承。與此同時,一個接口則可以同時extends多個接口,卻不能implements任何接口。因而,Java中的接口是支持多繼承的。

然後我又做了個實驗,來驗證如果多個父子接口中有多個相同的方法聲明,然後在實現這個最終的接口的時候,相同的方法聲明在實現的時候會不會有衝突呢?

首先寫了個接口:TestInterfaceA.java:

package com.peter.java.dsa.interfaces;

public interface TestInterfaceA {
    String pri_key = "guess what the private key is";

    int add(int x, int y);

    String encryt(byte[] result);

    int get();
}

注意,裏面聲明瞭三個方法和一個變量;

然後再與了一個接口:TestInterfaceB.java:

package com.peter.java.dsa.interfaces;

public interface TestInterfaceB {
    String pub_key = "guess what the public key is";

    int minus(int x, int y);

    byte[] decryt(String src);

    int get();
}

裏面也聲明瞭三個方法和一個變量;

然後再定義了一個接口InterfaceMultiInheritance.java同時繼承了接口TestInterfaceA.java和接口TestInterfaceB.java:

package com.peter.java.dsa.interfaces;

public interface InterfaceMultiInheritance extends TestInterfaceA,
        TestInterfaceB {
    int num = 1024;

    double divide(int x, int y);

    int get();
}

裏面聲明瞭兩個方法和一個變量;

注意,在這三個接口中,有一個共同的方法聲明:get()。這個都是要討論的主題。

最後在一個類InterfaceImplementTest.java中實現了接口InterfaceMultiInheritance.java,源碼如下:

package com.peter.java.dsa.common;

import com.peter.java.dsa.interfaces.InterfaceMultiInheritance;
import com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException;
import com.sun.org.apache.xml.internal.security.utils.Base64;

public class InterfaceImplementTest implements InterfaceMultiInheritance {

    @Override
    public int add(int x, int y) {
        // TODO Auto-generated method stub
        return x + y;
    }

    @Override
    public String encryt(byte[] result) {
        // TODO Auto-generated method stub
        return Base64.encode(result);
    }

    @Override
    public int minus(int x, int y) {
        // TODO Auto-generated method stub
        return x - y;
    }

    @Override
    public byte[] decryt(String src) {
        // TODO Auto-generated method stub
        try {
            return Base64.decode(src);
        } catch (Base64DecodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public double divide(int x, int y) {
        // TODO Auto-generated method stub
        return x/y;
    }

    @Override
    public int get() {
        // TODO Auto-generated method stub
        return num;
    }
    
    public void print() {
        System.out.println("The public key is: "+pub_key+"\nThe private key is: "+pri_key);
    }

}

在這個類中,只有一個get方法實現了,同時也沒有爲有多個get要實現而衝突。同時,如果刪除了接口InterfaceMultiInheritance.java中的get方法,也只有一個get方法得到了實現並且沒有爲多個get要實現而出現什麼衝突。

所以,我們可以得到一個結論,當編譯器在實現接口的時候會依然檢查接口InterfaceMultiInheritance.java、TestInterfaceA.java和TestInterfaceB.java中的方法聲明,如果後兩者有與前者相沖突的方法聲明,編譯器將只要求類實現前者的聲明,而後兩者中相同的方法聲明將自動被忽略。而當只有後兩者中有相同的方法聲明時,編譯器將實現其中的一個即可。就好像是編譯器中有一個專門存儲方法聲明的Set一樣,在有繼承關係的接口中,只保存一次相同的方法聲明。


原文地址:http://www.cnblogs.com/littlepanpc/p/3616300.html

如有問題請聯繫,謝謝!侵刪。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章