Java教程说我可以有一个包 - 私有接口,但我不能

时间:2011-01-26 05:30:37

标签: java interface access-specifier

Java tutorial "Defining an Interface"中,它说

  

如果未指定接口为public,则只能在与接口相同的包中定义的类中访问您的接口。

但是,这个

interface PPInterface {
    void foo();
    void bar();
}

class NewClass implements PPInterface {
    void foo() {}
    void bar() {}
}

NewClass中生成编译器错误,因为我'试图分配较弱的访问权限;是公开的。所以文档是错误的,或者我做错了什么,或者我误解了文档?

我想我不必使用界面 - 我喜欢它,因为它可以保持良好的组织。

3 个答案:

答案 0 :(得分:55)

接口本身可以是包私有的,而不是其中的方法。您可以定义一个只能在其定义的包中使用(通过名称)的接口,但其方法与所有接口方法一样public。如果类实现了该接口,则它定义的方法必须为public。这里的关键是它是在包外面看不到的接口 type ,而不是方法。文档不正确,因为使用界面中定义的方法与使用界面本身不同。

另请注意,在定义接口时,不在方法定义之前添加public不会更改任何内容,因为这些方法都是隐式public

如果您实现接口的类本身是包私有的,那么接口方法的public显然不是问题。当然,如果单继承问题没有妨碍你,你也可以使用抽象类而不是接口:

abstract class Whatever {
  abstract void foo();
  abstract void bar();
}

答案 1 :(得分:4)

认为(虽然我可能错了),这里讨论的弱访问权限适用于foo()中的bar()NewClass方法。所有接口方法都是隐式public,但在NewClass中,您将它们保留为package-private,这是一个比public更弱的保证。将NewClass更改为

class NewClass implements PPInterface{
    public void foo() {}
    public void bar() {}
}

可能会解决这个问题。

答案 2 :(得分:0)

对我来说解决单继承问题是有用的:

而不是A扩展B实现C

我有抽象D(C中的包保护接口)扩展B

然后A延伸D

工作正常。干净,tbh。