深入解析Java編程中接口的運(yùn)用
接口的本質(zhì)——接口是一種特殊的抽象類,這種抽象類里面只包含常量和方法的定義,而沒(méi)有變量和方法的實(shí)現(xiàn)。
抽象類所具有的一些東西接口可以具有,假如一個(gè)抽象類里面所有的方法全都是抽象的,沒(méi)有任何一個(gè)方法需要這個(gè)抽象類去實(shí)現(xiàn),并且這個(gè)抽象類里面所有的變量都是靜態(tài)(static)變量,都是不能改變(final)的變量,這時(shí)可以把這樣的抽象類定義為一個(gè)接口(interface)。把一個(gè)類定義成一個(gè)接口的格式是把聲明類的關(guān)鍵字class用聲明接口的關(guān)鍵字interface替換掉即可。
接口(interface)是一種特殊的抽象類,在這種抽象類里面,所有的方法都是抽象方法,并且這個(gè)抽象類的屬性(即成員變量)都是聲明成“public static final 類型 屬性名”這樣的,默認(rèn)也是聲明成“public static final”即里面的成員變量都是公共的、靜態(tài)的,不能改變的。因此在接口里面聲明常量的時(shí)候,可以寫(xiě)成“public static final 類型 常量名=value(值)”這樣的形式,也可以直接寫(xiě)成“類型 常量名=value(值)”如:“public static final int id=10”可以直接寫(xiě)成“int id=10”這樣的形式,因?yàn)樵诮涌诶锩婺J(rèn)的屬性聲明都是“public static final”的,因此“public static final”可以省略不寫(xiě)。在接口里面聲明的抽象方法可以不寫(xiě)abstract關(guān)鍵字來(lái)標(biāo)識(shí),因?yàn)榻涌诶锩嫠械姆椒ǘ际浅橄蟮?,因此這個(gè)“abstract”關(guān)鍵字默認(rèn)都是省略掉的,如在一個(gè)接口里面聲明這樣的三個(gè)方法:“public void start()”、“public void run()”、“public void stop()”這三個(gè)方法前面都沒(méi)有使用abstract關(guān)鍵字來(lái)標(biāo)識(shí),可它們就是抽象方法,因?yàn)樵诮涌诶锩娴穆暶鞯姆椒ǘ际浅橄蠓椒ǎ虼嗽诮涌诶锩娴某橄蠓椒ǘ紩?huì)把a(bǔ)bstract關(guān)鍵字省略掉,因?yàn)槟J(rèn)聲明的方法都是抽象的,所以就沒(méi)有必要再寫(xiě)“abstract”字了,這一點(diǎn)與在抽象類里面聲明抽象方法時(shí)有所區(qū)別,在抽象類里面聲明抽象方法是一定要使用“abstract”關(guān)鍵字的,而在接口里面聲明抽象方法可以省略掉“abstract”。注意:在接口里面聲明的抽象方法默認(rèn)是“public(公共的)”的,也只能是“public(公共的)”之所以要這樣聲明是為了修正C++里面多重繼承的時(shí)候容易出現(xiàn)問(wèn)題的地方,C++的多繼承容易出現(xiàn)問(wèn)題,問(wèn)題在于多繼承的多個(gè)父類之間如果他們有相同的成員變量的時(shí)候,這個(gè)引用起來(lái)會(huì)相當(dāng)?shù)芈闊?,并且運(yùn)行的時(shí)候會(huì)產(chǎn)生各種各樣的問(wèn)題。JAVA為了修正這個(gè)問(wèn)題,把接口里面所有的成員變量全都改成static final,成員變量是static類型,那么這個(gè)成員變量就是屬于整個(gè)類里面的,而不是專屬于某個(gè)對(duì)象。對(duì)于多重繼承來(lái)說(shuō),在一個(gè)子類對(duì)象里面實(shí)際上包含有多個(gè)父類對(duì)象,而對(duì)于單繼承來(lái)說(shuō),子類對(duì)象里面就只有一個(gè)父類對(duì)象。多繼承子類對(duì)象就有多個(gè)父類對(duì)象,而這些父類對(duì)象之間可能又會(huì)存在有重復(fù)的成員變量,這就非常容易出現(xiàn)問(wèn)題,因此在JAVA里面避免了這種問(wèn)題的出現(xiàn),采用了接口這種方式來(lái)實(shí)現(xiàn)多繼承。作為接口來(lái)說(shuō),一個(gè)類可以從接口繼承(或者叫實(shí)現(xiàn)接口),這也是多繼承,接口里面的成員變量不專屬于某個(gè)對(duì)象,都是靜態(tài)的成員變量,是屬于整個(gè)類的,因此一個(gè)類去實(shí)現(xiàn)多個(gè)接口也是無(wú)所謂的,不會(huì)存在對(duì)象之間互相沖突的問(wèn)題。實(shí)現(xiàn)多個(gè)接口,也就實(shí)現(xiàn)了多重繼承,而且又避免了多重繼承容易出現(xiàn)問(wèn)題的地方,這就是用接口實(shí)現(xiàn)多重繼承的好處。
1、定義接口
使用interface來(lái)定義一個(gè)接口。接口定義同類的定義類似,也是分為接口的聲明和接口體,其中接口體由常量定義和方法定義兩部分組成。定義接口的基本格式如下:
[修飾符] interface 接口名 [extends 父接口名列表]{
[public] [static] [final] 常量;
[public] [abstract] 方法;
}
修飾符:可選,用于指定接口的訪問(wèn)權(quán)限,可選值為public。如果省略則使用默認(rèn)的訪問(wèn)權(quán)限。
接口名:必選參數(shù),用于指定接口的名稱,接口名必須是合法的Java標(biāo)識(shí)符。一般情況下,要求首字母大寫(xiě)。
extends: 父接口名列表:可選參數(shù),用于指定要定義的接口繼承于哪個(gè)父接口。當(dāng)使用extends關(guān)鍵
字時(shí),父接口名為必選參數(shù)。
方法:接口中的方法只有定義而沒(méi)有被實(shí)現(xiàn)。
例如,定義一個(gè)用于計(jì)算的接口,在該接口中定義了一個(gè)常量PI和兩個(gè)方法,具體代碼如下:
public interface CalInterface
{
final float PI=3.14159f;//定義用于表示圓周率的常量PI
float getArea(float r);//定義一個(gè)用于計(jì)算面積的方法getArea()
float getCircumference(float r);//定義一個(gè)用于計(jì)算周長(zhǎng)的方法getCircumference()
}
注意:
與Java的類文件一樣,接口文件的文件名必須與接口名相同。
2、實(shí)現(xiàn)接口
接口在定義后,就可以在類中實(shí)現(xiàn)該接口。在類中實(shí)現(xiàn)接口可以使用關(guān)鍵字implements,其基本格式如下:
[修飾符] class <類名> [extends 父類名] [implements 接口列表]{
................
}
修飾符:可選參數(shù),用于指定類的訪問(wèn)權(quán)限,可選值為public、abstract和final。
類名:必選參數(shù),用于指定類的名稱,類名必須是合法的Java標(biāo)識(shí)符。一般情況下,要求首字母大寫(xiě)。
extends 父類名:可選參數(shù),用于指定要定義的類繼承于哪個(gè)父類。當(dāng)使用extends關(guān)鍵字時(shí),父類名為必
選參數(shù)。
implements 接口列表:可選參數(shù),用于指定該類實(shí)現(xiàn)的是哪些接口。當(dāng)使用implements關(guān)鍵字時(shí),接口列表為必選參數(shù)。當(dāng)接口列表中存在多個(gè)接口名時(shí),各個(gè)接口名之間使用逗號(hào)分隔。
在類中實(shí)現(xiàn)接口時(shí),方法的名字、返回值類型、參數(shù)的個(gè)數(shù)及類型必須與接口中的完全一致,并且必須實(shí)現(xiàn)接口中的所有方法。例如,編寫(xiě)一個(gè)名稱為Cire的類,該類實(shí)現(xiàn)5.7.1節(jié)中定義的接口Calculate,具體代碼如下:
public class Cire implements CalInterface
{
public float getArea(float r)
{
float area=PI*r*r;//計(jì)算圓面積并賦值給變量area
return area;//返回計(jì)算后的圓面積
}
public float getCircumference(float r)
{
float circumference=2*PI*r; //計(jì)算圓周長(zhǎng)并賦值給變量circumference
return circumference; //返回計(jì)算后的圓周長(zhǎng)
}
public static void main(String[] args)
{
Cire c = new Cire();
float f = c.getArea(2.0f);
System.out.println(Float.toString(f));
}
}
在類的繼承中,只能做單重繼承,而實(shí)現(xiàn)接口時(shí),一次則可以實(shí)現(xiàn)多個(gè)接口,每個(gè)接口間使用逗號(hào)“,”分隔。
這時(shí)就可能出現(xiàn)(多個(gè)接口中的)常量或方法名沖突的情況,解決該問(wèn)題時(shí),如果常量沖突,則需要明確指定常量的接口,這可以通過(guò)“接口名.常量”實(shí)現(xiàn)。如果出現(xiàn)方法沖突時(shí),則只要實(shí)現(xiàn)一個(gè)方法就可以了。
相關(guān)文章
Java使用嵌套循環(huán)模擬ATM機(jī)取款業(yè)務(wù)操作示例
這篇文章主要介紹了Java使用嵌套循環(huán)模擬ATM機(jī)取款業(yè)務(wù)操作,結(jié)合實(shí)例形式分析了Java模擬ATM機(jī)取款業(yè)務(wù)操作的相關(guān)流程控制、數(shù)值判斷等操作技巧,需要的朋友可以參考下2019-11-11
Spring中Controller和RestController的區(qū)別詳解
這篇文章主要介紹了Spring中Controller和RestController的區(qū)別詳解,@Controller是標(biāo)識(shí)一個(gè)Spring類是Spring MVC controller處理器,@Controller類中的方法可以直接通過(guò)返回String跳轉(zhuǎn)到j(luò)sp、ftl、html等模版頁(yè)面,需要的朋友可以參考下2023-09-09
Struts2+Hibernate實(shí)現(xiàn)數(shù)據(jù)分頁(yè)的方法
這篇文章主要介紹了Struts2+Hibernate實(shí)現(xiàn)數(shù)據(jù)分頁(yè)的方法,結(jié)合實(shí)例形式分析了Struts2結(jié)合Hibernate實(shí)現(xiàn)數(shù)據(jù)分頁(yè)的原理,步驟與相關(guān)實(shí)現(xiàn)代碼,需要的朋友可以參考下2016-03-03
Springboot啟動(dòng)停止命令的.sh腳本編寫(xiě)方式
這篇文章主要介紹了Springboot啟動(dòng)停止命令的.sh腳本編寫(xiě)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
如何解決SpringBoot 加入AOP后無(wú)法注入的問(wèn)題
這篇文章主要介紹了如何解決SpringBoot 加入AOP后無(wú)法注入的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Java實(shí)現(xiàn)導(dǎo)出word表格的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言導(dǎo)出word表格功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以參考一下2022-12-12
MyBatis詳解如何實(shí)現(xiàn)Dao層接口
MyBatis允許只聲明一個(gè)dao接口,而無(wú)需寫(xiě)dao實(shí)現(xiàn)類的方式實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作。前提是必須保證Mapper文件中的<mapper>標(biāo)簽的namespace屬性值必須要和dao接口的類路徑一致,MyBatis容器會(huì)自動(dòng)通過(guò)動(dòng)態(tài)代理生成接口的實(shí)現(xiàn)類2022-04-04
使用jenkins部署springboot項(xiàng)目的方法步驟
這篇文章主要介紹了使用jenkins部署springboot項(xiàng)目的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
intellij idea創(chuàng)建第一個(gè)動(dòng)態(tài)web項(xiàng)目的步驟方法
這篇文章主要介紹了intellij idea創(chuàng)建第一個(gè)動(dòng)態(tài)web項(xiàng)目的步驟方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10

