2

内部クラスがそのようなクラスの入力オブジェクト param のプライベート フィールドにアクセスできるのはなぜですか?

private class Inner {
    private int privatefield = 0;

    public void method( Inner inner ) {
        privatefield = 1; //ok
        inner.privatefield = 1; //this line confusing me (broken incapsulation)
    }
}
4

7 に答える 7

5

これは、内部クラス自体とは何の関係もありません。

クラス内のコードは、常にJava の同じクラスのプライベート メンバーにアクセスできます。private/ etcの概念はpublic、「この」インスタンスを参照するか別のインスタンスを参照するかではなく、コードが存在する場所を参照します。保護されたアクセスは、他のアクセスよりも少し複雑ですが、同じ一般原則が適用されます。

詳細については、 JLS セクション 6.6を参照してください。特に:

それ以外の場合、メンバーまたはコンストラクターがプライベートと宣言されている場合、メンバーまたはコンストラクターの宣言を囲む最上位クラス (§7.6) の本体内で発生した場合にのみ、アクセスが許可されます。

そして、コメントに従って、ネストされたクラスが同じトップレベルクラス内にネストされている限り、ネストされたクラスが別のネストされたクラスのプライベートフィールドにアクセスできる理由を説明しています。これは奇妙なルールです。私は同意します。privateアクセシビリティとネストされた型の点で C# のアプローチを好みますが、上記の引用は、コンパイラJLS のルールに従っていることを示しています。

同じ最上位クラス内で作業している場合、ネストされたクラスを含むそのクラス内のすべてのコードに責任があるため、それらを悪用しないと信頼されているというのが理由だと思います。

于 2013-08-29T09:14:39.417 に答える
0

アクセス修飾子は、個々のインスタンスが変数にアクセスできるかどうかではなく、変数がアクセスできるスコープを定義します!

private int privatefield = 0;

変数は静的ではないため、クラスのインスタンスによってアクセスされます。理inner.privatefieldにかなっています。これで、変数privatefieldprivate内でアクセスできることを意味しますInner classmethod()内部にある変数にアクセスしているため、Inner class問題はなく、完全に有効です。

于 2013-08-29T09:25:40.147 に答える
0

はクラスに常駐method(Inner inner)しているため、内部クラスにプライベートなメンバーにアクセスできます。Innermethod(Inner inner)

于 2013-08-29T09:18:55.497 に答える
0

内部クラスがそのようなクラスの入力オブジェクト param のプライベート フィールドにアクセスできるのはなぜですか?

  • にもかかわらずprivate、内部クラスは外部クラスのメンバーです
  • privatemembers はクラス メンバーにアクセスできます。
于 2013-08-29T09:14:15.917 に答える
0

クラスがネストされていないことを考慮してくださいprivate。質問とは無関係であるためです。スコープの可視性に関係しています。

宣言によると

private 修飾子 — フィールドは、独自のクラス内でのみアクセスできます。

別のインスタンスprivatefieldのメンバーであっても宣言されているクラス内のプロパティにアクセスするため、カプセル化が壊れていないため、スコープが維持されます。 private

于 2013-08-29T09:15:26.720 に答える