私有界面中的变量

时间:2013-06-09 16:33:46

标签: java interface private

我试图测试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之外的变量,是否真的有意义吗?

编辑: 只是想补充一点,如果我们有私人内部阶级就不会出现同样的情况。内部类中的私有变量永远不会暴露。

4 个答案:

答案 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继承了公共静态字段ii本身可见的任何地方都应显示inner

通常,接口用于公开对象的行为,而隐藏实现。但在你的情况下,你正在尝试相反的做法。

答案 3 :(得分:0)

接口变量是隐式公共静态final,但是您无法访问此变量,因为您无法访问包含这些变量的接口,该接口已声明为private。首先,您需要能够看到界面,然后进入界面的内容。