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

时间:2019-02-06 11:53:10

标签: java interface java-9 method-modifier

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

InterfaceProfile类

  5 - Thu Sep 06 2018 16:03:10 GMT+0200 (CEST) - GLLD008 - A ( Because A <=6 & no B => GLLD008)
  7 - Mon Sep 10 2018 13:32:28 GMT+0200 (CEST) - GLLD015 - A ( Because A > 6 => GLLD015)
  85 - Wed Sep 05 2018 15:07:00 GMT+0200 (Central European Summer Time) - GLLD015 - B

4 个答案:

答案 0 :(得分:4)

这是一种default方法,这一事实没有任何区别。 隐式范围为public

the tutorial的意思是:

  

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

答案 1 :(得分:2)

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

引用Java Language Specification

  

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

(在Java 9中引入了在接口中具有私有方法的能力,因为人们发现Java 8默认方法经常导致需要拥有此类默认方法可以利用的私有方法,而无需使用这些帮助程序公开可见的方法)

答案 2 :(得分:1)

默认修饰符是public,因为这是定义接口声明的方式: 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?

答案 3 :(得分:1)

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

  

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

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

如果一个类具有一个接口,但是该接口上的方法对某些代码可见,而对另一些代码则不可见,这将非常令人困惑。如果要有选择地公开方法,则可能应该使用多个接口。

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

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