技术贴如何在Java接口中定义方法

基本上所有的Java教程都会告诉我们Java接口的方法都是public、abstract类型的,没有方法体的。

但是在JDK8里面,你是可以突破这个界限的哦。

假设我们现在有一个接口:TimeClient,其代码结构如下:

importjava.time.*;publicinterfaceTimeClient{voidsetTime(inthour,intminute,intsecond);voidsetDate(intday,intmonth,intyear);voidsetDateAndTime(intday,intmonth,intyear,inthour,intminute,intsecond);LocalDateTimegetLocalDateTime();}

接下来,SimpleTimeClient类实现了TimeClient接口,具体代码如下:

packagedefaultmethods;importjava.time.*;importjava.lang.*;importjava.util.*;publicclassSimpleTimeClientimplementsTimeClient{privateLocalDateTimedateAndTime;publicSimpleTimeClient(){dateAndTime=LocalDateTime.now();}publicvoidsetTime(inthour,intminute,intsecond){LocalDatecurrentDate=LocalDate.from(dateAndTime);LocalTimetimeToSet=LocalTime.of(hour,minute,second);dateAndTime=LocalDateTime.of(currentDate,timeToSet);}publicvoidsetDate(intday,intmonth,intyear){LocalDatedateToSet=LocalDate.of(day,month,year);LocalTimecurrentTime=LocalTime.from(dateAndTime);dateAndTime=LocalDateTime.of(dateToSet,currentTime);}publicvoidsetDateAndTime(intday,intmonth,intyear,inthour,intminute,intsecond){LocalDatedateToSet=LocalDate.of(day,month,year);LocalTimetimeToSet=LocalTime.of(hour,minute,second);dateAndTime=LocalDateTime.of(dateToSet,timeToSet);}publicLocalDateTimegetLocalDateTime(){returndateAndTime;}publicStringtoString(){returndateAndTime.toString();}publicstaticvoidmain(String...args){TimeClientmyTimeClient=newSimpleTimeClient();System.out.println(myTimeClient.toString());}}

现在假设你想在接口TimeClient中添加一个新功能,通过这个功能我们可以指定我们所在的时区。

publicinterfaceTimeClient{voidsetTime(inthour,intminute,intsecond);voidsetDate(intday,intmonth,intyear);voidsetDateAndTime(intday,intmonth,intyear,inthour,intminute,intsecond);LocalDateTimegetLocalDateTime();ZonedDateTimegetZonedDateTime(StringzoneString);}

随着TimeClient的变化,你不得不修改你的SimpleTimeClient类,实现getZonedDateTime方法。一般来说,设置时区这个功能会是各个TimeClient实现类中通用的一个功能。这个时候,你通常会选择再定义一个AbstractTimeClient类来实现getZonedDateTime方法。而在JDK8中,你可以选择直接在接口中来实现该方法(interface已经把手伸到abstractclass的地盘了)。

packagedefaultmethods;importjava.time.*;publicinterfaceTimeClient{voidsetTime(inthour,intminute,intsecond);voidsetDate(intday,intmonth,intyear);voidsetDateAndTime(intday,intmonth,intyear,inthour,intminute,intsecond);LocalDateTimegetLocalDateTime();staticZoneIdgetZoneId(StringzoneString){try{returnZoneId.of(zoneString);}catch(DateTimeExceptione){System.err.println(Invalidtimezone:+zoneString+;usingdefaulttimezoneinstead.);returnZoneId.systemDefault();}}defaultZonedDateTimegetZonedDateTime(StringzoneString){returnZonedDateTime.of(getLocalDateTime(),getZoneId(zoneString));}}

从上面的例子,我们可以看到通过static和default修饰符我们可以直接在接口中实现方法体,同时不要忘记,任何在接口中方法声明都是public类型的哦。

OK,现在我们需要一个新的接口:AnotherTimeClient,它得继承TimeClient接口。那么,对于TimeClient接口中定义的getZonedDateTime方法,你可以做如下三种处理:

重新声明getZonedDateTime方法,使它变成abstract类型。

重新定义getZonedDateTime方法。

直接继承。

而static方法和我们在类里面定义的static方法概念一致。

尚学堂:每天推送IT新技术文章,跟着我们扩展技术视野吧。

点个赞再走呗!

即刻起







































白癜风用什么药
关于北京白癜风的治疗



转载请注明:http://www.jiaju1314.com/xxzl/5092.html