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你是对的,我不确定我在这里做什么。我想看看这个问题最初是否引用了默认方法,但没有。我会删除这个。呃,无法删除它,因为它已被接受:(