我的问题是关于interface的。我创建了一个接口并定义了四种方法:第一种方法是private方法;第二种是default方法;第三种是static方法;第四种是abstract方法。
在编译了这个接口并检查了它的概要之后:default方法被转换成一个public方法,并且static和abstract方法都有一个附加的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();
}发布于 2019-02-06 12:01:07
简单:默认情况下,接口中的所有方法都是公共。您可以通过应用private来限制这一点,但是每当您不这样做时,默认情况就会出现。因此:根本不发生转换。
引用Java语言规范
接口正文中的方法可以声明为公共的或私有的(第6.6节)。如果没有提供访问修饰符,则该方法是隐式公共的。允许为接口中的方法声明指定公共修饰符,但作为一种风格,这是允许的,但作为一种风格,这是不可取的。
(在接口中拥有私有方法的能力是在Java 9中引入的,因为人们发现Java 8默认方法常常创建了这样的默认方法可以使用的私有方法,而不是使这些辅助方法公开可见)
发布于 2019-02-06 11:58:07
发布于 2019-02-06 12:00:12
默认修饰符是公共的,因为接口声明就是这样定义的:https://docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.html
如果您想知道背后的原因,我认为定义接口的目的是确保所有实现类的良好接口,这意味着所有实现类都有明确的契约,它们需要在哪些公共可访问方法上提供这些方法。
将私有方法添加到接口中并不能满足这一主要目的,似乎更像是一种实现提示。私有和抽象方法是对接口的后期添加。
https://stackoverflow.com/questions/54553041
复制相似问题