有引用时可以访问Java私有字段吗?

ase*_*ovm 9 java access-modifiers private-members

我今天遇到了以下"奇怪"功能 - 如果您在A类主体中引用了A类中的对象,则可以访问该对象的私有字段 - 即:

public class Foo{
   private int bar;
   private Foo foo;
   public void f()
   {
       if(foo.bar == bar) // foo.bar is visible here?!
       {
            //
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

有人对此有一个很好的解释吗?

Mic*_*rdt 19

访问修饰符在类级别而不是在实例级别工作:同一个类中的所有代码都可以访问该类的所有实例的私有成员.

没什么特别奇怪的.


Xav*_*ica 5

它的目的是这样.

引用Java语言规范:

只有在类型可访问且声明成员或构造函数允许访问时,才能访问引用(类,接口或数组)类型的成员(类,接口,字段或方法)或类类型的构造函数:

  • ...
  • (否则,)如果成员或构造函数被声明为private,则当且仅当它发生在包含成员声明的顶级类(第7.6节)的主体内时才允许访问.
  • ...