java接口中的静态方法

时间:2014-04-18 06:14:09

标签: java interface static-methods

据我所知,你不能在接口体中声明静态方法。但是,我不小心在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

我迷路了......任何人都可以解释

5 个答案:

答案 0 :(得分:14)

您可以在这里看到Java 8中的两个新功能:

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

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

第二个特别是允许使用诸如Collection之类的补充方法扩展.stream()接口,例如,没有打破向后兼容性。有关说明,请参阅here

第一个允许避免写"方法袋"通常只存在于接口上提供实用程序静态方法的类。一个这样的例子是Guava's Functions class(不要与Java 8' s Function混合,它基本上是从Guava那里偷来的,还有Predicate和其他一些人

答案 1 :(得分:6)

Java 8现在的想法是"默认"接口中的方法实现:

http://blog.hartveld.com/2013/03/jdk-8-13-interface-default-method.html

答案 2 :(得分:5)

从Java 8开始,您可以这样做。您的代码段来自的official tutorial(已针对Java 8进行了更新)说得最好:

  

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

或者来自Java 8' JLS section 9.4

  

默认方法是在具有default修饰符的接口中声明的方法;它的身体总是由一个块代表。它为实现接口的任何类提供了一个默认实现,而不会覆盖该方法。默认方法与具体方法不同,具体方法在类中声明。

     

...

     

接口可以声明静态方法,这些方法在不引用特定对象的情况下被调用。

答案 3 :(得分:5)

来自Java语言规范(Java SE 8 Edition):http://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.4

  

接口可以声明静态方法,这些方法在不引用特定对象的情况下被调用。

答案 4 :(得分:4)

在Java 8中,接口可以具有静态方法,以及具有默认实现的覆盖方法。但他们仍然无法拥有实例字段。这些功能是lambda表达式支持的一部分,您可以在。 JSR 335

的H部分中阅读更多相关内容。