7

最近,我观察到在 Java 中访问私有字段的意外行为。考虑以下示例,该示例说明了该行为:

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

为什么允许我在方法中访问另一个类对象的私有字段Afoo第二种情况)?

4

3 回答 3

13

私有字段保护一个类,而不是一个实例。主要目的是允许一个类独立于其 API 来实现。在它们之间隔离实例,或保护实例的代码免受同一类的静态代码的影响,不会带来任何好处。

于 2013-05-16T12:00:19.233 回答
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
     }
  }
}
于 2013-05-16T12:00:20.127 回答
0

foo 方法与变量 i 属于同一个类,允许这种访问是没有害处的。

于 2013-05-16T12:03:06.160 回答