关于java:接口实现的差异

Differences on Interface implementation

本问题已经有最佳答案,请猛点这里访问。

我有一个简单的问题。这里有两个代码片段来说明我的意思:

例1:

1
2
3
public interface SomeInterface{
  public void someMethod(...);
}

例2:

1
2
3
public interface AnotherInterface{
  void anotherMethod(...);
}

因此,示例1对我来说是完全清楚的,但是示例2却不清楚。

事实上,除了public修饰语,这两个例子之间有什么不同吗?

一方面,我发现来自Interface的方法是隐式的public,但另一方面,我发现在Interface中声明的方法是"包公共的"(如果描述正确,我现在不这样做了),说这些方法对与Interface相同包中的所有类都可见。现在我完全困惑了……有人能给我解释一下什么是对的吗?

无论如何谢谢。


接口中的所有方法都是公共的,在任何地方实现类都是可见的。但是,如果接口本身是包本地的(没有修饰符-默认值),那么这些方法只对同一包中的类/接口可见。但是该方法在实现类中仍然必须是公共的

在上面的代码中,没有区别。但如果是这样的话:

1
2
3
interface AnotherInterface{ // Note no modifier - default modifier applied
    void anotherMethod(...);
}

在这种情况下,接口只在同一个包中可见。

注意:接口本身可以是包私有的,而不是包中的方法。您可以定义一个接口,该接口只能(按名称)在其定义的包中使用,但其方法与所有接口方法一样是公共的。如果类实现了该接口,则它定义的方法必须是公共的。这里的关键是它是在包外部不可见的接口类型,而不是方法。


在第十一条〔0〕上声明是多余的。特别是JLS 9.4规定:

Every method declaration in the body of an interface is implicitly public (§6.6).

Every method declaration in the body of an interface is implicitly abstract, so its body is always represented by a semicolon, not a block.

It is permitted, but discouraged as a matter of style, to redundantly specify the public and/or abstract modifier for a method declared in an interface.


所有接口方法都是公共抽象的,所有接口字段都是公共静态final。

所以上面的例子没有区别。