Java 接口多繼承


按照理解,一般都是說Java 類是單繼承,但可以實現多個接口。但是可以通過接口來實現類的多繼承。(如何通過接口來實現多繼承???)

那么就一直以為Java里面是單繼承,今天看FutureTask源碼的時候發現,接口居然可以實現多繼承,通過下面例子學習下。

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

下面先對接口做個總結:

1>接口中的成員變量默認都是public,static,final(都可省略),必須被顯示初始化,即接口中的成員變量必須是常量。

2>接口中的方法默認都是public abstract類型的(都可省略),沒有方法體。

3>接口中只能包含public abstract類型的成員方法和public static final類型的成員變量。

4>接口中沒有構造方法,不能被實例化

5>一個接口不能實現(implements)另一個接口,但是可以多繼承接口

6>Java中必須通過類來實現接口中的抽象方法

7>當類實現了某個Java接口時,它必須實現接口中的所有抽象方法,否則這個類必須聲明為抽象類

8>不允許創建接口的實例(實例化),但允許定義接口類型的引用變量,該引用變量引用實現了這個接口的類的實例
9>一個類只能繼承一個直接的父類,但可以實現多個接口,間接的實現了多繼承

下面給一個接口多繼承的例子,注意打印的a的值

 1 package Lesson1218Thread;
 2 
 3 public interface TestIFA {
 4     int a = 0;
 5     int b = 1;
 6     int c = 2;
 7     
 8     void printInfo();
 9 
10 }
11 
12 package Lesson1218Thread;
13 
14 public interface TestIFB {
15     int a = 4;
16     int b = 5;
17     int c = 6 ;    
18     
19     void printInfo();
20 }
21 
22 package Lesson1218Thread;
23 
24 public interface TestIFC extends TestIFA,TestIFB {
25     //int d = 4;
26     int a = 7;
27 }
28 
29 package Lesson1218Thread;
30 
31 public class IFDemo implements TestIFC{
32 
33     public static void main(String[] args) {
34         
35         IFDemo ifdemo = new IFDemo();
36         System.out.println("a is "+ifdemo.a);  //a is 7, 因為這個地方實現接口TestIFC, 若是TestIFB, 則輸出a is 4.
37         
38     }
39 
40     @Override
41     public void printInfo() {
42         System.out.println("which IF ?????");
43         
44     }
45 
46 }

重點關注line36,   測試類實現哪個接口,輸出的a就是哪個接口定義的值。

問題1:若同時實現兩個接口,調用里面相同變量 , 編譯錯誤。 如下:

 1 package Lesson1218Thread;
 2 
 3 public class IFDemo implements TestIFA,TestIFC{   //同時實現兩個接口
 4 
 5     public static void main(String[] args) {
 6         
 7         IFDemo ifdemo = new IFDemo();
 8         System.out.println("a is "+ifdemo.a);  //編譯錯誤
 9         
10     }
11 
12     @Override
13     public void printInfo() {
14         System.out.println("which IF ?????");
15         
16     }
17 
18 }

line8 會報編譯錯誤: The field ifdemo.a is ambiguous

程序不能找到應該調用哪個里面的a.

結論:接口多繼承時,接口里面有定義相同的變量,如果實現類要調用相同變量,必須顯示指出來。如 TestIFA.a 。

問題2:同時實現兩個接口,若接口中的成員方法名字相同,但是返回值不一樣,

 1 package Lesson1218Thread;
 2 
 3 public interface TestIFA {
 4     int a = 0;
 5     int b = 1;
 6     int c = 2;
 7     
 8     void printInfo();
 9 
10 }
11 
12 package Lesson1218Thread;
13 
14 public interface TestIFB {
15     int a = 4;
16     int b = 5;
17     int c = 6 ;    
18     
19     String printInfo();
20 }
21 
22 package Lesson1218Thread;
23 
24 public interface TestIFC extends TestIFA,TestIFB {  //編譯錯誤 25     //int d = 4;
26     int a = 7;
27 }

接口TestIFA中含有成員方法void printInfo();   而接口TestIFB中含有成員方法String printInfo();  兩個成員方法返回值不一樣。

接口TestIFC想繼承上面兩個類,編譯錯誤。The return types are incompatible for the inherited methods TestIFA.printInfo(), TestIFB.printInfo()

結論:被多繼承的接口中,不能有方法名相同,但是返回值不一樣的函數。否則沒法多繼承。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM