Java私有字段可见性

时间:2008-11-23 05:43:24

标签: java language-features visibility

所以前几天我正在创建一个类,当我意识到它生成了以下工作代码时,使用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之外,还有一个字段可见性。

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

一般来说,我在哪里可以找到相关信息?

谢谢。

6 个答案:

答案 0 :(得分:24)

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

根据this page(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,并且可以看到彼此的私有成员。

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:3)

允许访问其他实例的私有成员的一个重要原因是允许“复制”功能 - 否则它们几乎是不可能的。另外,如果您不允许其他实例访问,那么您允许使用静态方法?

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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