簡體   English   中英

在Java中覆蓋equals()

[英]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)方法; 相反,它超載它。

由於Nodeequals()方法正在調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM