Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么';接口中的静态方法不需要默认的访问修饰符吗?_Java_Interface_Static_Default - Fatal编程技术网

Java 为什么';接口中的静态方法不需要默认的访问修饰符吗?

Java 为什么';接口中的静态方法不需要默认的访问修饰符吗?,java,interface,static,default,Java,Interface,Static,Default,在上面的代码中,为什么接口中的静态方法不需要默认的访问修饰符?我知道默认方法是在JDK 8中添加的,并且提供了一个可选的实现,但是,我对静态方法有点不清楚?这看起来真的很像一个类的静态方法 在上面的代码中,为什么接口中的静态方法不需要默认的访问修饰符 我想你是在问,为什么它是静态的,而不是静态默认的 在类中,您可以只使用static,他们很可能认为保持一致性会更简单 这看起来真的很像一个类的静态方法 这就是为什么我认为语法是一样的 更好的问题是 为什么我们要使用default作为修饰符 我可以

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

在上面的代码中,为什么接口中的静态方法不需要默认的访问修饰符

我想你是在问,为什么它是
静态的
,而不是
静态默认的

在类中,您可以只使用
static
,他们很可能认为保持一致性会更简单

这看起来真的很像一个类的静态方法

这就是为什么我认为语法是一样的


更好的问题是

为什么我们要使用
default
作为修饰符

我可以想到两个原因

  • default
    已经是一个很容易在语言中重用的关键字,在注释中也以类似的方式使用它
  • 它清楚地表明,此方法旨在实现。他们本可以完全不需要关键字,但一点冗余可以提高代码质量

为什么他们决定在JDK 8的接口中包含static

好处与
相同。您可以定义与接口关联但不绑定到特定类的方法。工厂类就是一个很好的例子。在过去,你不得不说

public interface Drive {
   int getNumWheels();

   default int driveMiles(){
      return 10;
   }

   static int getColorID(){
     return 0;
   }
}
如果希望
记录器
成为
接口
,那么它是工厂方法,必须是
静态
必须使用实用程序类。现在,您的API可以

Logger LOGGER = LoggerFactory.getLogger(...);
factory方法的
接口
与它返回的接口相同,因此没有太多理由精确地确定
get
返回的类型

在上面的代码中,为什么接口中的静态方法不需要默认的访问修饰符

我想你是在问,为什么它是
静态的
,而不是
静态默认的

在类中,您可以只使用
static
,他们很可能认为保持一致性会更简单

这看起来真的很像一个类的静态方法

这就是为什么我认为语法是一样的


更好的问题是

为什么我们要使用
default
作为修饰符

我可以想到两个原因

  • default
    已经是一个很容易在语言中重用的关键字,在注释中也以类似的方式使用它
  • 它清楚地表明,此方法旨在实现。他们本可以完全不需要关键字,但一点冗余可以提高代码质量

为什么他们决定在JDK 8的接口中包含static

好处与
相同。您可以定义与接口关联但不绑定到特定类的方法。工厂类就是一个很好的例子。在过去,你不得不说

public interface Drive {
   int getNumWheels();

   default int driveMiles(){
      return 10;
   }

   static int getColorID(){
     return 0;
   }
}
如果希望
记录器
成为
接口
,那么它是工厂方法,必须是
静态
必须使用实用程序类。现在,您的API可以

Logger LOGGER = LoggerFactory.getLogger(...);

工厂方法的
接口
与它返回的接口相同,因此没有太多理由精确地确定
get
返回的类型。

默认和
静态
方法的用途不同

扩展包含默认方法的接口时,可以执行以下操作:

  • 根本不提默认方法,它允许扩展接口继承默认方法
  • 重新声明默认方法,使其变得抽象

  • 重新定义默认方法,该方法将覆盖它

  • 静态方法

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

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


    请参阅有关的oracle文档页面。

    默认方法和静态方法的用途不同

    扩展包含默认方法的接口时,可以执行以下操作:

  • 根本不提默认方法,它允许扩展接口继承默认方法
  • 重新声明默认方法,使其变得抽象

  • 重新定义默认方法,该方法将覆盖它

  • 静态方法

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

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


    请参阅oracle文档页面,关于。

    既然您不能覆盖静态方法,您就不需要(也不可能)为其定义默认实现,而是为其提供明确的行为。但是,我不明白,为什么他们决定在JDK 8的接口中包含静态方法?它的好处是什么?即使这个问题已经解决了,公认的答案也能很好地解释它。一个小小的总结是,您不再需要为
    接口
    提供实用工具
    ,因为您现在可以在
    接口
    中定义实用工具类的功能。“default”不是访问修饰符,它是默认方法实现的标记。在接口中,只允许“公共”访问修饰符