接口方法可以有主体吗?

新手上路,请多包涵

我知道接口就像一个 100% 的纯抽象类。所以,它不能有方法实现。但是,我看到了一个奇怪的代码。谁能解释一下?

代码片段:

  interface Whoa {
        public static void doStuff() {
            System.out.println("This is not default implementation");
        }
 }

编辑:

我的 IDE 是 Intellij Idea 13.1。项目SDK为java 7 <1.7.0_25>。 IDE 没有显示任何编译器错误。但是,当我在命令行编译代码时,我收到以下消息。

 Whoa.java:2: error: modifier static not allowed here
    public static void doStuff() {
                       ^

原文由 user3034861 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 541
2 个回答

Java 8 开始,除了默认方法之外,您还可以在接口中定义静态方法。

  • 静态方法是与定义它的类相关联的方法,而不是与任何对象相关联的方法。该类的每个实例都共享其静态方法。

  • 这使您更容易在库中组织辅助方法;您可以将特定于接口的静态方法保留在同一接口中,而不是在单独的类中。

  • 以下示例定义了一个静态方法,该方法检索与时区标识符对应的 ZoneId 对象;如果没有 ZoneId 对应于给定标识符的对象,它将使用系统默认时区。 (结果,您可以简化方法 getZonedDateTime

这是代码:

 public interface TimeClient {
   // ...
    static public 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 public ZonedDateTime getZonedDateTime(String zoneString) {
      return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
   }
}

也可以看看

原文由 Aniket Kulkarni 发布,翻译遵循 CC BY-SA 3.0 许可协议

这仅在 Java 8 中才有可能。在 Java 7 语言规范 §9.4 中,它明确指出:

如果在接口中声明的方法被声明为静态的,这是一个编译时错误,因为静态方法不能是抽象的。

所以在 Java 7 中,接口中的静态方法 不能 存在。

如果你去 Java 8 Language Specification §9.4.3 ,你可以看到它说:

静态方法也有一个块体,它提供了方法的实现。

所以它明确指出在 Java 8 中,它们 可以 存在。

我什至尝试在 Java 1.7.0_45 中运行您的确切代码,但它给了我错误“此处不允许使用静态修饰符”。


这里直接引用 Java 8 教程 默认方法(学习 Java 语言 > 接口和继承)

静态方法

除了默认方法之外,您还可以在接口中定义 静态方法。 (静态方法是与定义它的类关联的方法,而不是与任何对象关联的方法。该类的每个实例共享其静态方法。)这使您更容易在库中组织辅助方法;您可以将特定于接口的静态方法保留在同一接口中,而不是在单独的类中。以下示例定义了一个静态方法,该方法检索对应于时区标识符的 ZoneId 对象;如果没有 ZoneId 对应于给定标识符的对象,它将使用系统默认时区。 (因此,您可以简化方法 getZonedDateTime ):

 public interface TimeClient {
    // ...
    static public 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 public ZonedDateTime getZonedDateTime(String zoneString) {
        return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
    }
}

与类中的静态方法一样,您指定接口中的方法定义是静态方法,方法签名的开头带有 static 关键字。接口中的所有方法声明(包括静态方法)都是隐式的 public ,因此您可以省略 public 修饰符。

原文由 The Guy with The Hat 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题