Java 9 Interface : Why default Modifier Converted into public Modifier
我的问题是关于
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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类
1 2 3 4 5 6 7 | 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(); } |
事实上,它是一个
本教程的内容如下:
All abstract, default, and static methods in an interface are implicitly public, so you can omit the public modifier.
简单:默认情况下,接口中的所有方法都是公共的。您可以通过应用
引用Java语言规范:
A method in the body of an interface may be declared public or private (§6.6). If no access modifier is given, the method is implicitly public. It is permitted, but discouraged as a matter of style, to redundantly specify the public modifier for a method declaration in an interface.
(用Java 9引入了接口中的私有方法的能力,因为人们发现Java 8默认方法通常需要使用这样的默认方法可以使用的私有的方法,而不必让这些辅助方法公开可见)。
https://docs.oracle.com/javase/tutorial/java/iandi/interfacedef.html网站
All abstract, default, and static methods in an interface are implicitly public, so you can omit the public modifier.
实际上,实现接口的类将所有接口方法(私有方法除外)公开给具有该类可见性的任何其他代码。
如果一个类有一个接口,这将是非常令人困惑的,但是接口上的方法对于某些代码是可见的,而不是其他代码。如果您希望有选择地公开方法,那么您可能应该使用多个接口。
1 2 3 4 5 6 | public interface Profile { generalMethod() ... } public interface SecretProfile extends Profile { secretMethod() ... } |
类可以选择实现任意一个接口(甚至两者都可以)。第三方代码可以检查接口是否存在,并知道方法是否可用。
默认修饰符是公共的,因为这就是定义接口声明的方式:https://docs.oracle.com/javase/tutorial/java/iandi/interfacedef.html网站
如果您要了解这背后的原因,我会认为定义接口的目的是确保所有实现类的良好接口,这意味着所有实现类都有明确的契约,它们需要提供哪些公共可访问方法。
向接口添加私有方法并不能满足这个主要目的,而且似乎更像是一个实现提示。私有方法和抽象方法是对接口的后期添加。
有关:Java接口中的方法是否声明有公共访问修饰符或不具有公共访问修饰符?