2

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

接口配置文件类

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

4 回答 4

4

它是一种方法的事实default并没有什么不同。隐含范围是public.

这是教程所说的:

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

于 2019-02-06T11:58:07.113 回答
2

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

引用Java 语言规范

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

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

于 2019-02-06T12:01:07.393 回答
1

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

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

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

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

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

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

于 2019-02-06T12:12:01.873 回答
1

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

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

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

相关:Java 接口中的方法是否应该使用或不使用公共访问修饰符来声明?

于 2019-02-06T12:00:12.923 回答