0

javaコンパイラが他のクラスからのプライベート属性へのアクセスを制限していないのはなぜですか? 修飾子「private」を持つ属性「a」を持つ内部クラスがあります。クラス外のインスタンス変数を使用して、この変数にアクセスできます。以下のコードを参照してください。

package com.test;

public class Test {

    public Test() {
    }

    public static void main(String[] args) {
        new Test().execute(); // test method
    }

    public void execute() {
        InnerClass innerClassInstance = new InnerClass();
        // accessing private member from other class instance, HOW?
        System.out.println(innerClassInstance.a);

        InnerStaticClass innerStaticClassInstance = new InnerStaticClass();
        // accessing private member from other class instance, HOW?
        System.out.println(innerStaticClassInstance.a);
    }

    private final class InnerClass {
        private int a; // accessible only in InnerClass??
    }

    private final static class InnerStaticClass {
        private int a; // accessible only in InnerClass??
    }
}
4

4 に答える 4

2

ネストされたクラスは、それを囲むクラスのメンバーです。ネストされた非静的クラス (内部クラス) は、プライベートと宣言されていても、囲んでいるクラスの他のメンバーにアクセスできます。

http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

すみません、質問を読み違えました。

JLS http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.1を見る

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

したがって、内部クラスのフィールド (明らかにクラス本体の内部にあります) は、プライベートであっても外部クラスからアクセスできます。

于 2012-04-06T09:17:52.053 に答える
1

Java 言語仕様を参照してください。

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

于 2012-04-06T09:19:48.053 に答える
0

内部クラスはテストクラスのメンバーであるため、テストクラスは内部クラスのプライベートメンバーにもアクセスできます。

このように試してみると、コンパイルエラーが発生します

パブリッククラステスト{

public Test() {
}

public static void main(String[] args) {
    new Test().execute(); // test method
}

public void execute() {
    InnerClass innerClassInstance = new InnerClass();
    // accessing private member from other class instance, HOW?
    System.out.println(innerClassInstance.a);

    InnerStaticClass innerStaticClassInstance = new InnerStaticClass();
    // accessing private member from other class instance, HOW?
    System.out.println(innerStaticClassInstance.a);
}

}

class InnerClass {private int a; //InnerClassでのみアクセス可能?? }

最終クラスInnerStaticClass{privateint a; //InnerClassでのみアクセス可能?? }

于 2012-04-06T09:26:05.477 に答える
0

これらのネストされたクラスはそのためのものです。クラスにプライベートメンバーがある場合、ネストされたクラスを記述して単体テストを行います。

于 2012-04-06T09:30:24.517 に答える