亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java中的“抽象接口”

2019-11-06 07:00:33
字體:
來源:轉載
供稿:網友

學習java的同學注意了?。?! 學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:523047986  我們一起學Java!

       在程序設計過程中,讀者很可能遇到這樣一種困境:設計了一個接口,但實現這個接口的子類并不需要實現接口中的全部方法,也就是說,接口中的方法過多,對于某些子類是多余的,我們不得不浪費的寫上一個空的實現。

       今天小菜提到的“抽象接口”,就是用來解決這個問題的。

       為了不誤導讀者,先說明一下,什么是“抽象接口”。

       所謂“抽象接口”,即在提供接口的同時,提供一個抽象類,用抽象類實現該接口(實際上這是缺省適配模式)。

       下面小菜舉個例子,讓讀者體會這樣做的好處。

       代碼寫的不咋地,為了防止讀者看不懂,先上一張類圖:

具體代碼:

  ITestInterface.java

復制代碼
1 /*2     假設有一個頂層接口3 */4 public interface ITestInterface{5     void method1();6     int method2();7     boolean method3();8 }復制代碼

 

 

  TestAbstract.java

復制代碼
 1 /* 2     抽象類abstract實現了ITestInterface頂層接口 3 */ 4  5 public abstract class TestAbstract implements ITestInterface{ 6     //找出接口中必要的方法,也就是子類必須實現的方法,定義成抽象方法,交由子類實現 7     public abstract void method1(); 8     public abstract int method2(); 9     10     //一些獨特的方法可以在抽象類中默認實現11     public boolean method3(){12         return true;13     }14 }復制代碼

 

  

  TestClass1.java

復制代碼
 1 /* 2     普通類TestClass1繼承了TestAbstract抽象類 3 */ 4  5 public class TestClass1 extends TestAbstract{ 6      7     //TestClass1必須實現抽象的method1方法,該方法最早是接口中定義的 8     public void method1(){ 9         10     }11     //TestClass1必須實現抽象的method2方法,該方法最早是接口中定義的12     public int method2(){13         return 1;14     }15     16     //接口中的method3方法對于TestClass1無關緊要,因此不做重寫。17 }復制代碼

 

 

  TestClass2.java

復制代碼
 1 /* 2     普通類TestClass2繼承了TestAbstract抽象類 3 */ 4  5 public class TestClass2 extends TestAbstract{ 6      7     //TestClass2必須實現抽象的method1方法,該方法最早是接口中定義的 8     public void method1(){ 9     10     }11     //TestClass2必須實現抽象的method2方法,該方法最早是接口中定義的12     public int method2(){13         return 2;14     }15     16     //method3方法對于TestClass2來說至關重要,因此必須重寫。17     public boolean method3(){18         return false;19     }20     21 }復制代碼

 

 

代碼精講:

    從以上例子可以看出,最高層的接口被一個抽象類實現,在抽象類中,我們把關鍵的method1、method2方法定義成抽象方法,強制子類去實現,而“獨特”的method3方法在抽象類中做一個默認實現。

    等到TestClass1、TestClass2繼承TestAbstract抽象類時,優勢就體現出來了,TestClass1、TestClass2必須實現method1、method2,但如果用不到method3,可以直接無視。

    通過接口和抽象類的結合,避免了在實現接口的子類中出現大量的“無意義”實現,這個“無意義”實現,被緩沖到了抽象類中,完美展現了代碼復用(可以把抽象類理解成接口和實現類之間的緩沖)。

    需要指出的是,我們既可以選擇繼承抽象類,也可以選擇實現接口,并不是說一定要繼承抽象類,看情況而定,這里是兩種選擇,兩個機會。

      

              寫到這,或許讀者覺得文章已經結束了,其實沒有。。。

              這樣做的好處不僅僅是這一點,細細品味,假如我們向接口中增加了一個方法。。。

 

具體代碼:

  溫馨提示:不要被代碼嚇到,其實這些代碼和上邊的差不多,只不過加了個方法而已。

 

  ITestInterface.java

復制代碼
 1 /* 2     假設有一個頂層接口 3 */ 4 public interface ITestInterface{ 5     void method1(); 6     int method2(); 7     boolean method3(); 8     //接口中新增加了方法 9     String method4();10 }復制代碼

 

 

  TestAbstract.java

復制代碼
 1 /* 2     抽象類abstract實現了ITestInterface頂層接口 3 */ 4  5 public abstract class TestAbstract implements ITestInterface{ 6     //找出接口中必要的方法,也就是子類必須實現的方法,定義成抽象方法,交由子類實現 7     public abstract void method1(); 8     public abstract int method2(); 9     10     //一些獨特的方法可以在抽象類中默認實現11     public boolean method3(){12         return true;13     }14     15     //抽象類中提供一個默認實現,這樣就可以避免"驚動"所有子類16     public String method4(){17         return "";18     }19 }復制代碼

 

 

  TestClass1.java

復制代碼
 1 /* 2     普通類TestClass1繼承了TestAbstract抽象類 3 */ 4  5 public class TestClass1 extends TestAbstract{ 6      7     //TestClass1必須實現抽象的method1方法,該方法最早是接口中定義的 8     public void method1(){ 9         10     }11     //TestClass1必須實現抽象的method2方法,該方法最早是接口中定義的12     public int method2(){13         return 1;14     }15     16     //接口中的method3方法對于TestClass1無關緊要,因此不做重寫。17     18     //新增的方法對于TestClass1來說至關重要,因此必須重寫19     public String method4(){20         return "Class1";21     }22 23 }復制代碼

 

 

  TestClass2.java

復制代碼
 1 /* 2     普通類TestClass2繼承了TestAbstract抽象類 3 */ 4  5 public class TestClass2 extends TestAbstract{ 6      7     //TestClass2必須實現抽象的method1方法,該方法最早是接口中定義的 8     public void method1(){ 9     10     }11     //TestClass2必須實現抽象的method2方法,該方法最早是接口中定義的12     public int method2(){13         return 2;14     }15     16     //method3方法對于TestClass2來說至關重要,因此必須重寫。17     public boolean method3(){18         return false;19     }20     21     //新增的方法對于TestClass2來說無關緊要,無需知道新增method4的存在22 }復制代碼

 

 

代碼精講:

    這段代碼演示了假如項目已經成型,但是需求有變,我們不得不向接口中增加一個新的方法,假如子類直接實現了接口,那么這些子類都要修改,來實現接口新增的方法。

    但本例中的TestClass1、TestClass2子類沒有直接實現接口,而是通過繼承抽象類間接實現接口,這樣好處一下就體現出來了!

    向接口中新增的方法,可以在實現接口的抽象類中緩沖一下,提供一個默認的實現,這樣一來,就不必強制所有的子類(通過繼承抽象類間接實現接口的類)都進行修改,可以形象的理解為“沒有驚動子類”。而需要使用這個方法的子類,直接重寫即可。

學習Java的同學注意了?。?! 學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:523047986  我們一起學Java!

       在程序設計過程中,讀者很可能遇到這樣一種困境:設計了一個接口,但實現這個接口的子類并不需要實現接口中的全部方法,也就是說,接口中的方法過多,對于某些子類是多余的,我們不得不浪費的寫上一個空的實現。

       今天小菜提到的“抽象接口”,就是用來解決這個問題的。

       為了不誤導讀者,先說明一下,什么是“抽象接口”。

       所謂“抽象接口”,即在提供接口的同時,提供一個抽象類,用抽象類實現該接口(實際上這是缺省適配模式)。

       下面小菜舉個例子,讓讀者體會這樣做的好處。

       代碼寫的不咋地,為了防止讀者看不懂,先上一張類圖:

具體代碼:

  ITestInterface.java

復制代碼
1 /*2     假設有一個頂層接口3 */4 public interface ITestInterface{5     void method1();6     int method2();7     boolean method3();8 }復制代碼

 

 

  TestAbstract.java

復制代碼
 1 /* 2     抽象類abstract實現了ITestInterface頂層接口 3 */ 4  5 public abstract class TestAbstract implements ITestInterface{ 6     //找出接口中必要的方法,也就是子類必須實現的方法,定義成抽象方法,交由子類實現 7     public abstract void method1(); 8     public abstract int method2(); 9     10     //一些獨特的方法可以在抽象類中默認實現11     public boolean method3(){12         return true;13     }14 }復制代碼

 

  

  TestClass1.java

復制代碼
 1 /* 2     普通類TestClass1繼承了TestAbstract抽象類 3 */ 4  5 public class TestClass1 extends TestAbstract{ 6      7     //TestClass1必須實現抽象的method1方法,該方法最早是接口中定義的 8     public void method1(){ 9         10     }11     //TestClass1必須實現抽象的method2方法,該方法最早是接口中定義的12     public int method2(){13         return 1;14     }15     16     //接口中的method3方法對于TestClass1無關緊要,因此不做重寫。17 }復制代碼

 

 

  TestClass2.java

復制代碼
 1 /* 2     普通類TestClass2繼承了TestAbstract抽象類 3 */ 4  5 public class TestClass2 extends TestAbstract{ 6      7     //TestClass2必須實現抽象的method1方法,該方法最早是接口中定義的 8     public void method1(){ 9     10     }11     //TestClass2必須實現抽象的method2方法,該方法最早是接口中定義的12     public int method2(){13         return 2;14     }15     16     //method3方法對于TestClass2來說至關重要,因此必須重寫。17     public boolean method3(){18         return false;19     }20     21 }復制代碼

 

 

代碼精講:

    從以上例子可以看出,最高層的接口被一個抽象類實現,在抽象類中,我們把關鍵的method1、method2方法定義成抽象方法,強制子類去實現,而“獨特”的method3方法在抽象類中做一個默認實現。

    等到TestClass1、TestClass2繼承TestAbstract抽象類時,優勢就體現出來了,TestClass1、TestClass2必須實現method1、method2,但如果用不到method3,可以直接無視。

    通過接口和抽象類的結合,避免了在實現接口的子類中出現大量的“無意義”實現,這個“無意義”實現,被緩沖到了抽象類中,完美展現了代碼復用(可以把抽象類理解成接口和實現類之間的緩沖)。

    需要指出的是,我們既可以選擇繼承抽象類,也可以選擇實現接口,并不是說一定要繼承抽象類,看情況而定,這里是兩種選擇,兩個機會。

      

              寫到這,或許讀者覺得文章已經結束了,其實沒有。。。

              這樣做的好處不僅僅是這一點,細細品味,假如我們向接口中增加了一個方法。。。

 

具體代碼:

  溫馨提示:不要被代碼嚇到,其實這些代碼和上邊的差不多,只不過加了個方法而已。

 

  ITestInterface.java

復制代碼
 1 /* 2     假設有一個頂層接口 3 */ 4 public interface ITestInterface{ 5     void method1(); 6     int method2(); 7     boolean method3(); 8     //接口中新增加了方法 9     String method4();10 }復制代碼

 

 

  TestAbstract.java

復制代碼
 1 /* 2     抽象類abstract實現了ITestInterface頂層接口 3 */ 4  5 public abstract class TestAbstract implements ITestInterface{ 6     //找出接口中必要的方法,也就是子類必須實現的方法,定義成抽象方法,交由子類實現 7     public abstract void method1(); 8     public abstract int method2(); 9     10     //一些獨特的方法可以在抽象類中默認實現11     public boolean method3(){12         return true;13     }14     15     //抽象類中提供一個默認實現,這樣就可以避免"驚動"所有子類16     public String method4(){17         return "";18     }19 }復制代碼

 

 

  TestClass1.java

復制代碼
 1 /* 2     普通類TestClass1繼承了TestAbstract抽象類 3 */ 4  5 public class TestClass1 extends TestAbstract{ 6      7     //TestClass1必須實現抽象的method1方法,該方法最早是接口中定義的 8     public void method1(){ 9         10     }11     //TestClass1必須實現抽象的method2方法,該方法最早是接口中定義的12     public int method2(){13         return 1;14     }15     16     //接口中的method3方法對于TestClass1無關緊要,因此不做重寫。17     18     //新增的方法對于TestClass1來說至關重要,因此必須重寫19     public String method4(){20         return "Class1";21     }22 23 }復制代碼

 

 

  TestClass2.java

復制代碼
 1 /* 2     普通類TestClass2繼承了TestAbstract抽象類 3 */ 4  5 public class TestClass2 extends TestAbstract{ 6      7     //TestClass2必須實現抽象的method1方法,該方法最早是接口中定義的 8     public void method1(){ 9     10     }11     //TestClass2必須實現抽象的method2方法,該方法最早是接口中定義的12     public int method2(){13         return 2;14     }15     16     //method3方法對于TestClass2來說至關重要,因此必須重寫。17     public boolean method3(){18         return false;19     }20     21     //新增的方法對于TestClass2來說無關緊要,無需知道新增method4的存在22 }復制代碼

 

 

代碼精講:

    這段代碼演示了假如項目已經成型,但是需求有變,我們不得不向接口中增加一個新的方法,假如子類直接實現了接口,那么這些子類都要修改,來實現接口新增的方法。

    但本例中的TestClass1、TestClass2子類沒有直接實現接口,而是通過繼承抽象類間接實現接口,這樣好處一下就體現出來了!

    向接口中新增的方法,可以在實現接口的抽象類中緩沖一下,提供一個默認的實現,這樣一來,就不必強制所有的子類(通過繼承抽象類間接實現接口的類)都進行修改,可以形象的理解為“沒有驚動子類”。而需要使用這個方法的子類,直接重寫即可。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区三区网站| 亚洲精品美女久久| 欧美大奶子在线| 久久成人在线视频| 红桃av永久久久| 成人福利在线视频| 98精品在线视频| 久久久亚洲欧洲日产国码aⅴ| 国产一区二区三区网站| 国产福利精品在线| 亚洲最大福利视频网| 97色在线观看| 欧美理论电影在线观看| 啊v视频在线一区二区三区| 亚洲激情视频网| 亚洲成人免费在线视频| 日韩动漫免费观看电视剧高清| 91精品国产高清自在线看超| 国产有码在线一区二区视频| 美女啪啪无遮挡免费久久网站| 欧美日韩福利视频| 亚洲一区二区三区xxx视频| 亚洲国产精品大全| 久久亚洲国产精品成人av秋霞| 日韩在线观看免费全| 国产精品流白浆视频| 日韩在线国产精品| 美女久久久久久久| 日韩a**站在线观看| 在线视频中文亚洲| 国产中文字幕亚洲| 欧美日本啪啪无遮挡网站| 亚洲va欧美va国产综合久久| 美女啪啪无遮挡免费久久网站| 日韩av观看网址| 久久亚洲精品网站| 亚洲精品福利在线观看| 亚洲国产成人久久综合| 亚洲视频777| 久久精品视频在线播放| 亚洲欧美在线播放| 午夜精品一区二区三区av| 国产999精品久久久影片官网| 精品自拍视频在线观看| 国产精品国语对白| 亚洲精品电影在线观看| 国产成人在线亚洲欧美| 日韩在线欧美在线| 中文字幕9999| 欧美香蕉大胸在线视频观看| 日韩高清人体午夜| 亚洲视频国产视频| 亚洲免费中文字幕| 亚洲福利精品在线| 日韩av免费在线| 日韩成人激情影院| 欧美小视频在线观看| 亚洲自拍偷拍在线| 久久久久久久久久久国产| 色偷偷av一区二区三区乱| 亚洲激情免费观看| 91网站免费观看| 日韩成人在线播放| 亚洲999一在线观看www| 国产精品扒开腿做爽爽爽的视频| 国产丝袜一区视频在线观看| 亚洲а∨天堂久久精品9966| 992tv在线成人免费观看| 欧美日韩国产91| 国产一区二区三区在线观看视频| 中文字幕亚洲自拍| 久久香蕉国产线看观看av| 欧美激情手机在线视频| 日韩成人在线电影网| 国产一区二区三区三区在线观看| 久久久精品国产| 欧美日韩精品中文字幕| 中文字幕欧美视频在线| 国产精品91一区| 欧美日韩精品在线观看| 欧美超级乱淫片喷水| 亚洲天堂精品在线| 日韩av片永久免费网站| 亚洲视频一区二区三区| 国产精品白丝av嫩草影院| 欧美国产日韩一区二区三区| 蜜月aⅴ免费一区二区三区| 国产ts人妖一区二区三区| 久久影视三级福利片| 一本色道久久综合狠狠躁篇的优点| 国产精品一区电影| 国产日韩视频在线观看| 欧美精品在线播放| 清纯唯美亚洲激情| 午夜精品美女自拍福到在线| www高清在线视频日韩欧美| 成人午夜在线视频一区| 97国产真实伦对白精彩视频8| 国产精品永久免费观看| 国产精品中文字幕在线观看| 国产精品你懂得| 亚洲人成电影网| 欧美色欧美亚洲高清在线视频| 亚洲欧美日韩一区在线| 91日韩在线播放| 欧美网站在线观看| www.欧美精品| 91精品中国老女人| 欧美午夜女人视频在线| 中文字幕视频一区二区在线有码| 欧美激情精品久久久久久变态| 欧美成人精品在线播放| 欧美另类极品videosbestfree| 久久夜色精品亚洲噜噜国产mv| 欧美激情第6页| 91久久国产综合久久91精品网站| 国产精品视频在线播放| 亚洲人成人99网站| 91在线观看免费网站| 久久亚洲精品国产亚洲老地址| 日韩免费高清在线观看| 91探花福利精品国产自产在线| 91亚洲精品久久久久久久久久久久| 一区二区三区视频在线| 美女av一区二区| 日韩va亚洲va欧洲va国产| 国产成人久久精品| 91国产美女视频| 久久精品国产久精国产一老狼| 亚洲一区二区三区成人在线视频精品| 国产主播喷水一区二区| 精品国产一区二区三区久久| 欧美激情精品久久久久久大尺度| 国产大片精品免费永久看nba| 国产日本欧美视频| 国产精品视频网址| 久久精品一偷一偷国产| 欧美老妇交乱视频| 欧美精品久久久久| 久久精品人人做人人爽| 亚洲国产精久久久久久| 久久福利视频导航| 国内揄拍国内精品少妇国语| 国产精品三级网站| 狠狠爱在线视频一区| 精品丝袜一区二区三区| 国产精品久久久久不卡| 国语自产精品视频在线看抢先版图片| 亚洲精品白浆高清久久久久久| 亚洲欧美在线第一页| 91精品视频免费| 亚洲精品视频二区| 欧美在线视频a| 少妇激情综合网| 成人欧美一区二区三区黑人| 91中文字幕一区| 欧美日韩激情视频| 亚洲午夜av电影| 国产精品美女免费| 久久久精品在线| 国产一区二区久久精品| 一区二区三区视频观看| 色中色综合影院手机版在线观看| 欧美午夜视频在线观看|