Java 私有字段可见性

2022-09-02 20:22:39

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

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

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

那么这里发生了什么呢?这叫什么?有人会在哪里使用它?这不会破坏封装吗?如果班级没有突变体,而我更改了这一点,该怎么办?这是否也发生在C++?这是一个OO成语吗?如果不是,那么Java为什么要这样做呢?

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

谢谢。


答案 1

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

根据这个页面(加粗我的):

在成员级别,还可以使用公共修饰符或不修饰符(包专用),就像使用顶级类一样,并且具有相同的含义。对于成员,还有两个附加的访问修饰符:私有和受保护。私有修饰符指定只能在其自己的类中访问成员。

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

if ( t.privateInt == this.privateInt )

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

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


答案 2

迈克是完全正确的;您将对象(类的实例)与类本身混淆。成员是类的私有,而不是的任何特定实例

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