Pra*_*u R 6 java accessibility private-members
私有成员是在类级别还是在对象级别进行访问.如果它在对象级别,则不应编译以下代码
class PrivateMember {
private int i;
public PrivateMember() {
i = 2;
}
public void printI() {
System.out.println("i is: "+i);
}
public void messWithI(PrivateMember t) {
t.i *= 2;
}
public static void main (String args[]) {
PrivateMember sub = new PrivateMember();
PrivateMember obj = new PrivateMember();
obj.printI();
sub.messWithI(obj);
obj.printI();
}
}
Run Code Online (Sandbox Code Playgroud)
请说明在sub的messWithI()方法中访问obj的成员i是否有效
正如DevSolar所说,它处于(顶级)级别.
否则,如果成员或构造函数被声明为private,则当且仅当它发生在包含成员或构造函数声明的顶级类(第7.6节)的主体内时才允许访问.
请注意,没有迹象表明它仅限于特定对象的成员.
从Java 7开始,编译器不再允许访问类型变量的私有成员.因此,如果该方法具有类似的签名,public <T extends PrivateMember> void messWithI(T t)则访问将是编译器错误t.i.但是,这不会改变您的特定情况.
请注意,您甚至不需要源级别访问权限来处理私有字段。通过使用java.lang.reflect.AccessibleObject.setAccessibe(),所有代码都可以访问所有其他代码的所有私有成员,除非您指定不允许的安全策略。
private本身并不是一个安全功能!这只是向其他开发人员强烈暗示,某些内容是代码其他部分不应依赖的内部实现细节。