【问题标题】:Methods visibility in interface接口中的方法可见性
【发布时间】:2011-03-24 11:35:04
【问题描述】:

接口中的所有方法是否默认具有公共可见性模式?

【问题讨论】:

  • 如果您有时间,您可能需要阅读由 head first team 编写的 SCJP for java 6 prep guide。那里有很多信息。默认情况下,接口方法是抽象的和公共的。

标签: java


【解决方案1】:

接口中的所有方法默认为public

查看Java Language Specification 6.6.1 哪些状态

接口的所有成员都是 隐含public

【讨论】:

  • 它们是public 默认值并且 public 是唯一允许的值。
  • +1 用于引用 JLS(通常有引用)
  • 但是rodionanswer/"workaround"本地/私有接口本身)在这里很重要:stackoverflow.com/a/5420362/1915920
【解决方案2】:

所有接口方法都是public abstract,所有接口字段都是public static final...

here

【讨论】:

  • 接口中最好不要有任何状态(实例变量),尽管编译器会让你定义字段。接口应该定义功能,或者对象可以做什么。
【解决方案3】:

只是在这里添加其他答案:所有方法都是公共的,但是,如果接口本身是包本地的,那么实际上所有方法也是包本地的。

因此,您可以通过使包本地接口扩展公共接口来混合公共和包本地方法。

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(),您将收到编译器错误。
  • `public class PseudoPrivate implements L
  • 你是对的,但我认为这是一个见仁见智的问题,因为是否公开实现类(在这种情况下为PseudoPrivate)是设计人员的选择。如果要公开实现类,为什么要首先使用接口?对?所以,如果你坚持使用接口作为你的公共 API,那么在我看来是没有问题的。
  • @monsieurRigsby 他想指出的是,我的想法仅在您拥有L extends P 而不是P extends L 时有效,因为这会泄露可见性。这是一个有效的观点。但只要你在代码中严格遵守L extends P,这个想法仍然有效。
【解决方案4】:

是的,接口的所有方法都是公共的,并且不能有任何其他访问修饰符(即默认的公共访问修饰符是唯一有效的访问修饰符)

【讨论】:

    【解决方案5】:

    是的,接口中的所有方法都是隐式公共和抽象的。

    查看Java language specification第9.4章

    【讨论】:

      猜你喜欢
      • 2014-07-11
      • 2012-09-25
      • 2013-02-04
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-19
      • 2012-06-17
      相关资源
      最近更新 更多