java接口中的静态方法

据我所知,你不能在接口体中声明静态方法。 但是,我不小心在http://docs.oracle.com/ site上找到了一些特殊的代码。 这是链接

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中两个新function的见证者:

  • 接口中的静态方法,
  • 虚拟扩展方法。

在您提供的代码示例中, getZoneId()说明了第一个新颖性,而.getZoneDateTime()表示第二个。

第二个特别是允许使用补充方法(例如.stream()扩展Collection接口, 而不会破坏向后兼容性。 请看这里的插图。

第一个允许避免编写“方法包”类,这些类通常仅用于在接口上提供实用程序静态方法。 一个这样的例子就是Guava的Functions类 (不要与Java 8的Function混合,它基本上从Guava中偷走了,还有Predicate和其他几个)

从Java 8开始,您可以执行此操作。 您的代码段来自的官方教程 (已针对Java 8进行了更新)说得最好:

接口主体可以包含抽象方法,默认方法和静态方法。 接口中的抽象方法后跟分号,但没有大括号(抽象方法不包含实现)。 默认方法使用default修饰符定义,静态方法使用static关键字定义。 界面中的所有抽象,默认和静态方法都是隐式公共的,因此您可以省略public修饰符。

或者从Java 8的JLS第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中,接口可以具有静态方法,以及具有默认实现的覆盖方法。 但它们仍然不能有实例字段。 这些function是lambda表达式支持的一部分,您可以在H部分中阅读有关它们的更多信息。 JSR 335