定义方法可以接口类型吗 java_教你在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方法概念一致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值