Java 接口方法可以有一个主体吗?
我知道接口就像一个100%纯抽象类。因此,它不能在其中包含方法实现。但是,我看到了一个奇怪的代码。有人能解释一下吗 代码片段: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
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中所有有趣的内容,请阅读
下面是直接从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();
}
}