最近,我观察到在Java中访问priavte字段的意外行为。请考虑以下示例,该示例说明了行为:
public class A {
private int i; <-- private field!
public A(int i) {
this.i = i;
}
public void foo(A a) {
System.out.println(this.i); // 1. Accessing the own private field: good
System.out.println(a.i); // 2. Accessing private field of another object!
}
public static void main(String[] args) {
(new A(5)).foo(new A(2));
}
}
为什么我可以在A
方法(第二种情况)中访问类foo
的另一个对象的私有字段?
答案 0 :(得分:13)
私有字段保护类,而不是实例。主要目的是允许类独立于其API实现。在它们之间隔离实例,或者保护实例的代码不受同一类的静态代码的影响,不会带来任何结果。
答案 1 :(得分:3)
这是因为他们属于同一类。这在Java中是允许的。
出于多种目的,您将需要此访问权限。例如,在equals:
的实现中public class A {
private int i;
@override public boolean equals(Object obj){
if(obj instanceof A){
A a = (A) obj;
return a.i == this.i; // Accessing the private field
}else{
return false
}
}
}
答案 2 :(得分:0)
foo方法与变量i属于同一个类,允许这样的访问没有任何害处。