【问题标题】:An interface in Java can have one and only one modifier which is public. Why are the rest not allowed? [duplicate]Java 中的接口可以有一个且只有一个修饰符是公共的。为什么其余的不允许? [复制]
【发布时间】:2011-12-23 01:35:17
【问题描述】:

可能重复:
Protected in Interfaces

以下代码 sn-p 表明 Java 中的接口只能有一个修饰符 public。在接口中不允许使用其他修饰符(私有和受保护),无论是字段还是任何方法。显然,在修饰符中,private 在接口中没有任何意义,但在接口中应该允许使用 protected,因为它可以被它的实现类合并。

interface Demo
{
    private final static int a=10; //Will not be compiled.
    protected final static int b=20; //Will not be compiled.
    public final static int x=0;   //ok

    abstract public void showSum();
}

虽然允许抽象类具有所有修饰符 private、public 和 protected。我的问题只是一个受保护的修饰符 not 在一个似乎被允许的界面中被允许。为什么?

【问题讨论】:

  • 接口的唯一目的是定义一个公开可见的签名。
  • 接口定义了独立于实现的 API。没有可以利用私有字段和方法的代码。在接口中添加常量值是不好的做法。

标签: java modifier


【解决方案1】:

显然,最好的答案是“因为他们是这么定义的”。我不认为我会在最初定义 Java 时做出决定的理由过于认真。现在是很久以前的事了,使用该语言获得的经验表明,许多最初的决定是有缺陷的。

在这种情况下,接口旨在用作与对象通信的公共协议,因此决定所有成员都必须是公共的。这可能不是最好或最有用的定义,但它是我们所拥有的,我们必须接受它。

【讨论】:

  • This may not have been the best or most useful definition ...你能请。解释一下你为什么这么认为?
  • 我有时希望的是受默认保护的接口或接口方法——即,能够防止实现接口的方法在其包之外被访问。在当前情况下,如果接口是某些内部模式的一部分,而不是在包外部使用,则方法仍然必须公开为 public
  • 但是我的机器上没有安装 Java,而且我也不是 Java 开发人员,因为很长一段时间以来,但是一个问题。难道不能通过拥有interface within a class 然后分配接口和类适当的可访问性来实现吗?
  • 不。正如最初的问题所指出的,接口中的所有方法都是公共的。实现接口方法的方法总是可以访问的,即使正在实现的接口不是!
【解决方案2】:

interface 中的所有方法和字段都应该以这样的方式声明,以便可以从任何地方调用它们。不仅来自子类。

只有public 修饰符可以做到这一点。

但是,应该避免在接口中有字段。如果可能的话。

【讨论】:

    【解决方案3】:

    抽象类提供了一些子类继承的实现。

    接口只是定义了一个外部 API,而不提供任何实现。接口背后的整个想法是实现完全留给实现类。

    【讨论】:

      猜你喜欢
      • 2016-07-28
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 1970-01-01
      • 2010-10-28
      • 2015-10-03
      • 1970-01-01
      • 2013-04-11
      相关资源
      最近更新 更多