中文JAVA技術(shù)平等自由協(xié)作創(chuàng)造

          Java專題文章博客和開(kāi)源

          常用鏈接

          統(tǒng)計(jì)

          最新評(píng)論

          java中接口之間的繼承

            最近在讀一些源碼的時(shí)候突然發(fā)現(xiàn)了一個(gè)很神奇的東西,它的原始形態(tài)是這樣的:
            在這行代碼中,BlockingDeque、BlockingQueue和Deque是三個(gè)接口。剛發(fā)現(xiàn)這個(gè)問(wèn)題時(shí),我是十分吃驚的,因?yàn)榧词乖凇禩hinking in Java》中也沒(méi)有提到接口之間的繼承。所以我立即把這個(gè)疑問(wèn)提交到了stackoverflow上面。
            正如在stackoverflow上面所討論的一樣,一個(gè)類只能extends一個(gè)父類,但可以implements多個(gè)接口。java通過(guò)使用接口的概念來(lái)取代C++中多繼承。與此同時(shí),一個(gè)接口則可以同時(shí)extends多個(gè)接口,卻不能implements任何接口。因而,Java中的接口是支持多繼承的。
            然后我又做了個(gè)實(shí)驗(yàn),來(lái)驗(yàn)證如果多個(gè)父子接口中有多個(gè)相同的方法聲明,然后在實(shí)現(xiàn)這個(gè)最終的接口的時(shí)候,相同的方法聲明在實(shí)現(xiàn)的時(shí)候會(huì)不會(huì)有沖突呢?
            首先寫了個(gè)接口:TestInterfaceA.java:
            1 package com.peter.java.dsa.interfaces;
            2
            3 public interface TestInterfaceA {
            4 String pri_key = "guess what the private key is";
            5
            6 int add(int x, int y);
            7
            8 String encryt(byte[] result);
            9
            10 int get();
            11 }
            注意,里面聲明了三個(gè)方法和一個(gè)變量;
            然后再與了一個(gè)接口:TestInterfaceB.java:
            1 package com.peter.java.dsa.interfaces;
            2
            3 public interface TestInterfaceB {
            4 String pub_key = "guess what the public key is";
            5
            6 int minus(int x, int y);
            7
            8 byte[] decryt(String src);
            9
            10 int get();
            11 }
            里面也聲明了三個(gè)方法和一個(gè)變量;
            然后再定義了一個(gè)接口InterfaceMultiInheritance.java同時(shí)繼承了接口TestInterfaceA.java和接口TestInterfaceB.java:
            1 package com.peter.java.dsa.interfaces;
            2
            3 public interface InterfaceMultiInheritance extends TestInterfaceA,
            4 TestInterfaceB {
            5 int num = 1024;
            6
            7 double divide(int x, int y);
            8
            9 int get();
            10 }
            里面聲明了兩個(gè)方法和一個(gè)變量;
            注意,在這三個(gè)接口中,有一個(gè)共同的方法聲明:get()。這個(gè)都是要討論的主題。
            最后在一個(gè)類InterfaceImplementTest.java中實(shí)現(xiàn)了接口InterfaceMultiInheritance.java,源碼如下:
            1 package com.peter.java.dsa.common;
            2
            3 import com.peter.java.dsa.interfaces.InterfaceMultiInheritance;
            4 import com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException;
            5 import com.sun.org.apache.xml.internal.security.utils.Base64;
            6
            7 public class InterfaceImplementTest implements InterfaceMultiInheritance {
            8
            9 @Override
            10 public int add(int x, int y) {
            11 // TODO Auto-generated method stub
            12 return x + y;
            13 }
            14
            15 @Override
            16 public String encryt(byte[] result) {
            17 // TODO Auto-generated method stub
            18 return Base64.encode(result);
            19 }
            20
            21 @Override
            22 public int minus(int x, int y) {
            23 // TODO Auto-generated method stub
            24 return x - y;
            25 }
            26
            27 @Override
            28 public byte[] decryt(String src) {

            29 // TODO Auto-generated method stub
            30 try {
            31 return Base64.decode(src);
            32 } catch (Base64DecodingException e) {
            33 // TODO Auto-generated catch block
            34 e.printStackTrace();
            35 }
            36 return null;
            37 }
            38
            39 @Override
            40 public double divide(int x, int y) {
            41 // TODO Auto-generated method stub
            42 return x/y;
            43 }
            44
            45 @Override
            46 public int get() {
            47 // TODO Auto-generated method stub
            48 return num;
            49 }
            50
            51 public void print() {
            52 System.out.println("The public key is: "+pub_key+"\nThe private key is: "+pri_key);
            53 }
            54
            55 }
            在這個(gè)類中,只有一個(gè)get方法實(shí)現(xiàn)了,同時(shí)也沒(méi)有為有多個(gè)get要實(shí)現(xiàn)而沖突。同時(shí),如果刪除了接口InterfaceMultiInheritance.java中的get方法,也只有一個(gè)get方法得到了實(shí)現(xiàn)并且沒(méi)有為多個(gè)get要實(shí)現(xiàn)而出現(xiàn)什么沖突。
            所以,我們可以得到一個(gè)結(jié)論,當(dāng)編譯器在實(shí)現(xiàn)接口的時(shí)候會(huì)依然檢查接口InterfaceMultiInheritance.java、TestInterfaceA.java和TestInterfaceB.java中的方法聲明,如果后兩者有與前者相沖突的方法聲明,編譯器將只要求類實(shí)現(xiàn)前者的聲明,而后兩者中相同的方法聲明將自動(dòng)被忽略。而當(dāng)只有后兩者中有相同的方法聲明時(shí),編譯器將實(shí)現(xiàn)其中的一個(gè)即可。就好像是編譯器中有一個(gè)專門存儲(chǔ)方法聲明的Set一樣,在有繼承關(guān)系的接口中,只保存一次相同的方法聲明 www.jx-jf.com

          posted on 2014-03-23 09:49 好不容易 閱讀(227) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          PK10開(kāi)獎(jiǎng) PK10開(kāi)獎(jiǎng)
          主站蜘蛛池模板: 柏乡县| 彭州市| 泰来县| 潢川县| 怀安县| 西平县| 措美县| 香河县| 黑河市| 灵宝市| 五河县| 常熟市| 尉氏县| 霞浦县| 清徐县| 砚山县| 保山市| 中方县| 广饶县| 磐石市| 通道| 铜川市| 樟树市| 陵水| 津市市| 武安市| 鹤壁市| 昭苏县| 樟树市| 兰州市| 阿拉善盟| 大同县| 将乐县| 凯里市| 武乡县| 乌拉特后旗| 临澧县| 望谟县| 泸州市| 封开县| 治县。|