目录
1、接口的定义
在 Java 中,接口是一种引用类型,类似于 class,在接口中只能包含常量、方法签名(没有方法体)、默认方法(有方法体)、静态方法(有方法体)和嵌套类。方法体只存在于默认方法和静态方法中。且接口不能被实例化,它们只能由类去实现或者由其他接口去继承。按照惯例,implements 语句跟在 extends 语句后面。// 先写 extends,后写 implements
接口中的所有抽象方法、默认方法和静态方法都是隐式的 public 方法,因此可以省略 public 修饰符。此外,接口也可以包含常量声明。在接口中定义的所有常量值都是隐式的 public、static 和 final。同样,你可以省略这些修饰符。
下边是一个接口的定义示例:
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));
}
}
(1)接口中的默认方法
当你扩展一个包含默认方法的接口时,你可以执行以下操作:
- 完全不提及默认方法,这将使你的扩展接口继承默认方法。
- 重新声明默认方法,使其变为抽象方法。
- 重新定义默认方法,并使用新的默认方法覆盖它。
1)采用完全不提及默认方法的方式,扩展接口 TimeClient,如下所示:
public interface AnotherTimeClient extends TimeClient { }
那么实现 AnotherTimeClient 接口的任何类都将具有由默认方法 TimeClient.getZonedDateTime() 指定的实现逻辑。
2)采用重新声明默认方法的方式,扩展接口 TimeClient,如下所示:
public interface AbstractZoneTimeClient extends TimeClient {
public ZonedDateTime getZonedDateTime(String zoneString);
}
那么任何实现 AbstractZoneTimeClient 接口的类都必须实现 getZonedDateTime() 方法;该方法是一个抽象方法,就像接口中所有其他非默认(和非静态)方法一样。
3)采用重新定义默认方法的方式,拓展接口 TimeClient,如下所示:
public interface HandleInvalidTimeZoneClient extends TimeClient {
default public ZonedDateTime getZonedDateTime(String zoneString) {
try {
return ZonedDateTime.of(getLocalDateTime(),ZoneId.of(zoneString));
} catch (DateTimeException e) {
System.err.println(