教你在Java介面中定義方法
基本上所有的Java教程都會告訴我們Java介面的方法都是public、abstract型別的,沒有方法體的。
但是在JDK8裡面,你是可以突破這個界限的哦。
假設我們現在有一個介面:TimeClient,其程式碼結構如下:
import java.time.*; public interface TimeClient { void setTime(int hour, int minute, int second); void setDate(int day, int month, int year); void setDateAndTime(int day, int month, int year, int hour, int minute, int second); LocalDateTime getLocalDateTime(); }
接下來,SimpleTimeClient類實現了TimeClient介面,具體程式碼如下:
package defaultmethods; import java.time.*; import java.lang.*; import java.util.*; public class SimpleTimeClient implements TimeClient { private LocalDateTime dateAndTime; public SimpleTimeClient() { dateAndTime = LocalDateTime.now(); } public void setTime(int hour, int minute, int second) { LocalDate currentDate = LocalDate.from(dateAndTime); LocalTime timeToSet = LocalTime.of(hour, minute, second); dateAndTime = LocalDateTime.of(currentDate, timeToSet); } public void setDate(int day, int month, int year) { LocalDate dateToSet = LocalDate.of(day, month, year); LocalTime currentTime = LocalTime.from(dateAndTime); dateAndTime = LocalDateTime.of(dateToSet, currentTime); } public void setDateAndTime(int day, int month, int year, int hour, int minute, int second) { LocalDate dateToSet = LocalDate.of(day, month, year); LocalTime timeToSet = LocalTime.of(hour, minute, second); dateAndTime = LocalDateTime.of(dateToSet, timeToSet); } public LocalDateTime getLocalDateTime() { return dateAndTime; } public String toString() { return dateAndTime.toString(); } public static void main(String... args) { TimeClient myTimeClient = new SimpleTimeClient(); System.out.println(myTimeClient.toString()); } }
現在假設你想在介面TimeClient中新增一個新功能,通過這個功能我們可以指定我們所在的時區。
public interface TimeClient { void setTime(int hour, int minute, int second); void setDate(int day, int month, int year); void setDateAndTime(int day, int month, int year, int hour, int minute, int second); LocalDateTime getLocalDateTime(); ZonedDateTime getZonedDateTime(String zoneString); }
隨著TimeClient的變化,你不得不修改你的SimpleTimeClient類,實現getZonedDateTime方法。一般來說,設定時區這個功能會是各個TimeClient實現類中通用的一個功能。這個時候,你通常會選擇再定義一個AbstractTimeClient類來實現getZonedDateTime方法。而在JDK8中,你可以選擇直接在介面中來實現該方法(interface已經把手伸到abstract class的地盤了)。
package defaultmethods; import java.time.*; public interface TimeClient { void setTime(int hour, int minute, int second); void setDate(int day, int month, int year); void setDateAndTime(int day, int month, int year, int hour, int minute, int second); LocalDateTime getLocalDateTime(); static ZoneId getZoneId (String zoneString) { try { return ZoneId.of(zoneString); } catch (DateTimeException e) { System.err.println("Invalid time zone: " + zoneString + "; using default time zone instead."); return ZoneId.systemDefault(); } } default ZonedDateTime getZonedDateTime(String zoneString) { return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString)); } }
從上面的例子,我們可以看到通過static和default修飾符我們可以直接在介面中實現方法體,同時不要忘記,任何在介面中方法宣告都是public型別的哦。
OK,現在我們需要一個新的介面:AnotherTimeClient,它得繼承TimeClient介面。那麼,對於TimeClient介面中定義的getZonedDateTime方法,你可以做如下三種處理:
- 重新宣告getZonedDateTime方法,使它變成abstract型別。
- 重新定義getZonedDateTime方法。
- 直接繼承。
而static方法和我們在類裡面定義的static方法概念一致。
相關文章
- 在Java中是如何定義和宣告介面的?Java
- 在python中定義[]呼叫的方法Python
- Retrofit2.5是如何解析在介面類中定義的請求方法?
- 在Java中呼叫Groovy方法的又一種方法:使用介面Java
- 如何查詢方法在jQuery庫中定義的位置jQuery
- Java方法02:方法的定義和呼叫Java
- 在.NET 6.0中自定義介面路由路由
- 教你在Python中實現潛在語義分析Python
- 類定義介面
- java 陣列的定義(宣告)方法Java陣列
- 我要告訴你:java介面中可以定義private私有方法Java
- 介面定義和抽象方法_hehe.base.10.1抽象
- 介面模組的定義
- 在C++ Builder中定義事件 (轉)C++UI事件
- 定義SAP登入介面
- 在靜態類中定義一個泛型方法查詢陣列元素泛型陣列
- 什麼是介面?如何定義介面?如何實現介面?
- 介面的定義和實現
- JSON定義AS專案介面JSON
- 介面和列舉在方法中的區別
- java中介面的意義Java
- Android路由框架AnnoRouter:使用Java介面來定義路由跳轉Android路由框架Java
- JAVA中的Comparable介面和自定義比較器Java
- 在 MotionScene 檔案中定義場景約束
- 在JSP中的JavaBean設定靜態屬性和方法有沒有意義?JSJavaBean
- 教你把Java Bean擼成串的最快方法-自定義setter生成指令碼JavaBean指令碼
- 談架構中介面的定義架構
- Java開發筆記(六十二)如何定義函式式介面Java筆記函式
- 在定義C++, C通用介面函式時讓C++介面支援預設引數C++函式
- 全面剖析C#介面程式設計之定義介面C#程式設計
- JTAG各類介面針腳定義及含義
- 瞬間教你學會使用java中list的retainAll方法JavaAI
- Java中常見方法詳解合集(方法的定義及語法結構)Java
- Java 介面與抽象方法Java抽象
- 方法的定義面試題面試題
- Java可自定義中斷定時器的實現Java定時器
- Java中ListIterator介面Java
- Java中的介面Java