java遗珠之接口默认方法
Posted 吴冬冬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java遗珠之接口默认方法相关的知识,希望对你有一定的参考价值。
默认方法
因为设计接口的时候不可能总是面面俱到,不用更改的。当接口需要增加一些方法的时候,那么实现接口的类就必须要重写来实现它,但是如果增加的功能仅仅通过接口原来的方法调用就可以实现的话,那么这种影响就更为多余,这正是默认方法需要解决的事情。
示例如下:
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));
实现该接口
public class SimpleTimeClient implements TimeClient
private LocalDateTime dateAndTime;
public SimpleTimeClient()
dateAndTime = LocalDateTime.now();
@Override
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);
@Override
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);
@Override
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);
@Override
public LocalDateTime getLocalDateTime()
return dateAndTime;
@Override
public String toString()
return dateAndTime.toString();
public static void main(String... args)
TimeClient myTimeClient = new SimpleTimeClient();
System.out.println("Current time: " + myTimeClient.toString());
System.out.println("Time in New_York: " +
myTimeClient.getZonedDateTime("America/New_York").toString());
继承包含默认方法的接口
对父类默认方法的处理有三种
- 什么都不做,子接口继承默认方法
public interface AnotherTimeClient extends TimeClient
实现子接口的类,可以直接调用默认方法。
- 重新定义默认方法,把他变成abstract方法
public interface AbstractZoneTimeClient extends TimeClient
ZonedDateTime getZonedDateTime(String zoneString);
实现子接口的类,需要实现重新定义的abstract方法。
- 重写默认方法
public interface HandleInvalidTimeZoneClient extends TimeClient
@Override
default ZonedDateTime getZonedDateTime(String zoneString)
try
return ZonedDateTime.of(getLocalDateTime(), ZoneId.of(zoneString));
catch (DateTimeException e)
System.err.println("Invalid zone ID: " + zoneString +
"; using the default time zone instead.");
return ZonedDateTime.of(getLocalDateTime(), ZoneId.systemDefault());
实现子接口的类,调用的默认方法为子接口的默认方法。
静态方法
你可能已经注意到了,在第一个例子中有个静态的方法,它和类方法作用类似的,可以理解成一样的。
以上是关于java遗珠之接口默认方法的主要内容,如果未能解决你的问题,请参考以下文章