为什么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??
}
}
答案 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就是为了这个。当你私有时 在一个类中,我们编写嵌套类来进行单元测试。