java基础--接口
生活随笔
收集整理的這篇文章主要介紹了
java基础--接口
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
接口
需求:需要飛到北京出差
飛機、鳥、超人不能歸于一個類屬,但是具有相同的特性:會飛的。所以引入一個新概念叫做接口,可以用于規范實現接口的類中必須接口中的抽象方法。接口可以理解為一種契約
使用關鍵字interface定義接口
public interface 會飛的 { ????????public void 起飛(); ????????public void 巡航飛行(); ????????public void 降落(); }接口不能直接使用,必須有相對應的實現類
public class 飛機類 implements 會飛的 { //共性是通過實現接口來表示的 ????????private String name; //名稱,這是類屬的屬性,這里可以定義字節類的成員,和接口無關 ????????//如果當前類不是抽象類,則必須實現接口中的所有抽象方法 ????????@Override ????????public void 起飛() { ????????????????System.out.println("使勁的跑,一抬頭就飛起來了"); ????????} ????????@Override ????????public void 巡航飛行() { ????????????????System.out.println("使勁的燒油..."); ????????} ????????@Override ????????public void 降落() { ????????????????System.out.println("我對準..."); ????????} }通過接口定義變量,使用具體類的實例,進行調用
會飛的 obj = new 飛機類(); obj.起飛(); obj.巡航飛行(); obj.降落();引入接口的目的在于隔離實現
public void 出差(飛機 obj){} 這種寫法當前類和飛機是耦合的,如果需要坐超人出差,則必須修改源代碼 public void 出差(會飛的 obj){} 當前類只是和接口耦合,任何實現了接口的對象都可以作為參數進行傳入使用接口而不是使用具體的類,則可以實現在實現接口的多個具體實現類之間進行更換,例如定義出超人類
什么是接口
在Java中不支持多繼承,因為會出現調用的不確定性,所以java將多繼承機制進行改良,在java中變成了多實現。一個類可以實現多個接口,一個接口可以繼承多個接口
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修飾
沒有構造器方法
沒有屬性,只能定義常量
可以包含抽象方法,也可以沒有抽象方法
接口中的方法只能被public、default、abstract、static修飾
- 一般情況下接口中之定義抽象方法
- 定義的方法默認為公開的抽象方法
抽象方法必須在實現類中提供實現
可以使用default關鍵字給抽象方法提供默認實現,有默認實現的方法在實現類中的重新定義,也可以不重新定義
接口允許多重繼承
一個類在繼承另一個類的同時,還可以實現多個接口
允許一個類實現多個接口,但是每個接口的抽象方法都必須提供實現,否則是抽象類。提供的實現也可以是是繼承
接口的出現避免了單繼承的局限性,這樣定義C接口則擁有A+B的所有定義,可以使用A和B接口以及父類D聲明變量類型,直接new T。但是約束時,用誰聲明變量編譯器系統識別就是誰這種類型,也就意味只能調用識別類型中的方法,不能調用其他方法 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接口,則規則和定義public類一致,要求接口名稱和文件名稱一致 外部的接口只能使用public、默認這兩個范圍限定詞;如果定義內部接口則可以使用4大范圍限定詞 接口實際上提供了同一的操作界面(方法),如果是JDK1.8-版本則一個方法也不實現,等待某類或某幾個類去實現它的方法【接口中的所有方法必須是抽象的】。如果使用的是JDK1.8+允許使用default在接口中定義默認實現,這個實現允許在實現類中重新定義覆蓋 接口中沒有屬性,只能定義常量,它提供一些常量,實現它的類可以共享這些常量 接口可以給出訪問控制符,用public修飾的是公共接口,到處可見;如果定義接口沒有范圍限定詞,則只能在同包中訪問接口中只能定義常量和抽象方法
接口中只能定義公共的常量,接口中的屬性默認是public static final類型的,必須是public static final類型的 接口中只能定義公共的抽象方法, 只有在JDK1.8+中可以使用default關鍵字定義方法實現。接口中的方法默認是public abstract類型的,而且必須是public abstract類型的。只有在JDK1.8+中可以使用default關鍵字定義方法默認實現,同時允許在實現類中覆蓋重新定義 接口不能被實例化,只能通過實現類所實現,但是可以用于聲明變量的類型。 ????????接口 變量名=new 實現接口類(); 接口沒有構造函數 接口中的抽象方法必須在非抽象子類中提供實現,這個實現可以是繼承來的接口的特殊特征
一個類只能有一個父類! 一個類可以實現多個接口! 一個接口可以繼承多個接口接口的作用
統一訪問 解耦 通過接口可以隔離具體實現 解耦就是在使用者和實現者之間沒有關系。 無論實現者如何改變實現,對于使用者使用不會變化接口和抽象類的異同點
相同點:都是不斷向上抽取而來的 不同點:- 抽象類需要被繼承,而且只能單繼承
- 接口需要被實現,而且可以多實現
如何使用接口
一般使用接口隔離具體實現,可以將類之間的相互依賴變為類對接口的依賴。例如出差類和會飛的東西是通過會飛的接口進行隔離,這樣不管出差類需要修改或者會飛的東西需要修改,都不會相互影響 如果一組相關的類中有公共的方法和特殊的方法,可以使用抽象類,在抽象類中固化公共的方法【算法骨架】,而無需具體子類重復實現;但是在抽象類中無法實現的方法可以延遲到子類中再實現。例如排序器BubbleSorter,其中抽象類BubbleSorter固化了所使用的冒泡排序算法,而將無法實現的bigger比較算法延遲到BubbleSorter的子類PigSorter中實現,同時PigSorter中也不需要重新定義排序算法 最佳軟件開發實踐:先定義接口規范調用方法,在使用抽象類實現接口定義公共方法,最后再定義具體子類實現所有的方法接口和抽象類的使用場景
從設計層面看,抽象類體現繼承關系is a,它主要描述類的從屬關系或者父子關系,抽象類和它的派生類之間是典型的IS-A關系,即子is a父。 interface可以多實現,而且不要求實現者和interface定義在概念本質上是一致的,僅僅是實現了interface定義的契約而已。它主要描述的是類型間的行為合同,接口和它的實現類之間是典型的CAN-DO關系,即子can do父。 為什么接口需要默認方法 在接口添加默認方法不需要修改實現類,接口新增的默認方法在實現類中直接可用。 另外還要注意默認方法沖突問題。總結
以上是生活随笔為你收集整理的java基础--接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL基础(学习笔记)
- 下一篇: Oracle项目管理系统的BIM应用