我的问题是关于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();
}
很简单:在默认情况下,在接口的所有方法都是公开的。您可以限制通过应用private
,但只要你不这样做,在默认情况下踢这样:没有转换发生在所有。
引述Java Language Specification:
在接口的主体的方法,可以声明公共或私人(6.6节)。如果没有访问修饰符,给出的方法是隐含公开。这是允许的,但不鼓励作为一个风格问题,以冗余指定公共修饰符在接口方法声明。
(有在接口的私有方法的能力与Java 9介绍,随着人们发现的Java 8默认的方法往往造成需要有,好,私有方法,这种默认的方法可以利用的,不使这些辅助方法公开可见)
默认修饰符是公开的,因为那是接口声明是如何定义的:https://docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.html
如果你问了这背后的原因,我认为,定义一个接口的目的是为了保证 - 好 - 所有执行类的接口,这意味着所有的实现类有哪些公共accessable方法,他们需要提供明确的合同。
添加私有方法的接口不提供这个的主要目的似乎是更实现伏笔。私人和抽象方法是后期补充接口。
相关:Should methods in a Java interface be declared with or without a public access modifier?
https://docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.html
所有抽象的,默认情况下,和静在接口中的方法都是public,这样你就可以省略公共修改。
实际上,实现的接口的类公开的所有的接口方法(除私人其他)到具有类的可见性的任何其他代码。
这将是非常混乱,如果一个班有一个接口,但该接口上的方法将是可见的一些代码,而不是其他。如果你想有选择地暴露方法,那么你或许应该使用多个接口。
public interface Profile {
generalMethod() ...
}
public interface SecretProfile extends Profile {
secretMethod() ...
}
类可以选择实现任一界面(甚至两者)。第三方代码可以检查接口的存在,并知道该方法是否可用。