17

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

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

t.privateInt..???? 应该是私人的!所以我想除了私有、受保护、包保护和公共之外,还有一个字段可见性。

那么这里发生了什么?这个怎么称呼?有人会在哪里使用这个?这不会破坏封装吗?如果该类没有 mutator 而我更改了它怎么办?C++ 也会发生这种情况吗?这是一个面向对象的习语吗?如果不是,那为什么 Java 这样做呢?

一般来说,我在哪里可以找到这方面的信息?

谢谢你。

4

6 回答 6

25

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

根据此页面(加粗我的):

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

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

if ( t.privateInt == this.privateInt )

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

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

于 2008-11-23T05:52:32.543 回答
4

迈克说得很对;您将对象(类的实例)与类本身混淆了。成员是的私有成员,而不是类的任何特定实例

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

于 2008-11-23T07:00:42.420 回答
3

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

于 2008-11-23T05:51:25.930 回答
3

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

于 2011-12-09T13:26:26.510 回答
1

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

于 2008-11-23T07:09:38.173 回答
0

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

于 2009-07-31T05:58:12.880 回答