簡單了解Java的默認和靜態(tài)方法
這篇文章主要介紹了簡單了解Java的默認和靜態(tài)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
淺談Java的默認和靜態(tài)方法
允許在接口中聲明默認方法和靜態(tài)方法,是JDK1.8新增的特性。存在即合理,兩者的出現,讓接口越來越像抽象類,那么它們?yōu)槭裁闯霈F呢,它們的出現產生了哪些便利,Java小白開始學習并總結,不足之處,還望評論區(qū)指點一二!
Java新增默認方法有啥用
官方解答:默認方法允許您添加新的功能到現有庫的接口中,并能確保與采用舊版本接口編寫的代碼的二進制兼容性。
這個光看枯燥的介紹好像很難理解,舉個簡單的例子。假設有一個很大很大的項目,一個接口被很多很多的類所實現,大家都平安無事平穩(wěn)地運行著。突然有一天,出現了一個小小地問題,或者說有一個更好的優(yōu)化方案,需要在這些實現類去增加。在默認方法出現之前,只有抽象方法,且需要在實現類中給出具體定義才能操作,那豈不是只能兩眼一閉,直接從早干到晚地添加啦。
但是,默認方法地出現允許在接口中給出方法的具體實現,且實現類中能夠自動實現默認方法,我只需要將這個優(yōu)化放在接口的默認方法里面,就能完成對所有實現類的優(yōu)化啦。當然,純屬個人理解,如果我的例子有不恰當的地方,歡迎指正哦。
package com.my.pac21; /** * @auther Summerday */ interface Closable { void close(); //假設是新增的默認方法 default void makeSound() { System.out.println("peng!"); } } interface Openable { default void makeSound() { System.out.println("peng!"); } } class Window implements Closable { @Override public void close() { System.out.println("Window.close"); } } public class Door implements Closable, Openable { @Override public void close() { System.out.println("Door.close"); } //兩個接口中包含同名的方法,需要重寫,指定一個 @Override public void makeSound() { System.out.println("need to override default methods"); } public static void main(String[] args) { Closable cw = new Window(); Closable cd = new Door(); cw.close();//Window.close cd.close();//Door.close //實現默認方法 cw.makeSound();//peng! cd.makeSound();//need to override default methods } }
Java新增的靜態(tài)方法有啥用
默認方法和靜態(tài)方法的在接口的出現讓接口失去“全是抽象方法”的特性,在探究完新增的默認方法之后,我們該對靜態(tài)方法下手啦。開始瘋狂查找資料。。。
Before Java 8 made it possible to declare static methods in interfaces, it was common practice to place these methods in companion utility classes. For example, the java.util.Collections class is a companion to the java.util.Collection interface, and declares static methods that would be more appropriate in the relevant Java Collections Framework interfaces. You no longer need to provide your own companion utility classes. Instead, you can place static methods in the appropriate interfaces, which is a good habit to cultivate.
這個是我在stack overflow上找到的答案,什么意思呢,在沒有新增靜態(tài)方法之前,我們如果想讓一些固定的操作在接口中出現,就必須定義一個和接口配套的實現類。而接口中靜態(tài)方法的出現,可以直接通過接口調用靜態(tài)方法。
package com.my.pac21; /** * @auther Summerday */ public class Test { public static void main(String[] args) { int val1 = 5; int val2 = 6; //通過創(chuàng)建實現類的對象 Countable b = new CountableCompanion(); System.out.println(b.getNum(val1, val2)); //直接通過接口調用 Countable.getMul(val1,val2); } } interface Countable{ //普通抽象方法 int getNum(int a,int b); //靜態(tài)方法 static int getMul(int a,int b){ return a*b; } } //實現接口的實現類 class CountableCompanion implements Countable{ @Override public int getNum(int a,int b) { return a+b; } }
這是一個我自認為還比較幼稚的例子,僅供理解。
普通抽象方法的情況:我在接口中定義了一個抽象方法,而后我又定義了實現該方法的實現類,最后通過創(chuàng)建實現類的實例來調用該方法,最后算得兩值之和??梢韵胂螅趯嶋H中,如果相同性質的方法想要在多個實現類中實現,這種做法是比較麻煩的。
靜態(tài)方法的情況:就很直接地在接口中定義靜態(tài)方法,且可以被接口直接調用,不需要再定義與其配套的實現類,多舒服哦。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持我們。
上一篇:Spring AOP定義Before增加實戰(zhàn)案例詳解
欄 目:Java
下一篇:springboot+idea熱啟動設置方法(自動加載)
本文地址:http://mengdiqiu.com.cn/a1/Java/8752.html
您可能感興趣的文章
- 01-10Java實現動態(tài)模擬時鐘
- 01-10利用Java實現復制Excel工作表功能
- 01-10JavaWeb實現郵件發(fā)送功能
- 01-10java基于poi導出excel透視表代碼實例
- 01-10Java實現動態(tài)數字時鐘
- 01-10基于Java驗證jwt token代碼實例
- 01-10java實現液晶數字字體顯示當前時間
- 01-10淺談Java中真的只有值傳遞么
- 01-10Java動態(tài)顯示當前日期和時間
- 01-10如何解決線程太多導致java socket連接池出現的問題


閱讀排行
本欄相關
- 01-10Java實現動態(tài)模擬時鐘
- 01-10Springboot中@Value的使用詳解
- 01-10JavaWeb實現郵件發(fā)送功能
- 01-10利用Java實現復制Excel工作表功能
- 01-10Java實現動態(tài)數字時鐘
- 01-10java基于poi導出excel透視表代碼實例
- 01-10java實現液晶數字字體顯示當前時間
- 01-10基于Java驗證jwt token代碼實例
- 01-10Java動態(tài)顯示當前日期和時間
- 01-10淺談Java中真的只有值傳遞么
隨機閱讀
- 01-11ajax實現頁面的局部加載
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10C#中split用法實例總結
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢)副欄目數量限制代碼修改