这个私有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的实例。 由于testPrivate
是MyClass
一个方法,因此可以访问private
属性。
public void testPrivate(MyClass o) { this.propertyOne = o.propertOne; }
在类中定义的方法总是可以访问它的private
成员,通过this.
和实例variables。
但是如果你在MyClass
之外定义testPrivate
,那么你将不能访问private
成员。 在那里你将不得不使用一个方法,一个setter或者一个getter。
被声明为私有的方法,variables和构造函数只能在声明的类本身内访问。 检查官方文件