Java私有字段可见性

所以前几天我正在创建一个类,当我意识到它生成了以下工作代码时,使用Eclipse的方法创建了equals方法:

class Test { private int privateInt; [...] public boolean equals(Object obj) { [...] Test t = (Test) obj; if ( t.privateInt == privateInt ) { [...] } } 

t.privateInt .. ???? 它假设是私人的! 所以我猜除了private,protected,package protected和public之外还有一个字段可见性。

那么这里发生了什么? 怎么称呼? 有人会用这个吗? 这不会破坏封装吗? 如果class级没有改变者并且我改变了这个怎么办? 这也发生在C ++上吗? 这是一个OO成语吗? 如果没有,那为什么Java会这样做呢?

通常,我在哪里可以找到有关此信息?

谢谢。

它可以从同一个类的不同实例访问。

根据这个页面 (bolding mine):

在成员级别,您也可以使用public修饰符或no修饰符(package-private),就像使用顶级类一样,并且具有相同的含义。 对于成员,还有两个额外的访问修饰符:private和protected。 private修饰符指定只能在其自己的类中访问该成员。

为清楚起见,我将重写这一行:

 if ( t.privateInt == this.privateInt ) 

我们可以同意允许“this.privateInt”:您正在类Test的实例中访问它,消息“equals”已被发送到。

不太清楚“t.privateInt”应该是可见的,因为t是Test类的一个单独实例,我们不在其equals方法中执行。 但是java允许这样做,因为两个对象(t和this)属于同一类Test,并且可以看到彼此私有成员。

迈克很正确; 你把对象(类的实例)与类本身混淆了。 成员对是私有的,而不是类的任何特定实例

我记得当我刚接触Java时对此感到惊讶。

您正在同一个类中引用它。 因此,您知道自己在做什么,不需要保护自己。

允许访问其他实例的私有成员的一个重要原因是允许“复制”function – 否则它们几乎是不可能的。 此外,如果您不允许其他实例访问,您会对静态方法允许什么?

可以访问同一个类的另一个实例的私有变量。 这是因为您正在直接处理类的实现,这需要您了解其内部的“私有”变量。

这种混淆的简单答案是要记住私有字段只能在它们初始化(和定义)的类中可见….所以当你在类中创建类的对象时,你总是可以访问该类的私有字段通过对象引用。 可能你觉得它很难但只是认为私有领域就像一个公共领域,当你在定义它的类中使用它时。