Java : 仅此方法

Java : this alone in method

大家好,我目前正在学习 java 编程,但我不理解部分代码。 我搜索了很长时间,但没有找到任何东西。这是我的代码:

   public boolean equals(Object obj) {

  if (this == obj)
    return true;

  if (getClass() != obj.getClass())
    return false;
    
  Ville other = (Ville) obj;

  return Objects.equals(other.getCategorie(), this.getCategorie()) &&
     Objects.equals(other.getNom(), this.getNom()) &&
     Objects.equals(other.getNombreHabitants(), this.getNombreHabitants()) &&
     Objects.equals(other.getNomPays(), this.getNomPays());
}

有两部分我不明白。 第一:

if (this == obj)

我知道我们正在尝试检查某些内容,但我不明白是什么? 其次:

Ville other = (Ville) obj;

我只是不明白它是做什么的,没有任何名为 other 的 Ville class 的踪迹。这是我的第一个问题,也许我不清楚。 感谢所有会回答我的人:)

  if (this == obj)
    return true;

这是第一次检查,它检查它们是否是同一个对象(它们分配相同的内存地址)。如果这是 true,它会立即 return,因为它们 100% 肯定是同一个对象。

如果不是这种情况,则进行第二次检查:

  if (getClass() != obj.getClass())
    return false;

这会检查它们是否是同一 class 的对象。如果不是,它会立即 returns false

如果不满足这两个条件,则会进行深度检查。

  Ville other = (Ville) obj;

  return Objects.equals(other.getCategorie(), this.getCategorie()) &&
     Objects.equals(other.getNom(), this.getNom()) &&
     Objects.equals(other.getNombreHabitants(), this.getNombreHabitants()) &&
     Objects.equals(other.getNomPays(), this.getNomPays());

首先它对类型 Ville 进行转换,因此对象 obj(转换后声明为 other)可以调用其方法(getNom()getNombreHabitants(), 等等)。此时如果两个Ville选择的参数相等则returntrue

所以,顺便说一句,整个方法都是。覆盖 Java 的对象 class.

equals() 方法
if (this == obj)

将当前实例的引用与给定对象进行比较。你可以把它想象成一个指针——所以基本上指针(引用)显示的是同一个内存块,因此它们必须相同。

Ville other = (Ville) obj;

这里我们将参数obj转换为classVilleObject。前面的 if 比较了 thisobjClass 确保此转换不会抛出 ClassCastException.

根据上下文,我假设您是从名为 Ville 的 class 中复制的。

此方法旨在确定 2 个对象的内容(或所持有的值)是否相同。

第一个测试(非常快)是检查调用者和 obj 是否实际上是同一个对象。在这种情况下不需要测试内容是否相同或是否相同class,因为这是显而易见的,所以您可以立即return true.

下一个检查是调用者和obj是同一个class。如果没有,那么检查内容就没有意义了。检查内容的方法可能并不为人所知。所以,退出 false.

余下的就是比较调用者和obj的内容。转换为 Ville 是为了公开访问 obj 的内容所必需的方法,以便可以将这些方法与调用者的内容进行比较。

参考变量

thisobj都是参考变量。它们实际上并不是对象本身,它们将我们引向一个对象,该对象的内容存在于内存中的其他地方。引用变量是将我们指向实际对象的名称。 pointer 是另一个技术名称。

对象

对象或实例是以特定方式布局的一块内存,用于保存各种数据(状态)以及一些方法(行为)。 class 是一个模板,用于定义该对象在内存中的布局。

例如,假设我们有一个名为 Dog 的 class 来跟踪每只狗的名字。所以我们可能有一只名叫“Boo”的狗。这个事实在内存中的某个地方表示。

我们可以有一个或多个引用变量引用(指向)那个对象。这些引用变量可以有一个显式名称,例如 obj,或一个隐式名称,例如 this.

== with objects 表示“都指向同一个对象”

您的代码:

if (this == obj)

…意思是“如果名为 'this' 的引用变量和 'obj' 引用变量恰好指向内存中其他地方的同一个对象”。

双EQUALS SIGN字符用于表示相等。但是与引用变量相等意味着两个指针都指向内存中的同一位置。我们不是在比较一对对象,我们是在比较一对指针。

作为新手程序员,这种指针业务可能会伤脑筋。不要太用力。特别是在 Java 中,语法是这样的,在日常工作中我们确实将 thisobj 视为名为 Boo 的狗。偶尔思考指点点(看看我在那里做了什么?),但现在不要担心。相信我,有一天您会发现这个概念会在您的脑海中浮现。

仅供参考,在某些语言中,例如 C or C++,程序员可以看到指针的实际值:一个数字,对象所在的内存位置的编号。在 Java 中,为了安全和简单起见,我们永远不会看到那个实际数字。我们只是相信一个参考变量会把我们引向我们想要的对象。

原语不同

所有这些讨论都涉及 引用变量,处理对象。

Java 不完全 object-oriented 因为除了对象之外,它还有原语。原语是一个简单的数据位。原始变量实际上确实包含该数据。所以原始变量不是引用变量,也不是指针。就像苹果和橘子,非常不同。

如果我们将原始变量与==进行比较,我们实际上是在比较数据的内容。

int x = 5 ;
int y = 7 ;
boolean areEqual = ( x == y ) ; 

上面的代码正在比较数字 5 和 7,检查它们作为数字的相等性。没有涉及对象,没有指针,没有像上面对象引用变量所讨论的那样在内存中跳转。

警告:为了教学,所有这些讨论都被大大简化了。