Java的介面及例項 Java的介面及例項
一、定義
Java介面(Interface),是一系列方法的宣告,是一些方法特徵的集合,一個介面只有方法的特徵沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為(功能)。
介面定義的一般形式為:
[訪問控制符]interface <介面名> {
型別識別符號final 符號常量名n = 常數;
返回值型別 方法名([引數列表]);
…
}
二、介面的特點
1、Java介面中的成員變數預設都是public,static,final型別的(都可省略),必須被顯示初始化,即介面中的成員變數為常量(大寫,單詞之間用"_"分隔)
2、Java介面中的方法預設都是public,abstract型別的(都可省略),沒有方法體,不能被例項化
3、Java介面中只能包含public,static,final型別的成員變數和public,abstract型別的成員方法
4、介面中沒有構造方法,不能被例項化
5、一個介面不能實現(implements)另一個介面,但它可以繼承多個其它的介面
6、Java介面必須通過類來實現它的抽象方法
7、當類實現了某個Java介面時,它必須實現介面中的所有抽象方法,否則這個類必須宣告為抽象類
8、不允許建立介面的例項(例項化),但允許定義介面型別的引用變數,該引用變數引用實現了這個介面的類的例項
9、一個類只能繼承一個直接的父類,但可以實現多個介面,間接的實現了多繼承.
三、介面的用法
1、精簡程式結構,免除重複定義
比如,有兩個及上的的類擁有相同的方法,但是實現功能不一樣,就可以定義一個介面,將這個方法提煉出來,在需要使用該方法的類中去實現,就免除了多個類定義系統方法的麻煩。
舉例:鳥類和昆蟲類都具有飛行的功能,這個功能是相同的,但是其它功能是不同的,在程式實現的過程中,就可以定義一個介面,專門描述飛行。
下圖是分別定義鳥類和昆蟲類,其都有飛行的方法。
下圖定義了介面,其類圖如下:
實現程式碼如下:
interface Flyanimal{ void fly(); } class Insect { int legnum=6; } class Bird { int legnum=2; void egg(){}; } class Ant extendsInsect implements Flyanimal { public void fly(){ System.out.println("Ant can fly"); } } classPigeon extends Bird implements Flyanimal { public void fly(){ System.out.println("pigeon can fly"); } public void egg(){ System.out.println("pigeon can lay eggs "); } } public classInterfaceDemo{ public static void main(String args[]){ Ant a=new Ant(); a.fly(); System.out.println("Ant's legs are"+ a.legnum); Pigeon p= new Pigeon(); p.fly(); p.egg(); } }
程式執行結果:
Ant can fly
Ant'slegs are 6
pigeon can fly
pigeon can lay eggs
二、拓展程式功能,應對需求變化。
假設一個學校接待方面的程式,招待不同身份的人的食宿問題,其對應規則如下:
身份 |
食 |
宿 |
學生 |
食堂 |
宿舍 |
教師 |
教師食堂 |
學校公寓 |
學生家長 |
招待所 |
招待所 |
理論上,當然可以對每個不同身份的人各定義一個對應的類,並實現各自的方法,但是觀察這寫類,可以歸納出其有一個共同的模板,即“人”的“食、宿”問題。這時候,就可以發揮介面的功能了。實現程式碼如下:
interfacePerson{ void eat(); void sleep(); } class Studentimplements Person{ public void eat(){ System.out.println("學生去食堂吃飯!"); } public void sleep(){ System.out.println("學生回寢室睡覺!"); } } class Teacherimplements Person{ public void eat(){ System.out.println("教師去教工餐廳吃飯!"); } public void sleep(){ System.out.println("教師回學校公寓睡覺!"); } } class Parents implements Person{ publicvoid eat(){ System.out.println("家長去招待所飯館吃飯!"); } public void sleep(){ System.out.println("家長回招待所睡覺!"); } } public class PersonInterface{ public static void main(String[] args) { Person p=new Student(); p.eat(); p.sleep(); p=new Teacher(); p.eat(); p.sleep(); p=new Parents(); p.eat(); p.sleep(); } }
程式執行結果:
學生去食堂吃飯!
學生回寢室睡覺!
教師去教工餐廳吃飯!
教師回學校公寓睡覺!
家長去招待所飯館吃飯!
家長回招待所睡覺!
現在需要新增一些功能,即現在需要新增“外賓、上級領導”兩類角色,並且以後工具需要還要新增相應的身份角色的人進來,此時,只需要根據需要新增“外賓”類、“領導”類,而主類仍然可以拿來就用,無需進行更多的修改。此時就可以顯示出介面的作用了。
在上面的程式中新增如下兩個類即可。
class Foreign implements Person{ publicvoid eat(){ System.out.println("外賓去酒店吃飯!"); } public void sleep(){ System.out.println("外賓回酒店睡覺!"); } } class Leader implements Person{ publicvoid eat(){ System.out.println("領導去賓館吃飯!"); } public void sleep(){ System.out.println("外賓回賓館睡覺!"); } }
而主函式中用法仍然一樣。
下面給出完整的程式碼:
interfacePerson{ void eat(); void sleep(); } class Studentimplements Person{ public void eat(){ System.out.println("學生去食堂吃飯!"); } public void sleep(){ System.out.println("學生回寢室睡覺!"); } } class Teacherimplements Person{ public void eat(){ System.out.println("教師去教工餐廳吃飯!"); } public void sleep(){ System.out.println("教師回學校公寓睡覺!"); } } class Parents implements Person{ publicvoid eat(){ System.out.println("家長去招待所飯館吃飯!"); } public void sleep(){ System.out.println("家長回招待所睡覺!"); } } class Foreign implements Person{ publicvoid eat(){ System.out.println("外賓去酒店吃飯!"); } public void sleep(){ System.out.println("外賓回酒店睡覺!"); } } class Leader implements Person{ publicvoid eat(){ System.out.println("領導去賓館吃飯!"); } public void sleep(){ System.out.println("領導回賓館睡覺!"); } } public class PersonInterface{ public static void main(String[] args) { Person p=new Student(); p.eat(); p.sleep(); p=new Teacher(); p.eat(); p.sleep(); p=new Parents(); p.eat(); p.sleep(); p=new Foreign(); p.eat(); p.sleep(); p=new Leader(); p.eat(); p.sleep(); } }
程式執行結果:
學生去食堂吃飯!
學生回寢室睡覺!
教師去教工餐廳吃飯!
教師回學校公寓睡覺!
家長去招待所飯館吃飯!
家長回招待所睡覺!
外賓去酒店吃飯!
外賓回酒店睡覺!
領導去賓館吃飯!
領導回賓館睡覺!
舉例二:
用來計算每一種交通工具執行1000公里所需的時間,已知每種交通工具的引數都是3個整數A、B、C的表示式。現有兩種工具:
Car 和Plane,其中Car 的速度運算公式為:A*B/C
Plane 的速度運算公式為:A+B+C。
如果增加第3種交通工具的時候,比如火車(Train)不必修改以前的任何程式,只需要編寫新的交通工具的程式。
import java.lang.*; interface Common { double runTimer(doublea, double b, double c); String getName(); //獲取交通工具的名稱 } class Plane implementsCommon { public doublerunTimer(double a, double b, double c) { return (a+ b + c); } public String getName(){ return"Plane"; } } class Car implements Common { public doublerunTimer(double a, double b, double c) { return ( a*b/c ); } public String getName(){ return"Car"; } } public class ComputeTime { public static void main(Stringargs[]) { double A=3; double B=5; double C=6; double v,t; Commond=new Car(); v=d.runTimer(A,B,C); t=1000/v; System.out.println(d.getName()+"的平均速度: "+v+" km/h"); System.out.println(d.getName()+"的執行時間:"+t+" 小時"); d=newPlane(); v=d.runTimer(10,30,40); t=1000/v; System.out.println(d.getName()+"的平均速度: "+v+" km/h"); System.out.println(d.getName()+"的執行時間:"+t+" 小時"); } }
程式執行結果;
Car的平均速度: 2.5 km/h
Car的執行時間:400.0 小時
Plane的平均速度: 80.0 km/h
Plane的執行時間:12.5 小時
一、定義
Java介面(Interface),是一系列方法的宣告,是一些方法特徵的集合,一個介面只有方法的特徵沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為(功能)。
介面定義的一般形式為:
[訪問控制符]interface <介面名> {
型別識別符號final 符號常量名n = 常數;
返回值型別 方法名([引數列表]);
…
}
二、介面的特點
1、Java介面中的成員變數預設都是public,static,final型別的(都可省略),必須被顯示初始化,即介面中的成員變數為常量(大寫,單詞之間用"_"分隔)
2、Java介面中的方法預設都是public,abstract型別的(都可省略),沒有方法體,不能被例項化
3、Java介面中只能包含public,static,final型別的成員變數和public,abstract型別的成員方法
4、介面中沒有構造方法,不能被例項化
5、一個介面不能實現(implements)另一個介面,但它可以繼承多個其它的介面
6、Java介面必須通過類來實現它的抽象方法
7、當類實現了某個Java介面時,它必須實現介面中的所有抽象方法,否則這個類必須宣告為抽象類
8、不允許建立介面的例項(例項化),但允許定義介面型別的引用變數,該引用變數引用實現了這個介面的類的例項
9、一個類只能繼承一個直接的父類,但可以實現多個介面,間接的實現了多繼承.
三、介面的用法
1、精簡程式結構,免除重複定義
比如,有兩個及上的的類擁有相同的方法,但是實現功能不一樣,就可以定義一個介面,將這個方法提煉出來,在需要使用該方法的類中去實現,就免除了多個類定義系統方法的麻煩。
舉例:鳥類和昆蟲類都具有飛行的功能,這個功能是相同的,但是其它功能是不同的,在程式實現的過程中,就可以定義一個介面,專門描述飛行。
下圖是分別定義鳥類和昆蟲類,其都有飛行的方法。
下圖定義了介面,其類圖如下:
實現程式碼如下:
interface Flyanimal{ void fly(); } class Insect { int legnum=6; } class Bird { int legnum=2; void egg(){}; } class Ant extendsInsect implements Flyanimal { public void fly(){ System.out.println("Ant can fly"); } } classPigeon extends Bird implements Flyanimal { public void fly(){ System.out.println("pigeon can fly"); } public void egg(){ System.out.println("pigeon can lay eggs "); } } public classInterfaceDemo{ public static void main(String args[]){ Ant a=new Ant(); a.fly(); System.out.println("Ant's legs are"+ a.legnum); Pigeon p= new Pigeon(); p.fly(); p.egg(); } }
程式執行結果:
Ant can fly
Ant'slegs are 6
pigeon can fly
pigeon can lay eggs
二、拓展程式功能,應對需求變化。
假設一個學校接待方面的程式,招待不同身份的人的食宿問題,其對應規則如下:
身份 |
食 |
宿 |
學生 |
食堂 |
宿舍 |
教師 |
教師食堂 |
學校公寓 |
學生家長 |
招待所 |
招待所 |
理論上,當然可以對每個不同身份的人各定義一個對應的類,並實現各自的方法,但是觀察這寫類,可以歸納出其有一個共同的模板,即“人”的“食、宿”問題。這時候,就可以發揮介面的功能了。實現程式碼如下:
interfacePerson{ void eat(); void sleep(); } class Studentimplements Person{ public void eat(){ System.out.println("學生去食堂吃飯!"); } public void sleep(){ System.out.println("學生回寢室睡覺!"); } } class Teacherimplements Person{ public void eat(){ System.out.println("教師去教工餐廳吃飯!"); } public void sleep(){ System.out.println("教師回學校公寓睡覺!"); } } class Parents implements Person{ publicvoid eat(){ System.out.println("家長去招待所飯館吃飯!"); } public void sleep(){ System.out.println("家長回招待所睡覺!"); } } public class PersonInterface{ public static void main(String[] args) { Person p=new Student(); p.eat(); p.sleep(); p=new Teacher(); p.eat(); p.sleep(); p=new Parents(); p.eat(); p.sleep(); } }
程式執行結果:
學生去食堂吃飯!
學生回寢室睡覺!
教師去教工餐廳吃飯!
教師回學校公寓睡覺!
家長去招待所飯館吃飯!
家長回招待所睡覺!
現在需要新增一些功能,即現在需要新增“外賓、上級領導”兩類角色,並且以後工具需要還要新增相應的身份角色的人進來,此時,只需要根據需要新增“外賓”類、“領導”類,而主類仍然可以拿來就用,無需進行更多的修改。此時就可以顯示出介面的作用了。
在上面的程式中新增如下兩個類即可。
class Foreign implements Person{ publicvoid eat(){ System.out.println("外賓去酒店吃飯!"); } public void sleep(){ System.out.println("外賓回酒店睡覺!"); } } class Leader implements Person{ publicvoid eat(){ System.out.println("領導去賓館吃飯!"); } public void sleep(){ System.out.println("外賓回賓館睡覺!"); } }
而主函式中用法仍然一樣。
下面給出完整的程式碼:
interfacePerson{ void eat(); void sleep(); } class Studentimplements Person{ public void eat(){ System.out.println("學生去食堂吃飯!"); } public void sleep(){ System.out.println("學生回寢室睡覺!"); } } class Teacherimplements Person{ public void eat(){ System.out.println("教師去教工餐廳吃飯!"); } public void sleep(){ System.out.println("教師回學校公寓睡覺!"); } } class Parents implements Person{ publicvoid eat(){ System.out.println("家長去招待所飯館吃飯!"); } public void sleep(){ System.out.println("家長回招待所睡覺!"); } } class Foreign implements Person{ publicvoid eat(){ System.out.println("外賓去酒店吃飯!"); } public void sleep(){ System.out.println("外賓回酒店睡覺!"); } } class Leader implements Person{ publicvoid eat(){ System.out.println("領導去賓館吃飯!"); } public void sleep(){ System.out.println("領導回賓館睡覺!"); } } public class PersonInterface{ public static void main(String[] args) { Person p=new Student(); p.eat(); p.sleep(); p=new Teacher(); p.eat(); p.sleep(); p=new Parents(); p.eat(); p.sleep(); p=new Foreign(); p.eat(); p.sleep(); p=new Leader(); p.eat(); p.sleep(); } }
程式執行結果:
學生去食堂吃飯!
學生回寢室睡覺!
教師去教工餐廳吃飯!
教師回學校公寓睡覺!
家長去招待所飯館吃飯!
家長回招待所睡覺!
外賓去酒店吃飯!
外賓回酒店睡覺!
領導去賓館吃飯!
領導回賓館睡覺!
舉例二:
用來計算每一種交通工具執行1000公里所需的時間,已知每種交通工具的引數都是3個整數A、B、C的表示式。現有兩種工具:
Car 和Plane,其中Car 的速度運算公式為:A*B/C
Plane 的速度運算公式為:A+B+C。
如果增加第3種交通工具的時候,比如火車(Train)不必修改以前的任何程式,只需要編寫新的交通工具的程式。
import java.lang.*; interface Common { double runTimer(doublea, double b, double c); String getName(); //獲取交通工具的名稱 } class Plane implementsCommon { public doublerunTimer(double a, double b, double c) { return (a+ b + c); } public String getName(){ return"Plane"; } } class Car implements Common { public doublerunTimer(double a, double b, double c) { return ( a*b/c ); } public String getName(){ return"Car"; } } public class ComputeTime { public static void main(Stringargs[]) { double A=3; double B=5; double C=6; double v,t; Commond=new Car(); v=d.runTimer(A,B,C); t=1000/v; System.out.println(d.getName()+"的平均速度: "+v+" km/h"); System.out.println(d.getName()+"的執行時間:"+t+" 小時"); d=newPlane(); v=d.runTimer(10,30,40); t=1000/v; System.out.println(d.getName()+"的平均速度: "+v+" km/h"); System.out.println(d.getName()+"的執行時間:"+t+" 小時"); } }
程式執行結果;
Car的平均速度: 2.5 km/h
Car的執行時間:400.0 小時
Plane的平均速度: 80.0 km/h
Plane的執行時間:12.5 小時