java接口中的静态方法
据我所知,您不能在接口体中声明静态方法。然而,我无意中在网站上发现了一段奇特的代码。这是你的电话号码 名义上java接口中的静态方法,java,interface,static-methods,Java,Interface,Static Methods,据我所知,您不能在接口体中声明静态方法。然而,我无意中在网站上发现了一段奇特的代码。这是你的电话号码 名义上 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,
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));
}
}
这个接口
有一个静态
方法getZoneId
我迷路了。。。有人能解释一下吗Java 8现在有了在接口中实现“默认”方法的想法:
从Java 8开始,您可以这样做。您的代码片段的来源(已针对Java 8进行了更新)最好地说明了这一点: 接口主体可以包含抽象方法、默认方法和静态方法。接口中的抽象方法后跟分号,但不带大括号(抽象方法不包含实现)。默认方法用
Default
修饰符定义,静态方法用static
关键字定义。接口中的所有抽象、默认和静态方法都是隐式公共的,因此可以省略公共修饰符
或来自Java 8:
默认方法是在带有default
修饰符的接口中声明的方法;其主体始终由块表示。它为实现接口而不重写方法的任何类提供默认实现。默认方法不同于在类中声明的具体方法
接口可以声明静态方法,这些方法在调用时不引用特定对象
在Java8中,接口可以有静态方法,也可以有带有默认实现的可重写方法。但它们仍然不能有实例字段。这些功能是lambda表达式支持的一部分,您可以在Java语言规范(Java SE 8版)的H部分中阅读更多关于它们的内容: 接口可以声明静态方法,这些方法在调用时不引用特定对象
您见证了Java 8中的两个新特性:
- 接口中的静态方法
- 虚拟扩展方法
getZoneId()
说明了第一个新奇之处,.getZoneDateTime()
说明了第二个新奇之处
第二个特别是允许使用补充方法扩展集合
接口,例如.stream()
,而不破坏向后兼容性。请参阅以获取图示
第一种方法允许避免编写“方法包”类,这些类通常只存在于通过接口提供实用程序静态方法的情况下。一个这样的例子是(不要与Java8的
函数混为一谈,它基本上是从Guava偷来的函数,以及谓词
和其他一些函数)您可以在从Java8开始的接口中声明静态方法。另请注意getZoneDateTime()
方法(虚拟扩展方法,在Java 8中也是新的)。请阅读本文,您没有看到Java 8的新功能列表吗?检查一下。每个人都正确回答了我的问题。但是你是第一个。不是真的,默认方法和静态方法之间有区别,所以我们不要混淆它们(和其他用户)。这也许是一个很好的指针,但不是一个正确的答案。@virgo47你是对的,我不确定我在这里做什么。我想看看这个问题最初是否引用了默认方法,但没有。我会删除这个。呃,无法删除它,因为它已被接受:(