java中抽象類、抽象方法、接口與實(shí)現(xiàn)接口實(shí)例詳解
前言
對于java中的抽象類,抽象方法,接口,實(shí)現(xiàn)接口等具體的概念就不在這里詳細(xì)的說明了,網(wǎng)上書本都有很多解釋,主要是我懶,下面通過一個例子來說明其中的精髓要點(diǎn),能不能練成絕世武功,踏上封王之路,就看自己的的啦(不要誤會,我指的只是我自己啦啦)
用接口實(shí)現(xiàn)一個簡單的計算器
1、利用接口做參數(shù),寫個計算器,能完成+-*/運(yùn)算
(1)定義一個接口Compute含有一個方法int computer(int n,int m);
(2)設(shè)計四個類分別實(shí)現(xiàn)此接口,完成+-*/運(yùn)算
(3)設(shè)計一個類UseCompute,含有方法: public void useCom(Compute com, int one, int two)
此方法要求能夠:
* 1.用傳遞過來的對象調(diào)用computer方法完成運(yùn)算
* 2.輸出運(yùn)算的結(jié)果
(4)設(shè)計一個測試類,調(diào)用UseCompute中的方法useCom來完成+-*/運(yùn)算
//父類.并且使用用接口
package cn.yjlblog.wwww;
public interface Compute {
int computer(int n,int m);//抽象方法,勝率abstract ,public
}
//子類add 實(shí)現(xiàn)加法運(yùn)算
package cn.yjlblog.wwww;
public class add implements Compute{
@Override //接口的實(shí)現(xiàn)類和抽象類的子類是一樣的,要想可以使用new 一個對象,就必須對“抽象類”里的方法
//進(jìn)行重寫
public int computer(int n, int m) {
// TODO Auto-generated method stub
return n+m;
}
}
package cn.yjlblog.wwww;
//子類subtract 實(shí)現(xiàn)減法運(yùn)算
public class subtract implements Compute{
@Override
public int computer(int n, int m) {
// TODO Auto-generated method stub
return n-m;
}
}
子類multiplied 實(shí)現(xiàn)乘法運(yùn)算
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 實(shí)現(xiàn)整除運(yùn)算
public class divided implements Compute{
@Override
public int computer(int n, int m) {
// TODO Auto-generated method stub
return n/m;
}
}
//應(yīng)用類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("運(yùn)算結(jié)果為:"+x);
}
}
//測試類Test
package cn.yjlblog.wwww;
public class Test {
public static void main(String[] args) {
UseComepute uc = new UseComepute();//應(yīng)用類生成對象,使用useCome 方法
int one = 10;
int two = 20;
Compute ad = new add();//接口的多態(tài)
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);
//哈哈,類的名字忘記大寫了
}
}
為什么需要用到抽象類?
在下面這個例子中,把打印機(jī)類封裝成抽象類,把print定義成抽象類,當(dāng)HPPrinter和CannonPrinter要繼承printer類的時候,必須重寫print函數(shù)。這樣寫的好處是,每個打印機(jī)都有自己打印方式,此舉可以防止子類沒有寫明打印方式。
public abstract void Printer() {
public void open() {
system.out.print("打印機(jī)開啟");
}
public void close() {
system.out.print("打印機(jī)關(guān)閉");
}
abstract void print(); //把print方法定義為抽象方法
}
public HPPrinter extends Printer {
void print(){ //必須重寫抽象方法print()
system.out.print("惠普打印機(jī)開始打印");
};
}
public CanonPrinter extends Printer {
void print(){ //必須重寫抽象方法print()
system.out.print("佳能打印機(jī)開始打印");
};
}
抽象類和接口區(qū)別
(一)語法層次
public abstract class People { //關(guān)鍵詞abstract,聲明該類為抽象類
void Num();
abstract void Name(); //聲明該方法為抽象方法
}
Interface Person {
void Num();
void Name();
}
抽象類方式中,抽象類可以擁有任意范圍的成員數(shù)據(jù),同時也可以擁有自己的非抽象方法,
但是接口方式中,它僅能夠有靜態(tài)、不能修改的成員數(shù)據(jù)(但是我們一般是不會在接口中使用成員數(shù)據(jù)),同時它所有的方法都必須是抽象的。
在某種程度上來說,接口是抽象類的特殊化。
對子類而言,它只能繼承一個抽象類(這是java為了數(shù)據(jù)安全而考慮的),但是卻可以實(shí)現(xiàn)多個接口。
(二)設(shè)計層次
1、 抽象層次不同
抽象類是對類抽象,而接口是對行為的抽象。抽象類是對整個類整體進(jìn)行抽象,包括屬性、行為,但是接口卻是對類局部(行為)進(jìn)行抽象。
2、 跨域不同
抽象類所跨域的是具有相似特點(diǎn)的類,而接口卻可以跨域不同的類。我們知道抽象類是從子類中發(fā)現(xiàn)公共部分,然后泛化成抽象類,子類繼承該父類即可,但是接口不同。實(shí)現(xiàn)它的子類可以不存在任何關(guān)系,共同之處。例如貓、狗可以抽象成一個動物類抽象類,具備叫的方法。鳥、飛機(jī)可以實(shí)現(xiàn)飛Fly接口,具備飛的行為,這里我們總不能將鳥、飛機(jī)共用一個父類吧!所以說抽象類所體現(xiàn)的是一種繼承關(guān)系,要想使得繼承關(guān)系合理,父類和派生類之間必須存在"is-a" 關(guān)系,即父類和派生類在概念本質(zhì)上應(yīng)該是相同的。對于接口則不然,并不要求接口的實(shí)現(xiàn)者和接口定義在概念本質(zhì)上是一致的, 僅僅是實(shí)現(xiàn)了接口定義的契約而已。
3、 設(shè)計層次不同
對于抽象類而言,它是自下而上來設(shè)計的,我們要先知道子類才能抽象出父類,而接口則不同,它根本就不需要知道子類的存在,只需要定義一個規(guī)則即可,至于什么子類、什么時候怎么實(shí)現(xiàn)它一概不知。比如我們只有一個貓類在這里,如果你這是就抽象成一個動物類,是不是設(shè)計有點(diǎn)兒過度?我們起碼要有兩個動物類,貓、狗在這里,我們在抽象他們的共同點(diǎn)形成動物抽象類吧!所以說抽象類往往都是通過重構(gòu)而來的!但是接口就不同,比如說飛,我們根本就不知道會有什么東西來實(shí)現(xiàn)這個飛接口,怎么實(shí)現(xiàn)也不得而知,我們要做的就是事前定義好飛的行為接口。所以說抽象類是自底向上抽象而來的,接口是自頂向下設(shè)計出來的。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
一文掌握Spring Cookie和Session 是什么及區(qū)別介紹
Cookie和Session都是用于在客戶端和服務(wù)器之間傳遞信息的技術(shù),但它們的工作方式和使用場景有所不同,Cookie是在客戶端保存用戶信息的一種機(jī)制,而Session是在服務(wù)器端保存用戶信息的一種機(jī)制,本文介紹Spring Cookie和Session 是什么,感興趣的朋友一起看看吧2025-01-01
springboot?實(shí)現(xiàn)不同context-path下的會話共享
這篇文章主要介紹了springboot?實(shí)現(xiàn)不同context-path下的會話共享,基于很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
SpringMVC中MultipartFile上傳獲取圖片的寬度和高度詳解
本篇文章主要介紹了SpringMVC中MultipartFile上傳獲取圖片的寬度和高度,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05
詳解Spring Boot 部署jar和war的區(qū)別
本篇文章主要介紹了詳解Spring Boot 部署jar和war的區(qū)別,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09
Java實(shí)現(xiàn)簡易學(xué)籍管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡易學(xué)籍管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02
java實(shí)現(xiàn)自定義時鐘并實(shí)現(xiàn)走時功能
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)自定義時鐘并實(shí)現(xiàn)走時功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06
Java遞歸遍歷樹形結(jié)構(gòu)的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java遞歸遍歷樹形結(jié)構(gòu)的相關(guān)資料,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2016-03-03
java中MultipartFile互轉(zhuǎn)File的方法
本文主要介紹了java中MultipartFile互轉(zhuǎn)File的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10

