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

您的 Inner 类是您的 Test 类的成员,因此 Test 类也可以访问 Inner 类的私有成员。

像这样尝试它会给出编译错误

公共类测试{

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);
}

}

类 InnerClass { 私有 int a; // 只能在 InnerClass 中访问??}

最终类 InnerStaticClass { private int a; // 只能在 InnerClass 中访问??}

于 2012-04-06T09:26:05.477 回答
0

这些嵌套类就是为此而设计的。当你在一个类中有私有成员时,我们编写嵌套类来进行单元测试。

于 2012-04-06T09:30:24.517 回答