据我所知,你不能在接口体中声明静态方法。但是,我偶然在http://docs.oracle.com/网站上发现了一些特殊的代码。这是link
Namelly
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));
}
}
这个interface
有一个static
方法getZoneId
我迷路了...有人可以解释一下
Java 8现在有了接口中“默认”方法实现的想法:
http://blog.hartveld.com/2013/03/jdk-8-13-interface-default-method.html
您是Java 8中两个新功能的见证者:
在你提供的代码示例中,getZoneId()
说明了第一个新颖性,.getZoneDateTime()
是第二个。
第二个特别是允许Collection
接口扩展的补充方法,例如.stream()
,而不会破坏向后兼容性。有关插图,请参阅here。
第一个允许避免编写“方法包”类,这些类通常仅用于在接口上提供实用程序静态方法。一个这样的例子是Guava's Functions
class(不要与Java 8的Function
混合,它基本上从Guava偷走了,还有Predicate
和其他几个)
从Java 8开始,您可以执行此操作。您的代码段来自的official tutorial(已针对Java 8进行了更新)说得最好:
接口主体可以包含抽象方法,默认方法和静态方法。接口中的抽象方法后跟分号,但没有大括号(抽象方法不包含实现)。默认方法使用
default
修饰符定义,静态方法使用static
关键字定义。界面中的所有抽象,默认和静态方法都是隐式公共的,因此您可以省略public修饰符。
或者来自Java 8的JLS section 9.4:
默认方法是在与
default
修饰符的接口中声明的方法;它的身体总是由一个块代表。它为实现接口的任何类提供了一个默认实现,而不会覆盖该方法。默认方法与具体方法不同,具体方法在类中声明。...
接口可以声明静态方法,这些方法在不引用特定对象的情况下被调用。
来自Java语言规范(Java SE 8 Edition):http://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.4
接口可以声明静态方法,这些方法在不引用特定对象的情况下被调用。
在Java 8中,接口可以具有静态方法,以及具有默认实现的覆盖方法。但它们仍然不能有实例字段。这些功能是lambda表达式支持的一部分,您可以在. JSR 335的H部分中阅读更多相关内容。