書名: 從零開始學Java Web開發作者名: 孫更新等編著本章字數: 1843字更新時間: 2018-12-27 13:06:01
3.3 接口
在本章前面的內容中已經介紹過,Java只允許單繼承,即不允許一個類同時繼承多個父類,不過Java中提供了接口,一個類可以同時實現很多個接口,這樣就實現了多重繼承的部分功能。
3.3.1 接口的定義
接口的定義包括接口聲明和接口體。其定義的一般格式如下:
[public] interface interfaceName[extends listOfSuperInterface] { type methodname(parameterlist); type constname=value; }
其中,接口只能用public限制訪問修飾符修飾,不能使用其他的限制訪問修飾符,extends后可以有多個父接口,這多個父接口之間用逗號隔開。
接口體包括常量定義和方法聲明,這里的方法聲明包含方法名稱、參數列表和返回值類型,但是沒有方法體。看到這里,讀者可能會問,接口不就是抽象類嗎?的確,接口與抽象類有許多相同之處,但是它們之間也有很多的不同點。接口與抽象類是屬于不同的層次,接口是將抽象類提高了一個層次,并給它加上了一些限制和特性。
下面來比較一下接口與抽象類的異同。
相同點:
? 接口與抽象類中都包含有方法聲明,這些方法聲明將在實現接口或繼承抽象類的類中具體實現,否則這些實現接口或繼承抽象類的類還是抽象類。這也是容易把接口和抽象類混淆的主要原因。
? 接口與抽象類中由于都有方法聲明,因此都不能用new來創建對象,但它們都可以去引用實現接口或繼承抽象類的類的實例。
? 接口與抽象類都可以實現繼承,繼承之后子接口就擁有了所有父接口中的方法聲明和常量定義了,抽象類繼承父類后也將用于父類中的所有方法和屬性。
不同點:
? 在抽象類中,方法聲明的前面必須加上abstract關鍵字,而在接口中則不需要。
? 在抽象類中,除了抽象方法之外,也可以定義普通的成員方法和成員變量,而在接口中這是不允許的,接口中只能有方法聲明和常量定義,這是接口和抽象類的本質區別。
? 接口允許多繼承,不但一個接口可以繼承多個父接口,而且實現接口的類也可以同時實現多個接口。
【實例3-9】接口的定義。該實例定義一個用于計算立體幾何圖形體積的接口,因為不同的立體幾何圖形計算體積的方法不同,因此可以在接口中定義一個計算體積的方法的聲明,而在具體的圖形類中實現該接口,并根據各圖形的體積計算公式來定義該方法。接口的具體定義如下:
01 public interface ThreeD_Object { 02 float Volume(float x, float y, float z);//定義接口中的抽象方法 03 }
【代碼說明】在該接口的第2行定義了一個抽象方法Volume。
說明
在接口中只能有方法聲明,不能有方法的具體實現。
3.3.2 接口的實現
接口中的方法聲明需要在某個類中定義實際的代碼,這時我們就稱這個類“實現”了這個接口。關鍵字implements用來表示對接口的實現。如果一個類同時實現了多個接口,則只需在implements后把多個接口名用逗號隔開即可。
接口實現的一般格式如下:
class <類名> implements <接口名>
例如,下面示例代碼中定義了兩個接口及實現這兩個接口的實現類。
01 interface A { 02 void Method1(); 03 } 04 interface B { 05 void Method2(); 06 } 07 class C implements A,B { 08 public void Method1() { 09 ……//具體方法定義代碼 10 } 11 public void Method2() { 12 ……//具體方法定義代碼 13 } 14 }
【代碼說明】在第8行實現了接口A中的方法,第12行實現了接口B中的方法。
說明
在類中實現接口中的方法聲明時,方法的返回值類型、方法名稱和參數列表必須保持一致,同時要給出方法的具體實現代碼。此外,Java中規定在類中實現的方法都要聲明為public的。
如果在實現接口的類中沒有定義接口中方法的具體實現,那么在這個類中這個方法就將是一個抽象方法,由于這時它位于類中,那么這個類就將成為抽象類。
【實例3-10】接口的實現。
在實例3-9中定義了用于計算立體幾何圖形體積的接口,在實例3-10中根據具體立體幾何圖形分別定義該接口不同的實現類。
首先定義立方體的實現類Cube,具體代碼如下:
01 class Cube implements ThreeD_Object { 02 //根據立方體體積計算公式具體定義方法 03 public float Volume(float x, float y, float z) { 04 return x*y*z; 05 } 06 }
【代碼說明】在第3行定義了ThreeD_Object接口中聲明的Volume()方法,在該方法中具體定義了立方體體積的計算方法。
然后定義圓柱體的實現類Cylinder,具體代碼如下:
01 class Cylinder implements ThreeD_Object { 02 //根據圓柱體體積計算公式具體定義方法 03 public float Volume(float x, float y, float z) { 04 return x*y*y *z; 05 } 06 }
【代碼說明】在第3行定義了ThreeD_Object接口中聲明的Volume()方法。在該方法中具體定義了圓柱體體積的計算方法。
最后定義應用程序類ShowVolume,用來測試實現接口的類,其具體代碼定義如下:
01 public class ShowVolume { 02 public static void main(String args[]){ 03 float vol1,vol2; 04 float PI=3.14159f; 05 ThreeD_Object obj1=new Cube(); //創建Cube類的對象 06 ThreeD_Object obj2=new Cylinder() ;//創建Cylinder類的對象 07 vol1=obj1.Volume(20.0f, 10.0f, 30.0f); //調用Cube類中實現的接口中的方法 08 vol2=obj2.Volume(PI, 10.0f, 30.0f); //調用Cylinder類中實現的接口中的方法 09 System.out.println("The Volume of cube is:"+vol1); 10 System.out.println("The Volume of cylinder is:"+vol2); 11 } 12 }
【代碼說明】在應用程序類中的第5行和第6行分別實例化一個Cube類和Cylinder類的實例,然后在第7行和第8行通過這兩個實例分別調用了Volume()方法,雖然是同一個方法,但是這兩個方法在不同的類中得到了不同的定義。
【運行結果】最終程序輸出結果如圖3.6所示。

圖3.6 接口實現類中具體方法的執行結果
- Hands-On Intelligent Agents with OpenAI Gym
- Linux Mint System Administrator’s Beginner's Guide
- 人工智能工程化:應用落地與中臺構建
- Moodle Course Design Best Practices
- Docker High Performance(Second Edition)
- Visual Basic.NET程序設計
- Salesforce for Beginners
- 多媒體制作與應用
- PLC與變頻技術應用
- Linux Shell編程從初學到精通
- Linux系統管理員工具集
- Oracle 11g Anti-hacker's Cookbook
- 計算機辦公應用培訓教程
- PowerPoint 2003中文演示文稿5日通
- 大話數據科學:大數據與機器學習實戰(基于R語言)