Java 9 接口:为什么默认修饰符转换为 public 修饰符

Java 9 Interface : Why default Modifier Converted into public Modifier

我的问题是关于 interface。我创建了一个接口并定义了四个方法:第一个方法是 private 方法;第二个是 default 方法;第三个是 static 方法;第四个是 abstract 方法。
编译此接口并检查其配置文件后:default 方法被转换为 public 方法,并且 staticabstract 方法都有前缀 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
}

接口配置文件class

    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();
}

它是一个 default 方法这一事实并没有什么不同。 隐式范围是public

the tutorial 是这样说的:

All abstract, default, and static methods in an interface are implicitly public, so you can omit the public modifier.

默认修饰符是public,因为这是定义接口声明的方式: https://docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.html

如果您要问这背后的原因,我认为定义接口的目的是确保所有实现 类 的良好接口,这意味着所有实现 类 有明确的合同,说明他们需要提供哪些 public 可访问的方法。

向接口添加私有方法并不能达到这个主要目的,似乎更像是一种实现提示。私有和抽象方法是接口的后期添加。

相关:Should methods in a Java interface be declared with or without a public access modifier?

简单:默认情况下,接口中的所有方法都是public。您可以通过应用 private 限制 ,但只要您不这样做,默认值就会生效。因此:有 no转换发生了。

引用Java Language Specification

A method in the body of an interface may be declared public or private (§6.6). If no access modifier is given, the method is implicitly public. It is permitted, but discouraged as a matter of style, to redundantly specify the public modifier for a method declaration in an interface.

( 在接口中拥有私有方法的能力是在 Java 9 中引入的,因为人们发现 Java 8 默认方法通常需要拥有这样默认的私有方法方法可以利用,而无需使这些辅助方法 publicly visible )

https://docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.html

All abstract, default, and static methods in an interface are implicitly public, so you can omit the public modifier.

实际上,实现接口的 class 将所有接口方法(私有方法除外)公开给具有 class.

可见性的任何其他代码

如果 class 有一个接口,但接口上的方法对某些代码可见而不对其他代码可见,那将是非常混乱的。如果你想有选择地公开方法,那么你可能应该使用多个接口。

public interface Profile {
    generalMethod() ...
}
public interface SecretProfile extends Profile {
    secretMethod() ...
}

类 可以选择实现其中一个接口(甚至两者)。第 3 方代码可以检查接口是否存在,并且知道该方法是否可用。