Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对象的相等方法_Java_Object_Equals - Fatal编程技术网

Java 对象的相等方法

Java 对象的相等方法,java,object,equals,Java,Object,Equals,我试图为对象编写一个equals方法,比较它们的字段,如果它们相等,则返回true private int x, y, direction; private Color color; public boolean equals(Ghost other){ if (this.x == other.x && this.y == other.y && this.direction == other.direction && this

我试图为对象编写一个equals方法,比较它们的字段,如果它们相等,则返回true

private int x, y, direction;
private Color color;

public boolean equals(Ghost other){
   if (this.x == other.x && this.y == other.y &&
       this.direction == other.direction && this.color == other.color)
      return true;
   else 
      return false;
}
这可能有什么问题?

因为
color
a是一个类,因此是一个引用类型,这意味着您需要使用
equals()
来比较颜色

if (/* ... && */ this.color.equals(other.color)) {
如注释中所述,使用
==
比较引用类型实际上是比较Java中的内存地址。只有当它们都引用内存中的同一对象时,才会返回
true


您需要为参数使用基
对象
类,否则您不会重写
对象.equals()
,而是实际重载它,即提供调用相同命名方法的不同方式。如果您碰巧意外地传递了一个完全不同类的对象,则可能会发生意外行为(不过,如果它们属于不同类,则仍然会正确返回
false


原则上,这看起来不错


但是请注意,您正在使用
==
进行比较。对于基本体,这没有问题,但对于对象,它将检查相同的实例,而不是相同的值。这可能不是你想要的。如果要比较例如java.lang.Strings,则应该使用
equals
(并检查
null
)。

如果要比较对象变量而不是基本类型,则应该使用
this.color.equals(other.color)
比较


在您的情况下,这还取决于如何创建颜色对象。如果您使用静态实例(例如Color.BLUE),那么实际上,这并不重要。如果您从rgb值创建颜色对象,它肯定很重要。无论是哪种方式,最好还是习惯使用.basy.()作为对象变量。

< P>一个要考虑的事情是,当您正在更改PARAM类型时,您并没有从<代码>对象< /代码>中重写<代码>均衡器< /代码>方法。您可能会发现,这种方法不会像您预期的那样在所有情况下都使用。而不是:

public boolean equals(Ghost other){
你应该:

public boolean equals(Object other){

然后在内部测试
other
参数是否是
Ghost
实例并强制转换为必需的。

@fprime:您只需要一个return语句,如果
,则不需要
;-)在if语句之前打印出各个if短语的结果(例如this.x==other.x
)。看看哪一个失败了。正在比较的变量是对象类型还是基元类型?等等,我正在做的是比较内存地址还是实际值?它会比较值,你运行代码看它是否有效吗?啊,好的,明白了。我已经创建了一个equals方法,所以我只在颜色字段中使用了它,现在它可以工作了:)谢谢+1很好的捕捉。我应该修正我的答案吗,因为我的答案的第二部分是不正确的?是的,添加它以获得更完整的答案。
public boolean equals(Object other){