我试图测试private
interfaces
的工作情况并编写下面的代码。我可以理解,如果我们不希望任何其他类实现它们,那么可能会出现声明private
interfaces
的情况,但变量呢?接口变量是隐式public static final
,因此即使接口被声明为私有,我也能够访问它们。这可以在下面的代码中看到。
public class PrivateInterfaceTest {
/**
* @param args
*/
public static void main(String[] args) {
TestingInterfaceClass test = new TestingInterfaceClass();
TestingInterfaceClass.inner innerTest = test.new inner();
System.out.println(innerTest.i);
}
}
class TestingInterfaceClass {
private interface InnerInterface {
int i = 0;
}
class inner implements InnerInterface {
}
}
这是否意味着我们真的永远不会真正拥有private interface
?如果我们可以访问private interface
之外的变量,是否真的有意义吗?
编辑: 只是想补充一点,如果我们有私人内部阶级就不会出现同样的情况。内部类中的私有变量永远不会暴露。
答案 0 :(得分:2)
您的会员界面是私密的。继承的静态字段不是私有。
私有成员接口不能用作封闭顶级类或枚举之外的类型。这可以用于防止外部代码实现您可能希望更改的接口。来自JLS:
访问修饰符protected和private仅适用于直接封闭类或枚举声明中的成员接口(第8.5.1节)。
接口字段是public,由实现接口的类继承。来自JLS:
一个类继承自它的直接超类,并直接超级接口超类和超接口的所有非私有字段,这些字段既可以被类中的代码访问,也不会被类中的声明隐藏。
如果只想在实现成员接口的类中访问该字段,可以将其声明放在封闭的顶级作用域中。
class TestingInterfaceClass {
private static final int i = 0;
private interface InnerInterface {
// ...
}
class inner implements InnerInterface {
// ...
}
}
答案 1 :(得分:1)
如我所见,这不是private interface InnerInterface
的问题。 inner
类位于TestingInterfaceClass
内的默认范围内,显示InnerInterface
的内容。如果您不希望全世界都知道InnerInterface
的内容,您还应该将所有类(特别是TestingInterfaceClass
)声明为私有。
因为接口中的每个变量都是public static final
,所以它应该是类(实现它)的责任,是否应该处理从private interface
继承的内容
答案 2 :(得分:1)
即使允许,我们也不需要(也不应该使用)实例来访问静态字段。
以下是访问它的方法 -
System.out.println(TestingInterfaceClass.inner.i);
//note you cannot access the InnerInterface like this here because it's private
inner
继承了公共静态字段i
,i
本身可见的任何地方都应显示inner
。
通常,接口用于公开对象的行为,而隐藏实现。但在你的情况下,你正在尝试相反的做法。
答案 3 :(得分:0)
接口变量是隐式公共静态final,但是您无法访问此变量,因为您无法访问包含这些变量的接口,该接口已声明为private。首先,您需要能够看到界面,然后进入界面的内容。