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)。

インターフェイス フィールドは public であり、インターフェイスを実装するクラスによって継承されます。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クラスです。の内容を世間に知られたくない場合は、すべてのクラス (特に) をプライベートとして宣言する必要があります。TestingInterfaceClassInnerInterfaceInnerInterfaceTestingInterfaceClass

インターフェイス内のすべての変数は であるため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 

はpublic static フィールドをinner継承しており、それ自体が見える場所ならどこでも見えるはずです。iiinner

通常、インターフェイスはオブジェクトの動作を公開するために使用されますが、実装は隠されています。しかし、あなたの場合、あなたは反対のことを試みています。

于 2013-06-09T17:33:48.843 に答える
0

インターフェイス変数は暗黙的に public static final ですが、プライベートとして宣言したこれらの変数を含むインターフェイスに以前に到達できないため、この変数に到達できません。最初にインターフェイスを表示できるようにする必要があります。その後、インターフェイスのコンテンツに入ります。

于 2013-06-09T16:43:28.193 に答える