java基础--接口
接口
需求:需要飛到北京出差
飛機(jī)、鳥、超人不能歸于一個類屬,但是具有相同的特性:會飛的。所以引入一個新概念叫做接口,可以用于規(guī)范實(shí)現(xiàn)接口的類中必須接口中的抽象方法。接口可以理解為一種契約
使用關(guān)鍵字interface定義接口
public interface 會飛的 { ????????public void 起飛(); ????????public void 巡航飛行(); ????????public void 降落(); }接口不能直接使用,必須有相對應(yīng)的實(shí)現(xiàn)類
public class 飛機(jī)類 implements 會飛的 { //共性是通過實(shí)現(xiàn)接口來表示的 ????????private String name; //名稱,這是類屬的屬性,這里可以定義字節(jié)類的成員,和接口無關(guān) ????????//如果當(dāng)前類不是抽象類,則必須實(shí)現(xiàn)接口中的所有抽象方法 ????????@Override ????????public void 起飛() { ????????????????System.out.println("使勁的跑,一抬頭就飛起來了"); ????????} ????????@Override ????????public void 巡航飛行() { ????????????????System.out.println("使勁的燒油..."); ????????} ????????@Override ????????public void 降落() { ????????????????System.out.println("我對準(zhǔn)..."); ????????} }通過接口定義變量,使用具體類的實(shí)例,進(jìn)行調(diào)用
會飛的 obj = new 飛機(jī)類(); obj.起飛(); obj.巡航飛行(); obj.降落();引入接口的目的在于隔離實(shí)現(xiàn)
public void 出差(飛機(jī) obj){} 這種寫法當(dāng)前類和飛機(jī)是耦合的,如果需要坐超人出差,則必須修改源代碼 public void 出差(會飛的 obj){} 當(dāng)前類只是和接口耦合,任何實(shí)現(xiàn)了接口的對象都可以作為參數(shù)進(jìn)行傳入使用接口而不是使用具體的類,則可以實(shí)現(xiàn)在實(shí)現(xiàn)接口的多個具體實(shí)現(xiàn)類之間進(jìn)行更換,例如定義出超人類
什么是接口
在Java中不支持多繼承,因?yàn)闀霈F(xiàn)調(diào)用的不確定性,所以java將多繼承機(jī)制進(jìn)行改良,在java中變成了多實(shí)現(xiàn)。一個類可以實(shí)現(xiàn)多個接口,一個接口可以繼承多個接口
package com.yan2;public class Test2 {public static void main(String[] args) {A2 aa = new A2();aa.pp();}}interface IA2 {public default void pp() {System.out.println("IA2...pp");} }interface IB2 {public default void pp() {System.out.println("IB2...pp");} }interface IC2 extends IA2, IB2 {@Overridedefault void pp() {IA2.super.pp();} }class A2 implements IA2, IB2 {@Overridepublic void pp() {IA2.super.pp();System.out.println("A2...pp");IB2.super.pp();} }接口是一種特殊的抽象類,接口只能被abstract或者public修飾
沒有構(gòu)造器方法
沒有屬性,只能定義常量
可以包含抽象方法,也可以沒有抽象方法
接口中的方法只能被public、default、abstract、static修飾
- 一般情況下接口中之定義抽象方法
- 定義的方法默認(rèn)為公開的抽象方法
抽象方法必須在實(shí)現(xiàn)類中提供實(shí)現(xiàn)
可以使用default關(guān)鍵字給抽象方法提供默認(rèn)實(shí)現(xiàn),有默認(rèn)實(shí)現(xiàn)的方法在實(shí)現(xiàn)類中的重新定義,也可以不重新定義
接口允許多重繼承
一個類在繼承另一個類的同時,還可以實(shí)現(xiàn)多個接口
允許一個類實(shí)現(xiàn)多個接口,但是每個接口的抽象方法都必須提供實(shí)現(xiàn),否則是抽象類。提供的實(shí)現(xiàn)也可以是是繼承
接口的出現(xiàn)避免了單繼承的局限性,這樣定義C接口則擁有A+B的所有定義,可以使用A和B接口以及父類D聲明變量類型,直接new T。但是約束時,用誰聲明變量編譯器系統(tǒng)識別就是誰這種類型,也就意味只能調(diào)用識別類型中的方法,不能調(diào)用其他方法 package com.yan4;public class Test5 {public static void main(String[] args) {A a1 = new A();A a2 = new B();B b = new B();C c = new C();D d = new D();System.out.println("(1)" + a1.show(b));System.out.println("(2)" + a2.show(d));System.out.println("(3)" + b.show(c));System.out.println("(4)" + b.show(d));} }class A {public String show(C obj) {return ("A and C");}public String show(A obj) {return "A and A";} }class B extends A {public String show(B obj) {return "B and B";}public String show(A obj) {return "B and A";} }class C extends B { }class D extends B { }聲明接口的語法
訪問修飾符? ?interface? ?接口名{? ?}? ?一般建議接口名稱使用形容詞
如果定義public接口,則規(guī)則和定義public類一致,要求接口名稱和文件名稱一致 外部的接口只能使用public、默認(rèn)這兩個范圍限定詞;如果定義內(nèi)部接口則可以使用4大范圍限定詞 接口實(shí)際上提供了同一的操作界面(方法),如果是JDK1.8-版本則一個方法也不實(shí)現(xiàn),等待某類或某幾個類去實(shí)現(xiàn)它的方法【接口中的所有方法必須是抽象的】。如果使用的是JDK1.8+允許使用default在接口中定義默認(rèn)實(shí)現(xiàn),這個實(shí)現(xiàn)允許在實(shí)現(xiàn)類中重新定義覆蓋 接口中沒有屬性,只能定義常量,它提供一些常量,實(shí)現(xiàn)它的類可以共享這些常量 接口可以給出訪問控制符,用public修飾的是公共接口,到處可見;如果定義接口沒有范圍限定詞,則只能在同包中訪問接口中只能定義常量和抽象方法
接口中只能定義公共的常量,接口中的屬性默認(rèn)是public static final類型的,必須是public static final類型的 接口中只能定義公共的抽象方法, 只有在JDK1.8+中可以使用default關(guān)鍵字定義方法實(shí)現(xiàn)。接口中的方法默認(rèn)是public abstract類型的,而且必須是public abstract類型的。只有在JDK1.8+中可以使用default關(guān)鍵字定義方法默認(rèn)實(shí)現(xiàn),同時允許在實(shí)現(xiàn)類中覆蓋重新定義 接口不能被實(shí)例化,只能通過實(shí)現(xiàn)類所實(shí)現(xiàn),但是可以用于聲明變量的類型。 ????????接口 變量名=new 實(shí)現(xiàn)接口類(); 接口沒有構(gòu)造函數(shù) 接口中的抽象方法必須在非抽象子類中提供實(shí)現(xiàn),這個實(shí)現(xiàn)可以是繼承來的接口的特殊特征
一個類只能有一個父類! 一個類可以實(shí)現(xiàn)多個接口! 一個接口可以繼承多個接口接口的作用
統(tǒng)一訪問 解耦 通過接口可以隔離具體實(shí)現(xiàn) 解耦就是在使用者和實(shí)現(xiàn)者之間沒有關(guān)系。 無論實(shí)現(xiàn)者如何改變實(shí)現(xiàn),對于使用者使用不會變化接口和抽象類的異同點(diǎn)
相同點(diǎn):都是不斷向上抽取而來的 不同點(diǎn):- 抽象類需要被繼承,而且只能單繼承
- 接口需要被實(shí)現(xiàn),而且可以多實(shí)現(xiàn)
如何使用接口
一般使用接口隔離具體實(shí)現(xiàn),可以將類之間的相互依賴變?yōu)轭悓涌诘囊蕾嚒@绯霾铑惡蜁w的東西是通過會飛的接口進(jìn)行隔離,這樣不管出差類需要修改或者會飛的東西需要修改,都不會相互影響 如果一組相關(guān)的類中有公共的方法和特殊的方法,可以使用抽象類,在抽象類中固化公共的方法【算法骨架】,而無需具體子類重復(fù)實(shí)現(xiàn);但是在抽象類中無法實(shí)現(xiàn)的方法可以延遲到子類中再實(shí)現(xiàn)。例如排序器BubbleSorter,其中抽象類BubbleSorter固化了所使用的冒泡排序算法,而將無法實(shí)現(xiàn)的bigger比較算法延遲到BubbleSorter的子類PigSorter中實(shí)現(xiàn),同時PigSorter中也不需要重新定義排序算法 最佳軟件開發(fā)實(shí)踐:先定義接口規(guī)范調(diào)用方法,在使用抽象類實(shí)現(xiàn)接口定義公共方法,最后再定義具體子類實(shí)現(xiàn)所有的方法接口和抽象類的使用場景
從設(shè)計(jì)層面看,抽象類體現(xiàn)繼承關(guān)系is a,它主要描述類的從屬關(guān)系或者父子關(guān)系,抽象類和它的派生類之間是典型的IS-A關(guān)系,即子is a父。 interface可以多實(shí)現(xiàn),而且不要求實(shí)現(xiàn)者和interface定義在概念本質(zhì)上是一致的,僅僅是實(shí)現(xiàn)了interface定義的契約而已。它主要描述的是類型間的行為合同,接口和它的實(shí)現(xiàn)類之間是典型的CAN-DO關(guān)系,即子can do父。 為什么接口需要默認(rèn)方法 在接口添加默認(rèn)方法不需要修改實(shí)現(xiàn)類,接口新增的默認(rèn)方法在實(shí)現(xiàn)類中直接可用。 另外還要注意默認(rèn)方法沖突問題。總結(jié)
以上是生活随笔為你收集整理的java基础--接口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL基础(学习笔记)
- 下一篇: java map映射_java8流操作之