Java 9接口:为什么默认修改器转换为公共修改器

Java 9 Interface : Why default Modifier Converted into public Modifier

我的问题是关于interface。我创建了一个接口,定义了四种方法:第一种方法是private方法;第二种方法是default方法;第三种方法是static方法;第四种方法是abstract方法。编译此接口并检查其配置文件后:default方法转换为public方法,staticabstract方法都有一个预先准备好的public修饰符。为什么会这样?

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 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
}

InterfaceProfile类

1
2
3
4
5
6
7
    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

本教程的内容如下:

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


简单:默认情况下,接口中的所有方法都是公共的。您可以通过应用private来限制这一点,但如果不这样做,就会出现默认值。因此:根本没有转换发生。

引用Java语言规范:

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默认方法通常需要使用这样的默认方法可以使用的私有的方法,而不必让这些辅助方法公开可见)。


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.

实际上,实现接口的类将所有接口方法(私有方法除外)公开给具有该类可见性的任何其他代码。

如果一个类有一个接口,这将是非常令人困惑的,但是接口上的方法对于某些代码是可见的,而不是其他代码。如果您希望有选择地公开方法,那么您可能应该使用多个接口。

1
2
3
4
5
6
public interface Profile {
    generalMethod() ...
}
public interface SecretProfile extends Profile {
    secretMethod() ...
}

类可以选择实现任意一个接口(甚至两者都可以)。第三方代码可以检查接口是否存在,并知道方法是否可用。


默认修饰符是公共的,因为这就是定义接口声明的方式:https://docs.oracle.com/javase/tutorial/java/iandi/interfacedef.html网站

如果您要了解这背后的原因,我会认为定义接口的目的是确保所有实现类的良好接口,这意味着所有实现类都有明确的契约,它们需要提供哪些公共可访问方法。

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

有关:Java接口中的方法是否声明有公共访问修饰符或不具有公共访问修饰符?