Java 9 接口:为什么将默认修饰符转换为公共修饰符

我的问题是关于interface. 我创建了一个接口并定义了四个方法:第一个方法是一个private方法;二是default方法;三是static方法;第四是abstract方法。

编译此接口并检查其配置文件后:default方法被转换为public方法,并且static和abstract方法都有一个前置public修饰符。为什么是这样?


代码:


 interface InterfaceProfile {


    private void privateM() {   //this method is hidden

        System.out.println("private Method");

    }


    default void defaultM() {

        System.out.println("Default Method");

    }


    static void staticM() {

        System.out.println("Static Method");

    }


    void doStuff(); //by default adds the public modifier

}

接口配置文件类


    D:\Linux\IDE\Workspace\OCA-Wrokspace\Ocaexam\src>javap mods\com\doubt\session\InterfaceProfile.class

Compiled from "InterfaceProfile.java"

interface com.doubt.session.InterfaceProfile {

  public void defaultM();

  public static void staticM();

  public abstract void doStuff();

}


江户川乱折腾
浏览 183回答 3
3回答

森栏

它是一种方法的事实default并没有什么不同。隐含范围是public.这是教程所说的:接口中的所有抽象、默认和静态方法都是隐式公共的,因此您可以省略 public 修饰符。

梵蒂冈之花

简单:默认情况下,接口中的所有方法都是public。您可以通过应用来限制private它,但只要您不这样做,默认值就会生效。因此:根本没有发生转换。引用Java 语言规范:接口主体中的方法可以声明为公共的或私有的(第 6.6 节)。如果没有给出访问修饰符,则该方法是隐式公共的。允许但不鼓励在接口中为方法声明冗余地指定 public 修饰符。(在接口中拥有私有方法的能力是在 Java 9 中引入的,因为人们发现 Java 8 的默认方法通常需要拥有这些默认方法可以使用的私有方法,而不会使这些辅助方法公开可见)

翻过高山走不出你

默认修饰符是公共的,因为这是定义接口声明的方式: https ://docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.html如果你问这背后的原因,我认为定义接口的目的是确保所有实现类的接口,这意味着所有实现类都有明确的约定,它们需要提供哪些公共可访问方法.向接口添加私有方法并不能满足这个主要目的,而且似乎更像是一种实现提示。私有和抽象方法是对接口的后期添加。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java