版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lastsweetop/article/details/82883287
因为设计接口的时候不可能总是面面俱到,不用更改的。当接口需要增加一些方法的时候,那么实现接口的类就必须要重写来实现它,但是如果增加的功能仅仅通过接口原来的方法调用就可以实现的话,那么这种影响就更为多余,这正是默认方法需要解决的事情。
示例如下:
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 { }
实现子接口的类,可以直接调用默认方法。
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()); } } }
实现子接口的类,调用的默认方法为子接口的默认方法。
你可能已经注意到了,在第一个例子中有个静态的方法,它和类方法作用类似的,可以理解成一样的。