public interface Drive {
int getNumWheels();
default int driveMiles(){
return 10;
}
static int getColorID(){
return 0;
}
}
在上面的代码中,为什么界面中的静态方法不需要默认的访问修饰符?我知道在JDK 8中添加了默认方法,并提供了一个可选的实现,但是,我对静态方法有点不清楚?这看起来非常类似于一个类的静态方法?
答案 0 :(得分:2)
在上面的代码中,为什么界面中的静态方法不需要默认的访问修饰符?
我猜你在问,为什么是static
而不是static default
?
在课程中,您可以使用static
,而且很可能他们认为保持一致会更简单。
这看起来非常类似于一个类的静态方法?
这就是为什么我认为语法是相同的。
更好的问题是
为什么我们根本使用
default
作为修饰语?
我能想到的原因有两个
default
已经是一个关键字,因此很容易在语言中重复使用,并且在注释中以类似的方式使用。为什么他们决定在JDK 8的接口中包含static?
好处与class
相同。您可以定义与接口关联但不与特定类绑定的方法。一个很好的例子是工厂类。在过去你必须要说
Logger LOGGER = LoggerFactory.getLogger(...);
如果您希望Logger
成为interface
,那么它的工厂方法必须static
必须使用实用程序类。现在你的API可能是
Logger LOGGER = Logger.get(...);
工厂方法的interface
与它返回的接口相同,因此没有理由确切地确定get
返回的类型。
答案 1 :(得分:0)
default
和static
方法的目的不同。
扩展包含默认方法的界面时,您可以执行以下操作:
重新声明默认方法,使其成为抽象方法。
重新定义默认方法,该方法会覆盖它。
静态方法
static
方法是一种与定义它的类相关联的方法,而不是与任何对象相关联的方法。该类的每个实例都共享其静态方法。
如果要在另一个类中重新定义静态方法,则将该定义隐藏在第一个接口中。
请参阅有关default and static methods的oracle文档页面。