菜雞的Java筆記 第三十五 介面定義增強
阿新 • • 發佈:2018-12-28
介面定義增強
在java從一開始到現在介面之中的核心組成部分:抽象方法與全域性常量,但是隨著技術的不斷髮展,使用者在使用過程之中發現了有一些問題
如果說現在有一個介面經過了長年的使用,這個介面已經有了10W 個子類了,突然有一天你的老闆說,接口裡增加一個抽象方法
並且要求這些介面子類的方法都一樣,如果不同,一個個實現,如果相同呢?實現到死
那麼為了解決這樣的問題,從JDK1.8開始為接口裡面追加了兩種方法的定義: default 定義普通方法, static 定義靜態方法
但是需要知道一點,即使介面之中提供有普通方法,這個介面也不能夠直接例項化,還是依靠子類完成
範例:在介面中定義普通方法
package cn.mysterious; interface IMessage{ public String getMsg(); public default void print(){// 必須使用 default System.out.println(this,getMsg()); } } class MessageImpl implements IMessage{ @Override public String getMsg() { // TODO Auto-generated method stub return"hello world"; } } public class StudyLang { public static void main(String[] args) { // TODO Auto-generated method stub IMessage msg = new MessageImpl(); msg.print(); } }
如果你在整個設計執行之前中間追加了抽象類的話,這樣的尷尬局面就不會有了
除了 default 之外,也可以使用 static 定義靜態方法,而靜態方法的特點就是可以直接由類名稱負責呼叫
範例:使用 static 定義靜態方法
package cn.mysterious; interface IMessage{ public String getMsg(); public default void print(){ // 必須使用 default System.out.println(this,getMsg()); } public static IMessage getInstance() { return new IMessage() { // 匿名內部類 public String getMsg() { return null; } }; } } class MessageImpl implements IMessage{ @Override public String getMsg() { // TODO Auto-generated method stub return "hello world"; } } public class StudyLang { public static void main(String[] args) { // TODO Auto-generated method stub IMessage msg = IMessage.getInstance(); msg.print(); } }
使用 static 定義的方法可以由介面名稱直接呼叫