java私有访问修饰符可以访问类的一边吗?

时间:2012-04-06 09:15:23

标签: java oop

为什么java编译器不限制从其他类访问私有属性? 我有内部类,其属性为'a',修饰符为'private'。我可以在类的外面访问这个变量及其实例变量。请参阅下面的代码。

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 个答案:

答案 0 :(得分: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

  

否则,如果成员或构造函数被声明为private,则当且仅当它发生在包含成员或构造函数声明的顶级类(第7.6节)的主体内时才允许访问。

因此,即使外部类是私有的,内部类中的字段(显然在类体内)也可以访问。

答案 1 :(得分:1)

请参阅Java language specification

  

否则,如果成员或构造函数被声明为private,则当且仅当它发生在包含成员或构造函数声明的顶级类(第7.6节)的主体内时才允许访问。

答案 2 :(得分: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);
}

}

class InnerClass {     private int a; //只能在InnerClass中访问? }

final class InnerStaticClass {     private int a; //只能在InnerClass中访问? }

答案 3 :(得分:0)

  

这些nested classes就是为了这个。当你私有时   在一个类中,我们编写嵌套类来进行单元测试。