<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
一方面,有時必須從幾個類中派生出一個子類,繼承它們所有的屬性和方法。但是,Java不支援多重繼承。有了介面,就可以得到多重繼承的效果。
另一方面,有時必須從幾個類中抽取出一些共同的行為特徵,而它們之間又沒有is-a的關係,僅僅是具有相同的行為特徵而已。例如:滑鼠、鍵盤、印表機、掃描器、攝像頭、充電器、MP3機、手機、數碼相機、行動硬碟等都支援USB連線。
介面就是規範,定義的是一組規則,體現了現實世界中“如果你是/要…則必須能…”的思想。繼承是一個"是不是"的關係,而介面實現則是"能不能"的關係。
介面的本質是契約,標準,規範,就像我們的法律一樣。制定好後大家都要遵守。
介面使用關鍵字interface
來定義。
Java中,介面和類是並列關係,或者介面可以理解為一種特殊的類。從本質上講,介面是一種特殊的抽象類,這種抽象類中只包含常數和方法的定義(JDK7.0
及之前),而沒有變數和方法的實現。
定義Java類的語法格式:先寫extends
,後寫implements
class SubClass extends SuperClass implements InterfaceA{ }
介面(interface
)是抽象方法和常數值定義的集合。
如何定義介面:
JDK7及以前:只能定義全域性常數和抽象方法
public static final
修飾的,可以省略不寫。public abstract
修飾的。程式碼演示:
public interface Runner { int ID = 1;//<=>public static final int ID = 1; void start();//<=>public abstract void start(); public void run();//<=>public abstract void run(); void stop();//<=>public abstract void stop(); }
JDK8:除了定義全域性常數和抽象方法之外,還可以定義靜態方法、預設方法。
1.靜態方法:使用 static
關鍵字修飾。
介面中定義的靜態方法,只能通過介面來呼叫,並執行其方法體。我們經常在相互一起使用的類中使用靜態方法。你可以在標準庫中找到像Collection/Collections
或者Path/Paths
這樣成對的介面和類。
2.預設方法:預設方法使用 default
關鍵字修飾。可以通過實現類物件來呼叫。我們在已有的介面中提供新方法的同時,還保持了與舊版本程式碼的相容性。比如:java 8 API中對Collection
、List
、Comparator
等介面提供了豐富的預設方法。
程式碼演示1:
public void myMethod(){ method3();//呼叫自己定義的重寫的方法 super.method3();//呼叫的是父類別中宣告的 //呼叫介面中的預設方法 CompareA.super.method3(); CompareB.super.method3(); }
程式碼演示2:
interface Filial {// 孝順的 default void help() { System.out.println("老媽,我來救你了"); } } interface Spoony {// 痴情的 default void help() { System.out.println("媳婦,別怕,我來了"); } } class Father{ public void help(){ System.out.println("兒子,就我媳婦!"); } } class Man extends Father implements Filial, Spoony { @Override public void help() { System.out.println("我該就誰呢?"); Filial.super.help(); Spoony.super.help(); } }
介面中不能定義構造器的!意味著介面不可以範例化。
介面採用多繼承機制。可以實現多個介面 ,彌補了Java單繼承性的侷限性。
格式:class AA extends BB implements CC,DD,EE;
Java開發中,介面通過讓類去實現(implements
)的方式來使用。
程式碼演示:
/* 實現類SubAdapter必須給出介面SubInterface以及父介面MyInterface 中所有方法的實現。否則,SubAdapter仍需宣告為abstract的。 */ interface MyInterface{ String s=「MyInterface」; public void absM1(); } interface SubInterface extends MyInterface{ public void absM2(); } public class SubAdapter implements SubInterface{ public void absM1(){System.out.println(「absM1」);} public void absM2(){System.out.println(「absM2」);} }
介面與介面之間可以繼承,而且可以多繼承。
一個類可以實現多個無關的介面。
程式碼演示:
interface Runner { public void run();} interface Swimmer {public double swim();} class Creator{public int eat(){…}} class Man extends Creator implements Runner ,Swimmer{ public void run() {……} public double swim() {……} public int eat() {……} }
與繼承關係類似,介面與實現類之間存在多型性
程式碼演示:
public class Test{ public static void main(String args[]){ Test t = new Test(); Man m = new Man(); t.m1(m); t.m2(m); t.m3(m); } public String m1(Runner f) { f.run(); } public void m2(Swimmer s) {s.swim();} public void m3(Creator a) {a.eat();} }
介面的匿名實現類匿名物件
程式碼演示:
public class USBTest { public static void main(String[] args) { Computer com = new Computer(); //1.建立了介面的非匿名實現類的非匿名物件 Flash flash = new Flash(); com.transferData(flash); //2. 建立了介面的非匿名實現類的匿名物件 com.transferData(new Printer()); //3. 建立了介面的匿名實現類的非匿名物件 USB phone = new USB(){ @Override public void start() { System.out.println("手機開始工作"); } @Override public void stop() { System.out.println("手機結束工作"); } }; com.transferData(phone); //4. 建立了介面的匿名實現類的匿名物件 com.transferData(new USB(){ @Override public void start() { System.out.println("mp3開始工作"); } @Override public void stop() { System.out.println("mp3結束工作"); } }); } } class Computer{ public void transferData(USB usb){//USB usb = new Flash(); usb.start(); System.out.println("具體傳輸資料的細節"); usb.stop(); } } interface USB{ //常數:定義了長、寬、最大最小的傳輸速度等 void start(); void stop(); } class Flash implements USB{ @Override public void start() { System.out.println("U盤開啟工作"); } @Override public void stop() { System.out.println("U盤結束工作"); } } class Printer implements USB{ @Override public void start() { System.out.println("印表機開啟工作"); } @Override public void stop() { System.out.println("印表機結束工作"); } }
//舉例一: interface Network { public void browse(); } // 被代理類 class RealServer implements Network { @Override public void browse() { System.out.println("真實伺服器上 網瀏覽資訊"); } } // 代理類 class ProxyServer implements Network { private Network network; public ProxyServer(Network network) { this.network = network; } public void check() { System.out.println("檢查網路連線等操作"); } public void browse() { check(); network.browse(); } } public class ProxyDemo { public static void main(String[] args) { Network net = new ProxyServer(new RealServer()); net.browse(); } } //舉例二: public class StaticProxyTest { public static void main(String[] args) { Proxy s = new Proxy(new RealStar()); s.confer(); s.signContract(); s.bookTicket(); s.sing(); s.collectMoney(); } } interface Star { void confer();// 面談 void signContract();// 籤合同 void bookTicket();// 訂票 void sing();// 唱歌 void collectMoney();// 收錢 } //被代理類 class RealStar implements Star { public void confer() { } public void signContract() { } public void bookTicket() { } public void sing() { System.out.println("明星:歌唱~~~"); } public void collectMoney() { } } //代理類 class Proxy implements Star { private Star real; public Proxy(Star real) { this.real = real; } public void confer() { System.out.println("經紀人面談"); } public void signContract() { System.out.println("經紀人籤合同"); } public void bookTicket() { System.out.println("經紀人訂票"); } public void sing() { real.sing(); } public void collectMoney() { System.out.println("經紀人收錢"); } }
No. | 區別點 | 抽象類 | 介面 |
---|---|---|---|
1 | 定義 | 包含抽象方法的類 | 主要是抽象方法和全域性常數的集合 |
2 | 組成 | 構造方法、抽象方法、普通方法、常數、變數 | 常數、抽象方法、(jdk8.0:預設方法、靜態方法) |
3 | 使用 | 子類繼承抽象類(extends ) | 子類實現介面(implements ) |
4 | 關係 | 抽象類可以實現多個介面 | 介面不能繼承抽象類,但允許繼承多個介面 |
5 | 常見設計模式 | 模板方法 | 簡單工廠、工廠方法、代理模式 |
6 | 物件 | 都通過物件的多型性產生範例化物件 | 都通過物件的多型性產生範例化物件 |
7 | 侷限 | 抽象類有單繼承的侷限 | 介面沒有此侷限 |
8 | 實際 | 作為一個模板 | 是作為一個標準或是表示一種能力 |
9 | 選擇 | 如果抽象類和介面都可以使用的話,優先使用介面,因為避免單繼承的侷限 | 如果抽象類和介面都可以使用的話,優先使用介面,因為避免單繼承的侷限 |
//題目一: interface A { int x = 0; } class B { int x = 1; } class C extends B implements A { public void pX() { System.out.println(x); } public static void main(String[] args) { new C().pX(); } } //題目二: interface Playable { void play(); } interface Bounceable { void play(); } interface Rollable extends Playable, Bounceable { Ball ball = new Ball("PingPang"); } class Ball implements Rollable { private String name; public String getName() { return name; } public Ball(String name) { this.name = name; } public void play() { ball = new Ball("Football"); System.out.println(ball.getName()); } }
到此這篇關於Java超詳細透徹講解介面的文章就介紹到這了,更多相關Java介面內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45