JDK8 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类型的哦
现在我们需要一个新的接口、AnotherTimeClient、它得继承TimeClient接口、那么、对于TimeClient接口中定义的getZonedDateTime方法、你可以做如下三种处理
1、重新声明getZonedDateTime方法、使它变成abstract类型
2、重新定义getZonedDateTime方法
3、直接继承TimeClient接口
这里使用的static方法和我们在类里面定义的static方法概念一致、都是可以直接通过类名直接调用的、在周一个应用程序里面只会有一份代码、且暂具一份内存
上一篇: 9800的模拟器添加中文系统