为什么界面中的静态方法不需要默认的访问修饰符?

时间:2016-04-22 07:08:07

标签: java interface static default

public interface Drive {
   int getNumWheels();

   default int driveMiles(){
      return 10;
   }

   static int getColorID(){
     return 0;
   }
}

在上面的代码中,为什么界面中的静态方法不需要默认的访问修饰符?我知道在JDK 8中添加了默认方法,并提供了一个可选的实现,但是,我对静态方法有点不清楚?这看起来非常类似于一个类的静态方法?

2 个答案:

答案 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)

defaultstatic方法的目的不同。

扩展包含默认方法的界面时,您可以执行以下操作:

  1. 根本不提及默认方法,它允许扩展接口继承默认方法。
  2. 重新声明默认方法,使其成为抽象方法。

  3. 重新定义默认方法,该方法会覆盖它。

  4. 静态方法

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

    如果要在另一个类中重新定义静态方法,则将该定义隐藏在第一个接口中。

    请参阅有关default and static methods的oracle文档页面。