今天和同事好好的討論了Java接口的原理和作用,發現原來自己的對接口的理解僅僅是局限在概念的高度抽象上,覺得好像理解了但是不會變化應用其實和沒有理解差不多。以前看一個帖子說學習一個東西不管什麼時候都要帶著“這個東西是什麼?”、“這個東西有什麼作用?”和“這個東西怎樣用?”三個問題,這三個問題回答上來了說明你對這個事物的理解達到了一定的高度。
今天還有一個比較深的經驗是要學習到知識就要多和人交流。就像以前某個管理人員說得“要瘋狂的交流”。
現在對於今天學到的接口部分做一個詳細地總結:
接口的概念其實並不難理解,接口關鍵字Interface,在使用時可以只定義函數體而不需要具體的實現。再類的繼承過程中可以實現多個接口而取代了類的多繼承。使用接口其實就有點像實現虛函數的調用一樣,用繼承接口的子類實例化聲名得借口就可以通過接口調用子類內部接口定義的函數。使用這種接口方式編程,如果業務邏輯發生變化需要新增類多方法,就可以再不改變原來已經寫好的代碼基礎上新增一個類來實現接口中定義的函數來實現。具體方法請看下面兩個例子:
1、Java多態接口動態加載實例
用來計算每一種交通工具運行1000公裡所需的時間,已知每種交通工具的參數都是3個整數A、B、C的表達式。現有兩種工具:
Car 和Plane,其中Car 的速度運算公式為:A*B/C
Plane 的速度運算公式為:A+B+C。
需要編寫三類:ComputeTime.java,Plane.java,Car007.java和接口Common.Java,要求在未來如果增加第3種交通工具的時候,不必修改以前的任何程序,只需要編寫新的交通工具的程序。其運行過程如下,從命令行輸入ComputeTime的四個參數,第一個是交通工具的類型,第二、三、四個參數分別時整數A、B、C,舉例如下:
計算Plane的時間:"Java ComputeTime Plane 20 30 40"
計算Car007的時間:"Java ComputeTime Car007 23 34 45"
如果第3種交通工具為Ship,則只需要編寫Ship.java,運行時輸入:"Java ComputeTime Ship 22 33 44"
提示:充分利用接口的概念,接口對象充當參數。
實例化一個對象的另外一種辦法:Class.forName(str).newInstance();例如需要實例化一個Plane對象的話,則只要調用Class.forName("Plane").newInstance()便可。
Java代碼:
- import CalTime.vehicle.all.Common;
- import Java.lang.*;
- public interface Common ...{
- double runTimer(double a, double b, double c);
- }
- public class Plane implements Common ...{
- public double runTimer(double a, double b, double c) ...{
- return (a+ b + c);
- }
- }
- public class Car implements Common ...{
- public double runTimer(double a, double b, double c) ...{
- return ( a*b/c );
- }
- }
- public class ComputeTime ...{
- public static void main(String args[]) ...{
- System.out.println("交通工具: "+args[0]);
- System.out.println(" 參數A: "+args[1]);
- System.out.println(" 參數B: "+args[2]);
- System.out.println(" 參數C: "+args[3]);
- double A=Double.parseDouble(args[1]);
- double B=Double.parseDouble(args[2]);
- double C=Double.parseDouble(args[3]);
- double v,t;
- try ...{
- Common d=(Common) Class.forName("CalTime.vehicle."+args[0]).newInstance();
- v=d.runTimer(A,B,C);
- t=1000/v;
- System.out.println("平均速度: "+v+" km/h");
- System.out.println("運行時間:"+t+" 小時");
- } catch(Exception e) ...{
- System.out.println("class not found");
- }
- }
- }
以前看過一個求形狀的題目就是有兩個圓形求交集現在定義了兩種情況問要是擴展大別的情況應當怎麼設計,想了很久不得其解,現在忽然覺得接口通殺矣~
2、Java接口作為參數傳遞
可以將借口類型的參數作為方法參數,在實際是使用時可以將實現了接口的類傳遞給方法,後方法或按照重寫的原則執行,實際調用的是實現類中的方法代碼體,這樣便根據傳進屋的參數的不同而實現不同的功能。重要的是,當我以後徐要林外一個對象並且擁有接受說生命的方法的時候的時候,我們不必須原類,只需新的類實現借口即可。
Java代碼:
- import Java.lang.*;
- interface Extendbroadable ...{
- public void inPut();
- }
- class KeyBroad implements Extendbroadable ...{
- public void inPut() ...{
- System.out.println(" hi,keybroad has be input into then mainbroad! ");
- }
- }
- class NetCardBroad implements Extendbroadable ...{
- public void inPut() ...{
- System.out.println(" hi,netCardBroad has be input into then mainbroad! ");
- }
- }
- class CheckBroad ...{
- public void getMainMessage(Extendbroadable ext)...{
- ext.inPut();
- }
- }
- public class InterfaceTest01 ...{
- public static void main(String []args) ...{
- KeyBroad kb=new KeyBroad();
- NetCardBroad ncb=new NetCardBroad();
- CheckBroad cb=new CheckBroad();
- cb.getMainMessage(kb);
- cb.getMainMessage(ncb);
- }
- }
希望本文的介紹,能給你帶來幫助。