我的问题是关于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
}
修饰符。为什么会这样?
代码:
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
答案 0 :(得分:4)
答案 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() ...
}
类可以选择实现任何一个接口(甚至两个接口)。第三方代码可以检查接口的存在,并知道该方法是否可用。