1. 程式人生 > >java中介面是否可以繼承多個介面?

java中介面是否可以繼承多個介面?

以下內容轉自:http://blog.csdn.net/tiantiandjava/article/details/46514783

介面是常量值和方法定義的集合。介面是一種特殊的抽象類。

java類是單繼承的。classB Extends classA

java介面可以多繼承。Interface3 Extends Interface0, Interface1, interface……

不允許類多重繼承的主要原因是,如果A同時繼承B和C,而B和C同時有一個D方法,A如何決定該繼承那一個呢?

但介面不存在這樣的問題,介面全都是抽象方法繼承誰都無所謂,所以介面可以繼承多個介面。

注意:

1)一個類如果實現了一個介面,則要實現該介面的所有方法。

2)方法的名字、返回型別、引數必須與介面中完全一致。如果方法的返回型別不是void,則方法體必須至少有一條return語句。

3)因為介面的方法預設是public型別的,所以在實現的時候一定要用public來修飾(否則預設為protected型別,縮小了方法的使用範圍)。

 

以下內容轉自:http://www.cnblogs.com/littlepanpc/p/3616300.html

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:

 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 }

 

注意,裡面聲明瞭三個方法和一個變數;

然後再與了一個介面: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 }

裡面也聲明瞭三個方法和一個變數;

然後再定義了一個介面InterfaceMultiInheritance.java同時繼承了介面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 }

裡面聲明瞭兩個方法和一個變數;

注意,在這三個介面中,有一個共同的方法宣告:get()。這個都是要討論的主題。

最後在一個類InterfaceImplementTest.java中實現了介面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 }

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

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

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 }

 

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

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