4

我试图测试工作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如果我们可以访问外部变量,是否真的有意义private interface

编辑:如果我们有私有内部类,只是想添加同样的情况。内部类中的私有变量永远不会暴露。

4

4 回答 4

2

您的会员界面是私有的。继承的静态字段不是私有的。

私有成员接口不能用作封闭顶级类或枚举之外的类型。这对于防止外部代码实现您可能希望更改的接口很有用。来自 JLS:

访问修饰符 protected 和 private 仅适用于直接封闭类或枚举声明(第 8.5.1 节)中的成员接口。

接口字段是公共的,由实现接口的类继承。来自 JLS:

一个类从它的直接超类和直接超接口继承超类和超接口的所有非私有字段,这些字段都可以被类中的代码访问,并且不会被类中的声明隐藏。

如果您想让该字段只能在实现成员接口的类中访问,您可以将其声明放在封闭的顶级范围内。

class TestingInterfaceClass {
    private static final int i = 0;

    private interface InnerInterface {
        // ...
    }

    class inner implements InnerInterface {
        // ...
    }

}

于 2013-06-09T17:15:52.537 回答
1

如我所见,这不是问题private interface InnerInterface。它是inner在默认范围内TestingInterfaceClass暴露内容的类InnerInterface。如果您不想让InnerInterface世界知道 的内容,您还应该将所有类(特别是TestingInterfaceClass)声明为私有。

因为接口中的每个变量都是public static final,所以应该由类(实现它)负责是否应该处理从private interface

于 2013-06-09T16:58:43.183 回答
1

即使允许,我们也不需要(也不应该使用)实例来访问静态字段。

以下是访问它的方式 -

System.out.println(TestingInterfaceClass.inner.i);
//note you cannot access the InnerInterface like this here because it's private 

inner继承了公共静态字段i,并且在其本身i可见的任何地方都应该可见。inner

通常,接口用于暴露对象的行为,而实现是隐藏的。但在你的情况下,你正在尝试相反的事情。

于 2013-06-09T17:33:48.843 回答
0

Interface 变量是隐式的 public static final,但您无法访问此变量,因为您之前无法访问包含这些变量的接口,您已将其声明为 private。首先你需要能够看到界面,然后进入界面的内容。

于 2013-06-09T16:43:28.193 回答