这个私有variables是如何访问的?

编写下面的代码时,编译器不会抱怨?

public class MyClass { private int count; public MyClass(int x){ this.count=x; } public void testPrivate(MyClass o){ System.out.println(o.count); } } 

即使它是testPrivate编写的同一类的实例,它不应该在System.out.println(o.count)给出编译错误吗? 毕竟,我试图直接访问一个私有variables。
代码甚至运行良好。

无论该方法是否访问自己的( this )实例的私有成员或某个其他实例的私有成员,私有成员都可以从其所声明的类中的任何方法访问。

这在JLS 6.6.1中有规定:

…否则,如果成员或构造函数被声明为private,那么只有当它出现在包含成员或构造函数声明的顶级类(§7.6)的主体内时,才允许访问。

Java的这个特性允许你编写接受这个类的一个实例作为参数的方法(比如clone(Object other)compareTo(Object other) ),而不依赖于所有私有getter的类,需要被访问。

私人领域作为一个整体是私人的,而不仅仅是对象。

其他类不知道MyClass有一个称为count的字段; 但是,MyClass对象知道另一个MyClass对象具有计数字段。

访问者不是安全的! 它们是封装的,以防止其他人不必知道代码。

考虑一下,如果有人写了一个Quantum Bogo Sort ,但是一旦他把最后一个bug解决了,就消失了 – 理解代码会导致从宇宙中删除或者发疯。

尽pipe这个小缺点,如果适当封装,这应该成为你的首选sortingalgorithm,因为除了sorting的所有领域和方法应该是私人的。

你不知道它是如何工作的,你不想知道它是如何工作的,但它的工作,这就够了。 另一方面,如果一切都是公开的,而且你必须了解它是如何做到正确使用它的 – 这只是非常麻烦,我会坚持快速sorting。

尽pipe它是testPrivate编写的同一类的实例,但不应该通过System.out.println(o.count)的编译器错误;

没有 。 它永远不会抛出一个编译错误。

这和一个简单的getter和setter或者一个拷贝构造函数非常相似。 请记住,我们可以使用this.访问private会员this.

 public MyClass { private String propertyOne; private String propertyTwo; // cannot access otherObject private members directly // so we use getters // But MyClass private members are accessible using this. public MyClass(OtherClass otherObject) { this.propertyOne = otherObject.getPropertyOne(); this.propertyTwo = otherObject.calculatePropertyTwo(); } public void setPropertyOne(String propertyOne) { this.propertyOne = propertyOne; } public String getPropertyOne() { return this.propertyOne; } } 

你的testPrivate方法接受一个MyClass的实例。 由于testPrivateMyClass一个方法,因此可以访问private属性。

  public void testPrivate(MyClass o) { this.propertyOne = o.propertOne; } 

在类中定义的方法总是可以访问它的private成员,通过this. 和实例variables。

但是如果你在MyClass之外定义testPrivate ,那么你将不能访问private成员。 在那里你将不得不使用一个方法,一个setter或者一个getter。

被声明为私有的方法,variables和构造函数只能在声明的类本身内访问。 检查官方文件