我正在我的程序中创建方法.equals(Die aDie)。我是否比较每个实例变量,包括静态变量?
答案 0 :(得分:4)
布尔等于(Die aDie)
错误,类会调用equals(Object)
方法并忽略你的等号(Die)。还使用等于(Object)使用的相同字段来实现int hashCode()
方法。
@Override public boolean equals(Object aDie){
if(aDie == null || aDie.getClass() != Die.class)return false;
if(aDie == this)return true;
Die other = (Die)aDie;
...
}
@Override public int hashCode(){
...
}
您可以忽略静态字段,因为它们对于每个Die都是相同的。
答案 1 :(得分:2)
根据定义,静态变量不是实例变量,因此在同一个类的所有实例中始终相等。
答案 2 :(得分:1)
绝对不是静态的。
是否比较 all 实例变量取决于决定对象“身份”的因素,即您认为它们何时相等?这只能在您的特定应用程序的上下文中决定 - 我们需要更多信息。
例如,如果您有一个代表书籍的类,您可能只比较ISBN号以确定两本书是否是同一本书,如果您只想存储有关它们的元数据(标题,作者)。如果合并了两个这样的数据库,则需要消除重复记录。
但是,如果您正在实施实际实体图书的图书馆目录,则每个单独的副本都很重要且不同,因此您可以比较ISBN 和副本编号。如果您合并了两个库,那么您希望能够检测到重复的副本。
答案 3 :(得分:0)
您将比较每个实例变量。
静态变量保证相同,因为它们是特定于类的,而不是特定于实例的,因此您不必担心比较它们。
答案 4 :(得分:0)
这没有任何意义,因为使用equals()比较实例和,因为它们是静态的:你会将它们与自己进行比较?
答案 5 :(得分:0)
比较静态数据是没用的,因为它在Die
类的所有实例之间共享。但您可以通过直接访问它们来比较各个字段(请参阅下面的示例)。请注意,如果您的Die
对象包含复杂字段(例如Map
,Set
等的实例),您还应该在这些对象上调用equals
方法(同样,见下面的例子。)
如果您想提供equals ()
方法,则应覆盖Object
类(equals (Object anOtherObject
)中提供的方法,而不是超载它,或至少确保您也覆盖equals (Object anOtherObject)
以确保它也返回正确的值(默认实现仅检查它是否是相同的实例)。然后,在您的方法中,您应该检查anOtherObject
是Die
的实例。
以下是一个示例,假设您的Die
班级有3个字段:String name
,int value
和Map<Integer> complexField
:
public boolean equals (Object anOtherObject) {
if (anOtherObject == this) {
return true;
}
if (!anOtherObject instanceof Die) {
return false;
}
Die otherDie = (Die) anOtherObject;
if (this.value != otherDie.value ||
!this.name.equals (otherDie.name) ||
!this.complexField.equals (otherDie.complexField)) {
return false;
}
return true;
}
Josh Bloch的“ Effective Java ”有一个关于如何正确实现equals
的非常详细的部分。你一定要读它。
答案 6 :(得分:0)
当使用关键字“static”声明变量时,它称为“类变量”。所有实例共享变量的相同副本(在同一个类的所有实例中始终相等)。可以使用类直接访问类变量,而无需创建实例。