【问题标题】:Java 9 Interface : Why default Modifier Converted into public ModifierJava 9 接口:为什么将默认修饰符转换为公共修饰符
【发布时间】:2019-06-30 08:55:17
【问题描述】:

我的问题是关于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
}

InterfaceProfile 类

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

【问题讨论】:

  • AFAIK,Java 9 引入了私有接口方法。
  • 其实我用的是openjdk 12

标签: java interface java-9 method-modifier


【解决方案1】:

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

the tutorial 是这样说的:

接口中的所有抽象、默认和静态方法都是隐式公共的,因此您可以省略 public 修饰符。

【讨论】:

  • @GhostCat 好点 :-) 我相信尽管 JLS 有时对某些级别的问题来说是压倒性的(如果所有答案都像这样衡量,那么可接受的质量答案的标准会太苛刻) )。话虽如此,你有一个非常有效的观点 - 假设语言规范的无错误实现;-)
【解决方案2】:

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

引用Java Language Specification

接口主体中的方法可以声明为公共的或私有的(第 6.6 节)。如果没有给出访问修饰符,则该方法是隐式公共的。允许但不鼓励在接口中为方法声明冗余指定 public 修饰符。

(在接口中拥有私有方法的能力是在 Java 9 中引入的,因为人们发现 Java 8 的默认方法通常需要拥有这些默认方法可以使用的私有方法,而无需制作这些助手方法公开可见)

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • "私有和抽象方法是对接口的后期添加。" 您在这里肯定不是指abstract,因为在Java 8 之前,接口只有abstract 方法。
    • @Holger:你是对的。我的意思是接口现在也可以声明类似于抽象类的实现方法。
    【解决方案4】:

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

    接口中的所有抽象、默认和静态方法都是隐式公共的,因此您可以省略 public 修饰符。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-09
      • 2011-04-12
      相关资源
      最近更新 更多