精通Java接口的使用與原理
接口基礎(chǔ)知識(shí)
為什么需要接口
需求:要求實(shí)現(xiàn)防盜門的功能,門有“開”和“關(guān)”的功能,鎖有“上鎖”和“開鎖”功能。
分析:首先防盜門是一個(gè)門,它有一把鎖。按照之前學(xué)過的面向?qū)ο蟮乃枷?,可以將門和鎖分別定義成抽象類。但是,不能讓防盜門在繼承們的同時(shí)又繼承鎖。原因有兩點(diǎn):第一,防盜門不是鎖,不符合繼承中is a的關(guān)系,第二,Java只支持單繼承,如何解決這個(gè)問題呢?這時(shí)就要用到接口,可以將鎖定義為接口,讓防盜門繼承門,實(shí)現(xiàn)鎖的接口。那么什么是借口呢?它的特點(diǎn)又是什么呢?下面讓我們來學(xué)習(xí)一下。
什么是接口
在生活中,接口是一套規(guī)范,只要滿足這個(gè)規(guī)范的設(shè)備,就可以將它們組裝到一起,從而實(shí)現(xiàn)該設(shè)備的功能。
而在軟件中,接口同樣是一種規(guī)范和標(biāo)準(zhǔn),它們可以約束類的行為,是一些方法特征的集合,但是沒有方法的實(shí)現(xiàn),從這個(gè)角度來講,接口可以看作一種特殊的“抽象類”,但是采用與抽象類完全不同的語(yǔ)法來表示,兩者的設(shè)計(jì)理念也是不同的,抽象類利于代碼的復(fù)用,接口利于代碼的擴(kuò)展和維護(hù)。
接口的定義語(yǔ)法和類實(shí)現(xiàn)接口的語(yǔ)法
[修飾符] interface 接口名 extends 父接口1,父接口2,…{ //常量定義 //方法定義 } class 類名 extends 父類名 implements 接口1,接口2,…{ //類成員 }
接口說明
1.接口的命名規(guī)范和類相同。
2.接口中可以定義常量,不能定義變量。
3.接口中所有的方法都是抽象方法。
4.和抽象類一樣,接口也不能實(shí)例化,接口中不能有構(gòu)造方法。
5.接口之間可以通過extends實(shí)現(xiàn)繼承關(guān)系,一個(gè)接口可以繼承多個(gè)接口,但接口不能繼承類。
6.接口的實(shí)現(xiàn)類必須實(shí)現(xiàn)接口的全部方法,否則必須定義為抽象類。
下面就使用Java接口來模擬生活中的USB接口
//先定義USB接口,通過service()方法提供服務(wù) /* * USB接口 */ public interface UsbInterFace { /* * USB接口提供服務(wù) */ void service(); } //定義U盤類,實(shí)現(xiàn)USB接口中的service()方法,進(jìn)行數(shù)據(jù)傳輸 /* * U盤 */ public class UDisk implements UsbInterFace{ public void service(){ System.out.println("連接USB口,開始傳輸數(shù)據(jù)"); } } //定義USB風(fēng)扇類,實(shí)現(xiàn)USB接口中的service()方法,獲得電流使風(fēng)扇轉(zhuǎn)動(dòng) /* * USB風(fēng)扇 */ public class UsbFan implements UsbInterFace{ public void service(){ System.out.println("連接USB口,獲得電流,風(fēng)扇開始轉(zhuǎn)動(dòng)"); } } //編寫測(cè)試類,實(shí)現(xiàn)U盤傳輸數(shù)據(jù),使USB風(fēng)扇轉(zhuǎn)動(dòng) /* * 測(cè)試類 */ public class Test { public static void main(String[] args) { //1.U盤 UsbInterFace uDisk=new UDisk(); uDisk.service(); //2.USB風(fēng)扇 UsbInterFace usbFan=new UsbFan(); usbFan.service(); } }
運(yùn)行結(jié)果:
通過該示例我們學(xué)習(xí)了如何定義接口和實(shí)現(xiàn)接口,這些技能在后面的學(xué)習(xí)中將會(huì)被反復(fù)用到。
接口表示一種能力
使用接口實(shí)現(xiàn)防盜門功能
通過上面的代碼,我們已經(jīng)了解Java接口的語(yǔ)法和規(guī)則,現(xiàn)在就使用借口來實(shí)現(xiàn)防盜門功能
//定義Door類,具有開和關(guān)的功能 /* * 門 */ public abstract class Door { public abstract void open();//開 public abstract void close();//關(guān) } //定義Lock接口,具備上鎖和開鎖的功能 /* * 鎖,接口 */ public interface Lock { void lockUp();//上鎖 void openLock();//開鎖 } //定義TheftproofDoor類,繼承Door類,實(shí)現(xiàn)Lock接口 * * 防盜門類 */ public class TheftproofDoor extends Door implements Lock,DoorBell{ public void lockUp() { System.out.println("插進(jìn)鑰匙,向左旋轉(zhuǎn)鑰匙三圈,鎖上了,拔出鑰匙"); } public void openLock(){ System.out.println("插進(jìn)鑰匙,向右旋轉(zhuǎn)鑰匙三圈,鎖打開了,拔出鑰匙"); } public void open(){ System.out.println("用力推,門打開了"); } public void close(){ System.out.println("輕輕拉門,門關(guān)上了"); } } //編寫測(cè)試類,實(shí)現(xiàn)防盜門的關(guān)門,開門,上鎖,開鎖的功能 /* * 測(cè)試類 */ public class DoorTest { public static void main(String[] args) { TheftproofDoor tfd=new TheftproofDoor(); tfd.close();//關(guān)門 tfd.lockUp();//上鎖 tfd.takePictures();//來訪客人拍照存儲(chǔ) tfd.openLock();//開鎖 tfd.open();//開門 } }
運(yùn)行結(jié)果:
通過上面的案例我們了解了接口表示一種能力,一個(gè)類實(shí)現(xiàn)了某個(gè)接口,就表示這個(gè)類具備了某種能力,那我們就為防盜門增加一個(gè)拍照存檔的功能,當(dāng)主人不在家有客人來訪時(shí)便會(huì)自動(dòng)拍照存儲(chǔ)。
/* * 門鈴接口 */ public interface DoorBell { void takePictures();//鈴響拍照存檔功能 } //為防盜門增加門鈴功能 /* * 防盜門類 */ public class TheftproofDoor extends Door implements Lock,DoorBell{ //省略其他實(shí)現(xiàn)方法 public void takePictures(){ System.out.println("鈴......咔嚓......照片已存儲(chǔ)"); } } //修改測(cè)試類,代碼如下: /* * 測(cè)試類 */ public class DoorTest { public static void main(String[] args) { TheftproofDoor tfd=new TheftproofDoor(); tfd.close();//關(guān)門 tfd.lockUp();//上鎖 tfd.takePictures();//來訪客人拍照存儲(chǔ) tfd.openLock();//開鎖 tfd.open();//開門 } }
運(yùn)行結(jié)果:
接口表示一種約定
使用接口實(shí)現(xiàn)打印機(jī)打印功能
需求:要求實(shí)現(xiàn)打印機(jī)打印功能。打印機(jī)的墨盒可能是彩色的,也可能是黑白的,所有的紙張可以有很多類型。
代碼如下:
//定義墨盒接口InkBox,約定墨盒有顏色 /* * 墨盒接口 */ public interface InkBox { /* * 得到墨盒顏色 */ public String getColor(); } //定義紙張接口Paper,約定紙張有大小 /* * 紙張接口 */ public interface Paper { /* * 得到紙張大小 */ public String getSize(); } //定義打印機(jī)類,引用墨盒接口,紙張接口實(shí)現(xiàn)打印功能 /* * 打印機(jī)類 */ public class Printer { InkBox inkBox;//墨盒 Paper paper;//紙張 /* * 設(shè)置打印機(jī)墨盒 */ public void setInkBox(InkBox inkBox){ this.inkBox=inkBox; } /* * 設(shè)置打印機(jī)紙張 */ public void setPaper(Paper paper){ this.paper=paper; } /* * 使用墨盒在紙張上打印 */ public void print(){ System.out.println("使用"+inkBox.getColor()+"墨盒在"+paper.getSize()+"紙張上打印"); } } //墨盒廠商按照InkBox接口實(shí)現(xiàn)ColorInkbox類和GrayInkBox類 /* * 彩色墨盒 */ public class ColorInkBox implements InkBox{ public String getColor(){ return "彩色"; } } /* * 墨色墨盒 */ public class GrayInkBox implements InkBox{ public String getColor(){ return "黑色"; } } /* * 墨色墨盒 */ public class GrayInkBox implements InkBox{ public String getColor(){ return "黑色"; } } /* * 墨色墨盒 */ public class GrayInkBox implements InkBox{ public String getColor(){ return "黑色"; } } //紙張廠商按照Paper接口實(shí)現(xiàn)A4Paper類和B5Paper類 public class A4Paper implements Paper{ public String getSize(){ return "A4"; } } public class B5Paper implements Paper{ public String getSize(){ return "B5"; } } //“組裝”打印機(jī),讓打印機(jī)通過不同的墨盒和紙張實(shí)現(xiàn)打印 public class TestInkBox { public static void main(String[] args) { //1.定義打印機(jī) InkBox inkBox=null; Paper paper=null; Printer printer=new Printer(); //2.使用黑白墨盒在A4紙上打印 inkBox=new GrayInkBox(); paper=new A4Paper(); printer.setInkBox(inkBox); printer.setPaper(paper); printer.print(); 3.使用彩色墨盒在B5紙上打印 inkBox=new ColorInkBox(); paper=new B5Paper(); printer.setInkBox(inkBox); printer.setPaper(paper); printer.print(); //4.使用彩色墨盒在A4紙上打印 paper=new A4Paper(); printer.setPaper(paper); printer.print(); } }
運(yùn)行結(jié)果:
在C#中使用接口
使用C#實(shí)現(xiàn)打印功能
語(yǔ)法
[修飾符] interface 接口名:父接口1,父接口2,…{ 屬性定義 方法定義 } class 類名:父類名,接口1,接口2,…{}
c#接口說明
1.接口之間可以通過“:”來實(shí)現(xiàn)繼承關(guān)系,一個(gè)接口可以繼承多個(gè)接口,但接口不能繼承類。類只能繼承一個(gè)父類,但可以實(shí)現(xiàn)多個(gè)接口,使用“:”來繼承類并實(shí)現(xiàn)接口
2.接口定義零個(gè)或多個(gè)成員,成員主要是方法,屬性和索引器。借口中不能包含常量,變量和構(gòu)造方法,也不能包含任何靜態(tài)成員。
3.接口成員訪問權(quán)限是public,定義接口時(shí)顯式指定任何修飾符都是非法的。
4.按照慣例,c#中接口的名稱以大寫字母“I”開頭。
下面用c#實(shí)現(xiàn)打印機(jī)案例,通過對(duì)比其中的一同,更好的掌握接口在兩種語(yǔ)法中的應(yīng)用。
namespace InterfaceDemo { public interface InkBox { string Color { get; } } public interface Paper { string Size { get; } } class Printer { InkBox inkBox;//墨盒 public InkBox InkBox { set { inkBox = value; } } Paper paper;//紙張 public Paper Paper { set { paper = value; } } public void print() { Console.WriteLine("使用" + inkBox.Color + "墨盒在" + paper.Size + "紙上打印"); } } public class ColorInkBox: InkBox { public string Color { get { return "彩色"; } } } public class GrayInkBox: InkBox { public string Color { get { return "黑白"; } } } public class A4Paper : Paper { public string Size { get { return "A4"; } } } public class B5Paper : Paper { public string Size { get { return "B5"; } } } public class Program { static void Main(string[] args) { InkBox inkBox = null; Paper paper = null; Printer printer = new Printer(); inkBox = new GrayInkBox(); paper = new A4Paper(); printer.InkBox = inkBox; printer.Paper = paper; printer.print(); inkBox = new ColorInkBox(); paper = new B5Paper(); printer.InkBox = inkBox; printer.Paper = paper; printer.print(); paper = new A4Paper(); printer.Paper = paper; printer.print(); Console.ReadLine(); } } }
運(yùn)行結(jié)果:
在Java與c#兩種語(yǔ)言中,接口具有以下區(qū)別
1.Java中通過extends來繼承父接口,類通過implements實(shí)現(xiàn)接口;c#中通過":"來實(shí)現(xiàn)這兩個(gè)功能。
2.Java接口中的成員變量都是常量,自動(dòng)用public static final修飾;c#接口中不允許存在成員變量,但可以有屬性。
3.Java接口中屬性和方法都可以用public修飾;c#中默認(rèn)用public,但不允許顯式使用public修飾。
4.Java接口中可以定義靜態(tài)變量和方法;c#接口中不允許包含任何靜態(tài)成員。
到此這篇關(guān)于精通Java接口的使用與原理的文章就介紹到這了,更多相關(guān)Java 接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何使用Java實(shí)現(xiàn)指定概率的抽獎(jiǎng)
這篇文章主要給大家介紹了關(guān)于如何使用Java實(shí)現(xiàn)指定概率的抽獎(jiǎng)的相關(guān)資料,Java抽獎(jiǎng)程序的基本原理是通過隨機(jī)數(shù)生成器來實(shí)現(xiàn)隨機(jī)抽獎(jiǎng)的功能,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07java使用定時(shí)器實(shí)現(xiàn)監(jiān)聽數(shù)據(jù)變化
這篇文章主要為大家詳細(xì)介紹了Java如何使用定時(shí)器監(jiān)聽數(shù)據(jù)變化,當(dāng)滿足某個(gè)條件時(shí)(例如沒有數(shù)據(jù)更新)自動(dòng)執(zhí)行某項(xiàng)任務(wù),有興趣的可以了解下2023-11-11Java日期時(shí)間字符串和毫秒相互轉(zhuǎn)換的方法
這篇文章主要為大家詳細(xì)介紹了Java日期時(shí)間字符串和毫秒相互轉(zhuǎn)換的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12SpringBoot+微信小程序?qū)崿F(xiàn)文件上傳與下載功能詳解
這篇文章主要為大家介紹了SpringBoot整合微信小程序?qū)崿F(xiàn)文件上傳與下載功能,文中的實(shí)現(xiàn)步驟講解詳細(xì),快跟隨小編一起學(xué)習(xí)一下吧2022-03-03Java concurrency之公平鎖(二)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了Java concurrency之公平鎖的第二篇內(nèi)容,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06Java程序設(shè)計(jì)之12個(gè)經(jīng)典樣例
這篇文章主要給大家分享關(guān)于Java程序設(shè)計(jì)11個(gè)經(jīng)典樣例,主要以舉例的形式詳細(xì)的講解了Java程序設(shè)計(jì)的各種方法,需要的朋友可以參考一下文章具體的內(nèi)容2021-10-10IDEA項(xiàng)目的依賴(pom.xml文件)導(dǎo)入問題及解決
這篇文章主要介紹了IDEA項(xiàng)目的依賴(pom.xml文件)導(dǎo)入問題及解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Jenkins系統(tǒng)如何進(jìn)行數(shù)據(jù)備份
隨著我們的長(zhǎng)期使用,Jenkins系統(tǒng)中的內(nèi)容會(huì)越來越多,特別是一些配置相關(guān)的東西,不能有任何丟失。這個(gè)時(shí)候我們就需要定期備份我們的Jenkins系統(tǒng),避免一些誤操作不小心刪除了某些重要文件,本文就將介紹下Jenkins系統(tǒng)如何進(jìn)行數(shù)據(jù)備份2021-06-06Java實(shí)現(xiàn)學(xué)生信息管理界面
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)學(xué)生信息管理界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06