3

为什么接口上的方法总是公开的?为什么他们不能是私人的?

4

3 回答 3

5

因为接口上的所有方法都是公共的。这就是拥有接口的关键——从技术上讲,它为您的类定义了一个契约(可能有许多重叠的契约/接口)。您的类的客户端应该持有对接口的引用,并且只能通过接口访问类的已发布(公共)方法。

于 2013-06-08T03:51:39.090 回答
2

为什么会这样?

因为 JLS 是这么说的:

在关于接口声明的章节中,JLS 9.4说:“接口主体中的每个方法声明都是隐式的public。”

在关于类声明的章节中,JLS 8.4.8.3说:“覆盖或隐藏方法的访问修饰符(第 6.6 节)必须提供至少与覆盖或隐藏方法一样多的访问权限,......”

工程师 Dollery 的回答解释了为什么这种语言是这样设计的。

于 2013-06-08T05:28:12.593 回答
2

我推断您指的是这样声明的接口:

public interface MyInter 
{
    public void myFunc();
}

如果您public在实现中省略限定符,则会产生错误:

MyClass.java:3: myFunc() in MyClass cannot implement myFunc() in MyInter; attempting to assign weaker access privileges; was public
    void myFunc(){}
         ^

说你可以myFunc私有化。您在不同的类中编写以下代码。这应该抱怨您尝试使用您无权访问的私有功能:

MyClass foo = new MyClass();
foo.myFunc(); // Declared private, can't call it.

但是这个呢:

void doSomething(MyInter foo)
{
    foo.myFunc(); // Declared public in interface, private in implementation.
}

我们可以这样做吗?根据接口,它是一个公共方法,所以我们应该很高兴。但它是作为私有方法实现的,因此该类希望永远不会像这样从外部调用它,这是编译器应该强制执行的限制。但是编译器甚至不需要知道MyClass这个来编译。它甚至还不能被编写,或者在可能集成也可能永远不会集成的外部库中。

允许实现会在允许访问的规则中产生内部不一致,解决这种不一致的方法是完全禁止这种情况。任何可以在接口中调用方法的东西都必须能够在任何实现中调用它。

同样的论点也适用于重写子类方法。您不能通过覆盖更严格的限定符来“隐藏”它们。

于 2013-06-08T04:02:36.797 回答