这只有在Java 8中才有可能。在 Java 7 语言规范 §9.4 中,它明确指出:
如果接口中声明的方法被声明为静态,则这是编译时错误,因为静态方法不能是抽象的。
因此,在Java 7中,接口中的静态方法不存在。
如果你去 Java 8 语言规范 §9.4.3,你可以看到它说:
静态方法还具有一个块体,它提供该方法的实现。
因此,它明确指出,在Java 8中,它们可以存在。
我甚至尝试在Java 1.7.0_45中运行您的确切代码,但它给了我错误“这里不允许使用修饰符静态”。
以下是 Java 8 教程默认方法(学习 Java 语言>接口和继承)中的一段话:
静态方法
除了默认方法之外,还可以在接口中定义静态方法。(静态方法是与定义它的类(而不是与任何对象)关联的方法。类的每个实例共享其静态方法。这使您可以更轻松地在库中组织帮助程序方法;您可以将特定于接口的静态方法保留在同一接口中,而不是在单独的类中。下面的示例定义一个静态方法,该方法检索与时区标识符对应的 ZoneId
对象;如果没有与给定标识符对应的对象,则它使用系统默认时区。(因此,您可以简化方法):ZoneId
getZonedDateTime
public interface TimeClient {
// ...
static public 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 public ZonedDateTime getZonedDateTime(String zoneString) {
return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
}
}
与类中的静态方法一样,您可以指定接口中的方法定义是静态方法,其关键字位于方法签名的开头。接口中的所有方法声明(包括静态方法)都是隐式的,因此您可以省略修饰符。static
public
public