[英]Override equals() in Java
我試圖理解“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()”。 我錯過了什么? 我認為這種行為有一個簡單的解釋。
我認為你應該保持方法的簽名為:
public boolean equals(Object obj)
作為旁注:在要覆蓋的方法中放置@Override
注釋,以確保覆蓋正確的方法,否則編譯器會抱怨。
方法簽名是
@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;
}
您的方法簽名是public boolean equals( Car c )
。 因此Java不會覆蓋equals(Object)
方法; 相反,它超載它。
由於Node
的equals()
方法正在調用Car.equals(Object)
,因此它使用不同的實現。
你應該這樣做:
public boolean equals( Object o )
{
Car c = (Car)o;
return ( make.equals( c.make ) && model.equals( c.model ) );
}
得到它了。 謝謝大家的有用提示和評論。 通過使用以下代碼替換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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.