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
转换为classVille
的Object
。前面的 if 比较了 this
和 obj
的 Class
确保此转换不会抛出 ClassCastException
.
根据上下文,我假设您是从名为 Ville
的 class 中复制的。
此方法旨在确定 2 个对象的内容(或所持有的值)是否相同。
第一个测试(非常快)是检查调用者和 obj
是否实际上是同一个对象。在这种情况下不需要测试内容是否相同或是否相同class,因为这是显而易见的,所以您可以立即return true
.
下一个检查是调用者和obj
是同一个class。如果没有,那么检查内容就没有意义了。检查内容的方法可能并不为人所知。所以,退出 false
.
余下的就是比较调用者和obj
的内容。转换为 Ville
是为了公开访问 obj
的内容所必需的方法,以便可以将这些方法与调用者的内容进行比较。
参考变量
this
和obj
都是参考变量。它们实际上并不是对象本身,它们将我们引向一个对象,该对象的内容存在于内存中的其他地方。引用变量是将我们指向实际对象的名称。 pointer 是另一个技术名称。
对象
对象或实例是以特定方式布局的一块内存,用于保存各种数据(状态)以及一些方法(行为)。 class 是一个模板,用于定义该对象在内存中的布局。
例如,假设我们有一个名为 Dog
的 class 来跟踪每只狗的名字。所以我们可能有一只名叫“Boo”的狗。这个事实在内存中的某个地方表示。
我们可以有一个或多个引用变量引用(指向)那个对象。这些引用变量可以有一个显式名称,例如 obj
,或一个隐式名称,例如 this
.
==
with objects 表示“都指向同一个对象”
您的代码:
if (this == obj)
…意思是“如果名为 'this' 的引用变量和 'obj' 引用变量恰好指向内存中其他地方的同一个对象”。
双EQUALS SIGN字符用于表示相等。但是与引用变量相等意味着两个指针都指向内存中的同一位置。我们不是在比较一对对象,我们是在比较一对指针。
作为新手程序员,这种指针业务可能会伤脑筋。不要太用力。特别是在 Java 中,语法是这样的,在日常工作中我们确实将 this
或 obj
视为名为 Boo 的狗。偶尔思考指点点(看看我在那里做了什么?),但现在不要担心。相信我,有一天您会发现这个概念会在您的脑海中浮现。
仅供参考,在某些语言中,例如 C or C++,程序员可以看到指针的实际值:一个数字,对象所在的内存位置的编号。在 Java 中,为了安全和简单起见,我们永远不会看到那个实际数字。我们只是相信一个参考变量会把我们引向我们想要的对象。
原语不同
所有这些讨论都涉及 引用变量,处理对象。
Java 不完全 object-oriented 因为除了对象之外,它还有原语。原语是一个简单的数据位。原始变量实际上确实包含该数据。所以原始变量不是引用变量,也不是指针。就像苹果和橘子,非常不同。
如果我们将原始变量与==
进行比较,我们实际上是在比较数据的内容。
int x = 5 ;
int y = 7 ;
boolean areEqual = ( x == y ) ;
上面的代码正在比较数字 5 和 7,检查它们作为数字的相等性。没有涉及对象,没有指针,没有像上面对象引用变量所讨论的那样在内存中跳转。
警告:为了教学,所有这些讨论都被大大简化了。
大家好,我目前正在学习 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
转换为classVille
的Object
。前面的 if 比较了 this
和 obj
的 Class
确保此转换不会抛出 ClassCastException
.
根据上下文,我假设您是从名为 Ville
的 class 中复制的。
此方法旨在确定 2 个对象的内容(或所持有的值)是否相同。
第一个测试(非常快)是检查调用者和 obj
是否实际上是同一个对象。在这种情况下不需要测试内容是否相同或是否相同class,因为这是显而易见的,所以您可以立即return true
.
下一个检查是调用者和obj
是同一个class。如果没有,那么检查内容就没有意义了。检查内容的方法可能并不为人所知。所以,退出 false
.
余下的就是比较调用者和obj
的内容。转换为 Ville
是为了公开访问 obj
的内容所必需的方法,以便可以将这些方法与调用者的内容进行比较。
参考变量
this
和obj
都是参考变量。它们实际上并不是对象本身,它们将我们引向一个对象,该对象的内容存在于内存中的其他地方。引用变量是将我们指向实际对象的名称。 pointer 是另一个技术名称。
对象
对象或实例是以特定方式布局的一块内存,用于保存各种数据(状态)以及一些方法(行为)。 class 是一个模板,用于定义该对象在内存中的布局。
例如,假设我们有一个名为 Dog
的 class 来跟踪每只狗的名字。所以我们可能有一只名叫“Boo”的狗。这个事实在内存中的某个地方表示。
我们可以有一个或多个引用变量引用(指向)那个对象。这些引用变量可以有一个显式名称,例如 obj
,或一个隐式名称,例如 this
.
==
with objects 表示“都指向同一个对象”
您的代码:
if (this == obj)
…意思是“如果名为 'this' 的引用变量和 'obj' 引用变量恰好指向内存中其他地方的同一个对象”。
双EQUALS SIGN字符用于表示相等。但是与引用变量相等意味着两个指针都指向内存中的同一位置。我们不是在比较一对对象,我们是在比较一对指针。
作为新手程序员,这种指针业务可能会伤脑筋。不要太用力。特别是在 Java 中,语法是这样的,在日常工作中我们确实将 this
或 obj
视为名为 Boo 的狗。偶尔思考指点点(看看我在那里做了什么?),但现在不要担心。相信我,有一天您会发现这个概念会在您的脑海中浮现。
仅供参考,在某些语言中,例如 C or C++,程序员可以看到指针的实际值:一个数字,对象所在的内存位置的编号。在 Java 中,为了安全和简单起见,我们永远不会看到那个实际数字。我们只是相信一个参考变量会把我们引向我们想要的对象。
原语不同
所有这些讨论都涉及 引用变量,处理对象。
Java 不完全 object-oriented 因为除了对象之外,它还有原语。原语是一个简单的数据位。原始变量实际上确实包含该数据。所以原始变量不是引用变量,也不是指针。就像苹果和橘子,非常不同。
如果我们将原始变量与==
进行比较,我们实际上是在比较数据的内容。
int x = 5 ;
int y = 7 ;
boolean areEqual = ( x == y ) ;
上面的代码正在比较数字 5 和 7,检查它们作为数字的相等性。没有涉及对象,没有指针,没有像上面对象引用变量所讨论的那样在内存中跳转。
警告:为了教学,所有这些讨论都被大大简化了。