我试图理解“equals()”如何在Java中运行。特别是与“toString()”相反。这是一个让我偏离正轨的例子。
public class Car
{
String make, model;
public Car( String model, String make )
{
this.make = model;
this.model = make;
}
public String toString()
{
String str = "This is a car. ";
str += "Make: " + make + " | Model: " + model;
return str;
}
public boolean equals( Car c )
{
return ( make.equals( c.make ) && model.equals( c.model ) );
}
}
public class Node
{
protected Object obj;
protected Node next;
public Node( Object o )
{
this.obj = o;
this.next = null;
}
public String toString()
{
return obj.toString();
}
public boolean equals( Node n )
{
return ( this.obj.equals( n.obj ) );
}
}
Car c1 = new Car("toyota", "corolla");
Car c2 = new Car("toyota", "corolla");
Node nC1 = new Node( c1 );
Node nC2 = new Node( c2 );
nC1.print();
nC2.print();
if( nC1.equals( nC2 ) )
System.out.println("They are equal!");
else
System.out.println("They are NOT equal!");
这里nC1.print()和nC2.print()按预期运行。打印:
This is a car. Make: toyota | Model: corolla
This is a car. Make: toyota | Model: corolla
然而 nC1.equals(nC2),打印:
"They are NOT equal!"
简而言之,问题是我可以覆盖“toString()”,但不能覆盖“equals()”。我错过了什么?我认为这种行为有一个简单的解释。
答案 0 :(得分:7)
我认为您应该将方法的签名保留为:
public boolean equals(Object obj)
作为旁注:将@Override
注释放在要覆盖的方法中,以确保覆盖正确的方法,否则编译器会抱怨。
答案 1 :(得分:4)
方法签名是
@Override
public boolean equals(Object o) { ... }
您无法像尝试那样更改参数类型。 class Foo
中等号的有用模式是
@Override
public boolean equals(Object o) {
if (o instanceof Foo) {
Foo foo = (Foo)o;
return <expression testing equality of foo and this> ;
}
return false;
}
对于您的示例,
@Override
public boolean equals(Object o)
{
if (o instanceof Car) {
Car car = (Car)o;
return this.make.equals(car.make) && this.model.equals(car.model);
}
return false;
}
答案 2 :(得分:1)
您的方法签名为public boolean equals( Car c )
。因此Java不会覆盖equals(Object)
方法;而是重载它。
由于equals()
中的Node
方法正在调用Car.equals(Object)
,因此它使用了不同的实现。
你应该这样做:
public boolean equals( Object o )
{
Car c = (Car)o;
return ( make.equals( c.make ) && model.equals( c.model ) );
}
答案 3 :(得分:0)
知道了。谢谢大家的有用提示和评论。通过使用以下代码替换Class Car中的equals(..)代码,代码可以正常工作:
public boolean equals( Object o )
{
if( o instanceof Car )
{
if( make.equals( ((Car)o).make ) && model.equals( ((Car)o).model ) )
return true;
else
return false;
}
else
return false;
}