您好,登錄后才能下訂單哦!
前言
對于java中的抽象類,抽象方法,接口,實現接口等具體的概念就不在這里詳細的說明了,網上書本都有很多解釋,主要是我懶,下面通過一個例子來說明其中的精髓要點,能不能練成絕世武功,踏上封王之路,就看自己的的啦(不要誤會,我指的只是我自己啦啦)
用接口實現一個簡單的計算器
1、利用接口做參數,寫個計算器,能完成+-*/運算
(1)定義一個接口Compute含有一個方法int computer(int n,int m);
(2)設計四個類分別實現此接口,完成+-*/運算
(3)設計一個類UseCompute,含有方法: public void useCom(Compute com, int one, int two)
此方法要求能夠:
* 1.用傳遞過來的對象調用computer方法完成運算
* 2.輸出運算的結果
(4)設計一個測試類,調用UseCompute中的方法useCom來完成+-*/運算
//父類.并且使用用接口 package cn.yjlblog.wwww; public interface Compute { int computer(int n,int m);//抽象方法,勝率abstract ,public }
//子類add 實現加法運算 package cn.yjlblog.wwww; public class add implements Compute{ @Override //接口的實現類和抽象類的子類是一樣的,要想可以使用new 一個對象,就必須對“抽象類”里的方法 //進行重寫 public int computer(int n, int m) { // TODO Auto-generated method stub return n+m; } }
package cn.yjlblog.wwww; //子類subtract 實現減法運算 public class subtract implements Compute{ @Override public int computer(int n, int m) { // TODO Auto-generated method stub return n-m; } }
子類multiplied 實現乘法運算 package cn.yjlblog.wwww; public class multiplied implements Compute{ @Override public int computer(int n, int m) { // TODO Auto-generated method stub return n*m; } }
package cn.yjlblog.wwww; //子類divided 實現整除運算 public class divided implements Compute{ @Override public int computer(int n, int m) { // TODO Auto-generated method stub return n/m; } }
//應用類UseComepute 用來 package cn.yjlblog.wwww; public class UseComepute { public void useCom(Compute com,int one,int two){ int x = com.computer(one, two); System.out.println("運算結果為:"+x); } }
//測試類Test package cn.yjlblog.wwww; public class Test { public static void main(String[] args) { UseComepute uc = new UseComepute();//應用類生成對象,使用useCome 方法 int one = 10; int two = 20; Compute ad = new add();//接口的多態 Compute sub = new subtract(); Compute mul= new multiplied(); Compute div = new divided(); uc.useCom(ad, one, two); uc.useCom(sub, one, two); uc.useCom(mul, one, two); uc.useCom(div, one, two); //哈哈,類的名字忘記大寫了 } }
為什么需要用到抽象類?
在下面這個例子中,把打印機類封裝成抽象類,把print定義成抽象類,當HPPrinter和CannonPrinter要繼承printer類的時候,必須重寫print函數。這樣寫的好處是,每個打印機都有自己打印方式,此舉可以防止子類沒有寫明打印方式。
public abstract void Printer() { public void open() { system.out.print("打印機開啟"); } public void close() { system.out.print("打印機關閉"); } abstract void print(); //把print方法定義為抽象方法 } public HPPrinter extends Printer { void print(){ //必須重寫抽象方法print() system.out.print("惠普打印機開始打印"); }; } public CanonPrinter extends Printer { void print(){ //必須重寫抽象方法print() system.out.print("佳能打印機開始打印"); }; }
抽象類和接口區別
(一)語法層次
public abstract class People { //關鍵詞abstract,聲明該類為抽象類 void Num(); abstract void Name(); //聲明該方法為抽象方法 } Interface Person { void Num(); void Name(); }
抽象類方式中,抽象類可以擁有任意范圍的成員數據,同時也可以擁有自己的非抽象方法,
但是接口方式中,它僅能夠有靜態、不能修改的成員數據(但是我們一般是不會在接口中使用成員數據),同時它所有的方法都必須是抽象的。
在某種程度上來說,接口是抽象類的特殊化。
對子類而言,它只能繼承一個抽象類(這是java為了數據安全而考慮的),但是卻可以實現多個接口。
(二)設計層次
1、 抽象層次不同
抽象類是對類抽象,而接口是對行為的抽象。抽象類是對整個類整體進行抽象,包括屬性、行為,但是接口卻是對類局部(行為)進行抽象。
2、 跨域不同
抽象類所跨域的是具有相似特點的類,而接口卻可以跨域不同的類。我們知道抽象類是從子類中發現公共部分,然后泛化成抽象類,子類繼承該父類即可,但是接口不同。實現它的子類可以不存在任何關系,共同之處。例如貓、狗可以抽象成一個動物類抽象類,具備叫的方法。鳥、飛機可以實現飛Fly接口,具備飛的行為,這里我們總不能將鳥、飛機共用一個父類吧!所以說抽象類所體現的是一種繼承關系,要想使得繼承關系合理,父類和派生類之間必須存在"is-a" 關系,即父類和派生類在概念本質上應該是相同的。對于接口則不然,并不要求接口的實現者和接口定義在概念本質上是一致的, 僅僅是實現了接口定義的契約而已。
3、 設計層次不同
對于抽象類而言,它是自下而上來設計的,我們要先知道子類才能抽象出父類,而接口則不同,它根本就不需要知道子類的存在,只需要定義一個規則即可,至于什么子類、什么時候怎么實現它一概不知。比如我們只有一個貓類在這里,如果你這是就抽象成一個動物類,是不是設計有點兒過度?我們起碼要有兩個動物類,貓、狗在這里,我們在抽象他們的共同點形成動物抽象類吧!所以說抽象類往往都是通過重構而來的!但是接口就不同,比如說飛,我們根本就不知道會有什么東西來實現這個飛接口,怎么實現也不得而知,我們要做的就是事前定義好飛的行為接口。所以說抽象類是自底向上抽象而來的,接口是自頂向下設計出來的。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。