Java 对象的相等方法
我试图为对象编写一个equals方法,比较它们的字段,如果它们相等,则返回trueJava 对象的相等方法,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
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){