【发布时间】:2011-03-24 11:35:04
【问题描述】:
接口中的所有方法是否默认具有公共可见性模式?
【问题讨论】:
-
如果您有时间,您可能需要阅读由 head first team 编写的 SCJP for java 6 prep guide。那里有很多信息。默认情况下,接口方法是抽象的和公共的。
标签: java
接口中的所有方法是否默认具有公共可见性模式?
【问题讨论】:
标签: java
【讨论】:
public 默认值并且 public 是唯一允许的值。
所有接口方法都是public abstract,所有接口字段都是public static final...
见here。
【讨论】:
只是在这里添加其他答案:所有方法都是公共的,但是,如果接口本身是包本地的,那么实际上所有方法也是包本地的。
因此,您可以通过使包本地接口扩展公共接口来混合公共和包本地方法。
public interface P{
void iAmPublic();
}
interface L extends P{
void iAmPackageLocal();
}
这里L 实际上有一种公共方法和一种本地包方法。包外的客户只能看到iAmPublic(),而包内的客户会看到这两种方法。
以同样的方式,您可以将接口嵌套在其他类中以实现更严格的方法可见性。
【讨论】:
iAmPackageLocal 将不会是包私有的。见stackoverflow.com/a/4801672/16209
P#iAmPublic(),但可以从包内部访问这两种方法,因此您可以获得所需的效果。假设您在包中有一些带有方法 public L getL(); 的 API,然后尝试从包外调用 getL().iAmPackageLocal(),您将收到编译器错误。
PseudoPrivate)是设计人员的选择。如果要公开实现类,为什么要首先使用接口?对?所以,如果你坚持使用接口作为你的公共 API,那么在我看来是没有问题的。
L extends P 而不是P extends L 时有效,因为这会泄露可见性。这是一个有效的观点。但只要你在代码中严格遵守L extends P,这个想法仍然有效。
是的,接口的所有方法都是公共的,并且不能有任何其他访问修饰符(即默认的公共访问修饰符是唯一有效的访问修饰符)
【讨论】:
是的,接口中的所有方法都是隐式公共和抽象的。
查看Java language specification第9.4章
【讨论】: