这个私有变量如何访问?

Kan*_*ngh 42 java private

编写以下代码时,编译器如何不抱怨?

public class MyClass 
{
    private int count;

    public MyClass(int x){
        this.count=x;
    }

    public void testPrivate(MyClass o){
        System.out.println(o.count);
    }   
}
Run Code Online (Sandbox Code Playgroud)

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

Era*_*ran 57

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

这在JLS 6.6.1中说明:

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

Java的这一特性允许您编写接受类实例作为参数的方法(例如 - clone(Object other),compareTo(Object other)),而不依赖于具有所有需要访问的私有属性的非私有getter的类.


Sim*_*mba 12

私有字段作为整体对于类是私有的,而不仅仅是对象.

其他类不知道MyClass有一个名为count的字段; 但是,MyClass对象知道另一个MyClass对象具有count字段.


jmo*_*eno 6

存取器不安全!它们是封装,以防止其他人不必了解代码.

考虑是否有人写了一个Quantum Bogo Sort,但是一旦他撤消了最后一个bug就消失了 - 理解这个代码会导致一个人从宇宙中被删除或发疯.

尽管有这个小缺点,如果适当封装,这应该成为您首选的排序算法,因为除Sort之外的所有字段和方法都应该是私有的.

你不知道它是如何工作的,你不想知道它是如何工作的,但是它有效,这就足够了.另一方面,如果一切都是公开的,你必须了解它如何正确地使用它 - 这太麻烦了,我会坚持使用quicksort.