Java學習筆記之接口


一、接口的概念與定義

首先考慮一個簡單的接口的定義:

public interface Output { int MAX_LINE = 40; void out(); void getData(String msg); }
  • 定義接口使用關鍵字interface
  • 修飾符interface前面的public可以省略,如果省略,則采用默認訪問控制,即只有在相同包結構的代碼才可以訪問此接口
  • 接口不可以有構造方法(區別於類中的構造方法)
  • 接口里面的所有成員,包括常量、方法等都是public訪問權限,所以在定義接口里面的成員時,可以省略訪問控制修飾符,非要修飾一下子,也只能用public
  • 接口里面的屬性(即成員變量)只能是常量,而且全部具有public, static, final三種性質,因此,在接口里面,如下兩行語句完全等價:
int MAX_LINE = 40; public static final int MAX_LINE = 40;

 

  •  接口里面的方法只能是抽象方法,即只聲明一下函數類型,名稱和參數列表,但是不可以提供具體實現

二、接口的繼承

考慮如下代碼:

 1 interface A  2 {  3     int PROP_A = 5;  4     void testA();  5 }  6 interface B  7 {  8     int PROP_B = 6;  9     void testB(); 10 } 11 interface C extends A, B 12 { 13     int PROP_C = 7; 14     void testC(); 15 } 16 
17 public class myJavaTest 18 { 19     public static void main(String[] args) 20  { 21  System.out.println(C.PROP_A); 22  System.out.println(C.PROP_B); 23  System.out.println(C.PROP_C); 24         
25  } 26 }

 

輸出:

5

6

7

  • 接口的繼承和類的繼承不一樣,接口支持多繼承,多個父接口排在extends關鍵字之后,多個父接口之間用逗號隔開,如上面11行所示,子接口C繼承了父接口A和B
  • 子接口繼承類父接口之后,可以獲得它們的成員常量的訪問權限。如21 -23行通過子接口C可以訪問父接口A,B的成員常量PROP_A和PROP_B

三、接口的實現和定義

考慮如下程序:

 1 interface Output  2 {  3     int MAX_LINE = 4;  4     void out();  5     void getData(String msg);  6 }  7 
 8 interface Product  9 { 10     int getProductTime(); 11 } 12 
13 //實現簡單的打印作業
14 public class Printer implements Output, Product 15 { 16     private String[] printData = new String[MAX_LINE]; 17     private int dataNum = 0; // 記錄需要打印的作業數
18     
19     public void out() 20  { 21         while (dataNum > 0) 22  { 23             System.out.println("打印機打印" + printData[0]); 24             
25             //把作業隊列整體前移一位,並將剩下的作業數減1
26             System.arraycopy(printData, 1, printData, 0, --dataNum); 27  } 28         
29  } 30 
31  @Override 32     public int getProductTime() { 33         // TODO Auto-generated method stub
34         return 45; 35  } 36 
37  @Override 38     public void getData(String msg) 39  { 40         if (dataNum >= MAX_LINE) 41  { 42             System.out.println("輸出隊列已滿,添加失敗"); 43  } 44         else
45  { 46             //把打印數據添加到隊列里,作業數加1
47             printData[dataNum++] = msg; 48  } 49  } 50     public static void main(String[] args) 51  { 52         //創建一個Printer對象,當成Output使用
53         Output O = new Printer(); 54         O.getData("123"); 55         O.getData("456"); 56         O.getData("789"); 57         O.getData("ABC"); 58         O.getData("def"); 59  O.out(); 60         //創建一個Printer對象,當成Product使用
61         Product P = new Printer(); 62  System.out.println(P.getProductTime()); 63  } 64 }

 

輸出:

輸出隊列已滿,添加失敗
打印機打印123
打印機打印456
打印機打印789
打印機打印ABC
45

  • 接口不能用於實例化,但是接口可以聲明引用類型的變量,如53行,接口Output聲明了一個引用變量O的類型是Output,61行,接口Product聲明了一個引用變量P的類型是Product.
  • 接口的實現需要用類,通常形式如下:
    [修飾符] class 類名 extends 父類 implements 接口1, 接口2.. { 類體部分 }

     implements是表明這個類實現接口的關鍵字,一個類可以實現多個接口,多個接口之間用逗號隔開,如上述程序14行所示

  • 一個類可以繼承一個父類,並同時實現多個接口,此時,implements部分必須放在extends部分之后
  • 一個類聲明實現一個或者多個接口之后,則這個類必須完全實現這些接口里所定義的全部抽象方法(抽象方法就是那些只聲明而沒有實現的方法);否則該類將保留從父接口那里繼承的抽象方法,於是該類也必須定義成抽象類。

上述程序用類Printer實現了Output接口和Product接口,於是,Printer對象既可以賦給Output變量(53行)也可以賦給Product變量(61行),好像Printer類既是Output類的子類,也是Product類的子類,這就是傳說中的Java的模擬多繼承

 


免責聲明!

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



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