Java 接口方法可以有一个主体吗?

Java 接口方法可以有一个主体吗?,java,interface,java-8,default-implementation,Java,Interface,Java 8,Default Implementation,我知道接口就像一个100%纯抽象类。因此,它不能在其中包含方法实现。但是,我看到了一个奇怪的代码。有人能解释一下吗 代码片段: interface Whoa { public static void doStuff() { System.out.println("This is not default implementation"); } } 编辑: interface Whoa { public static v

我知道接口就像一个100%纯抽象类。因此,它不能在其中包含方法实现。但是,我看到了一个奇怪的代码。有人能解释一下吗

代码片段:

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

 interface Whoa {
        public static void doStuff() {
            System.out.println("This is not default implementation");
        }
 }
我的IDE是Intellij Idea 13.1。项目SDK是Java7。IDE未显示任何编译器错误。但是,当我在命令行编译代码时,我得到了以下消息


Java8中,除了默认方法外,还可以在接口中定义静态方法

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

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

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

以下是代码:

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));
   }    
}
另见
  • 有关Java8中所有有趣的内容,请阅读


这仅在Java 8中才可能实现。在报告中,它明确指出:

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

因此,在Java7中,接口中不可能存在静态方法

如果你去,你会看到上面写着:

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

因此,它明确指出,在Java8中,它们可以存在

我甚至尝试在Java1.7.045中运行您的精确代码,但它给了我一个错误“这里不允许修改器静态”


下面是直接从Java8教程中引用的一段话:

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

与类中的静态方法一样,可以指定方法定义 在接口中是一个静态方法,在 方法签名的开始。中的所有方法声明 接口(包括静态方法)是隐式的
公共的
,因此 可以省略
public
修饰符


对于java版本7或更低版本,可以使用接口体中声明的嵌套类实现类似的功能。这个嵌套类实现了外部接口

例子: 我们如何在代码中使用它?
因此,默认实现封装在接口中。

它给出了错误。JDK1.6在Java8中不可能的事情允许接口的默认方法体。Java8,是的。在此之前,没有。只有在Java8中引入了默认方法。在此之前没有。也是方法的默认实现。我没有使用Java8。它是JavaC1.7.0_25。您的IDE是否使用代码遵从性8?不应使用7或更低版本编译。这里有一个例子。@Phoenix我也在使用1.7.0_25版本,但在这个版本中是不允许的。这似乎真的模糊了接口和抽象类之间的界限。
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));
    }    
}
interface I1{
    public void doSmth();

    class DefaultRealizationClass implements  I1{

        @Override
        public void doSmth() {
           System.out.println("default realization");
        }
    }
}
class MyClass implements I1{

    @Override
    public void doSmth() {
         new I1.DefaultRealizationClass().doSmth();
    }   
}