在Java tutorial "Defining an Interface"中,它说
如果未指定接口为
public
,则只能在与接口相同的包中定义的类中访问您的接口。
但是,这个
interface PPInterface {
void foo();
void bar();
}
class NewClass implements PPInterface {
void foo() {}
void bar() {}
}
在NewClass
中生成编译器错误,因为我'试图分配较弱的访问权限;是公开的。所以文档是错误的,或者我做错了什么,或者我误解了文档?
我想我不必使用界面 - 我喜欢它,因为它可以保持良好的组织。
答案 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。