当前位置: 首页 > 面试题库 >

接口方法可以有主体吗?

孙阳舒
2023-03-14
问题内容

我知道一个接口就像一个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() {
                       ^

问题答案:

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

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

  • 这使您可以更轻松地在库中组织帮助html" target="_blank">程序方法。您可以将特定于接口的静态方法保留在同一接口中,而不是在单独的类中。

  • 以下示例定义了一个静态方法,该方法检索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));
   }    
}

也可以看看

  • 用于接口方法的Oracle文档

  • 有关Java 8中所有有趣的内容,请阅读有关Java 8的一切。



 类似资料:
  • 问题内容: 我有以下实体: 我的属性ScriptItem是其他3个类的接口。是否可以将JPA配置为在运行时执行时设置正确的类ID? 其他资源: 我应该使用哪些注释来让JPA理解要保存3个类之一的ID? 提前致谢, 问题答案: 这确实是一个好主意,但不幸的是,JPA不支持将接口直接映射为实体属性。 您只能映射直接用注释的顶级类。这个顶级类可以实现一个接口。 这个功能已经被要求并讨论了很长时间。 根据

  • 我有一个接口: 我需要确保,这个接口的每个实现都覆盖来自MJSON的方法,并且我需要该方法是静态的。有什么办法可以做到吗?? 我尝试在接口中使该方法静态化,但它并不像我想要的那样工作。 是否有其他方法来确保每个实现都有来自MJSON的静态方法??

  • 问题内容: 在Java 8中,我有类似以下内容: 有没有一种方法可以从ImplementsB调用默认的功能接口行为,而不必创建匿名内部类并调用该内部类? 这会有副作用(两次调用ImplementsA的方法),需要调用父级的实现,然后让子级的实现能够调用子级的默认实现,并在需要时进行一些专门化。如您所见,调用父级的实现非常简单,但是我看不到一种避免重写默认实现的方法,除非我在实现子接口的类上添加了间

  • 在我的应用程序中,我试图优雅地处理当主控程序由于某些原因不可用时(例如DC之间的连接中断)的情况。在这种情况下,前端应该禁用写操作,而缓存数据库应该用于某些读操作。 我尝试使用命令。它在shell中工作,但在主程序不可用时,它不能在中工作,因为命令不在列表中。结果我有个例外: 当然,我可以处理这个异常,但它是在超时(在我的情况下是10秒)后生成的。但在我的情况下太长了。我更喜欢立即反应,如果有时会

  • 在java 8之前,接口可以有以下类型的变量/方法。 常量变量 抽象方法 所以我们不能在接口中编写方法的实现,或者更确切地说,在Java 8之前实现默认实现。请参阅下面示例。 执行上面示例代码,得到以下结果 - 在上面的例子中,每个日志方法都有自己的实现。 使用Java 8接口可以有以下类型的变量/方法。 常量变量 抽象方法 默认方法 静态方法 让我们使用Java 8在接口中使用默认实现和静态方法