为什么允许访问另一个对象的私有字段?

最近,我观察到在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(ai); // 2. Accessing private field of another object! } public static void main(String[] args) { (new A(5)).foo(new A(2)); } } 

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

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

这是因为他们属于同一类。 这在Java中是允许的。

出于多种目的,您将需要此访问权限。 例如,在equals的实现中:

 public class A { private int i; @override public boolean equals(Object obj){ if(obj instanceof A){ A a = (A) obj; return ai == this.i; // Accessing the private field }else{ return false } } } 

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