Java对象等于方法不起作用

时间:2013-12-04 21:28:36

标签: java

我的代码有问题,equals方法无效,我尝试了==.equals(),但它无效。

这是main方法的代码:

x= new Card('♠',"number","3",5,Color.BLACK);
y= new Card('♠',"number","3",5,Color.BLACK);
if(x.equals(y)) System.out.println("True"); else System.out.println("False");

程序在屏幕上打印“False”。

这是我的卡类:

package core;

import java.awt.Color;

public class Card {
    private char symbol;
    private String type,value;
    private int score;
    private Color warna;
    public Card(char symbol, String type, String value,int score,Color warna)
    {
        this.setSymbol(symbol);
        this.setValue(value);
        this.setType(type);
        this.setScore(score);
        this.warna = warna;
    }
    public char getSymbol() {
        return symbol;
    }
    public void setSymbol(char symbol) {
        this.symbol = symbol;
    }
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public int getScore() {
        return score;
    }
    public void setScore(int score) {
        this.score = score;
    }
    public Color getWarna() {
        return warna;
    }
    public void setWarna(Color warna) {
        this.warna = warna;
    }
}

我该怎么办?

5 个答案:

答案 0 :(得分:2)

这不是使用equals()方法,而是测试2个实例的引用相等性:

if(x==y)

如果您想使用它,则需要调用equals()方法。

更新:

equals()测试无效,因为您没有覆盖默认的Object.equals()方法,该方法仅测试引用相等性。

答案 1 :(得分:2)

在你的情况下:

右: if ( x.equals(y) )

错误: if ( x == y )

如果equals API不起作用,那么您已在Card课程中覆盖了它,并且您已将其实施错误。

如果你还没有覆盖它,那就去做吧:

public class Card 
{
    ...

    @Override
    public boolean equals(final Object obj)
    {
        if ( obj == null || obj == this || !(obj instanceof Card) ) 
            return false;

        Card otherCard = (Card) obj;

        if (otherCard.score != this.score)       return false;
        if (otherCard.symbol != this.symbol)     return false;
        if (!otherCard.warna.equals(this.warna)) return false;
        if (!otherCard.type.equals(this.type))   return false;
        if (!otherCard.value.equals(this.value)) return false;

        return true;
    }

}

答案 2 :(得分:0)

因为“==”仅检查x和y是否引用同一个对象。要检查它们是否相等,您希望覆盖Object类中Card类的Object.equals(Object)方法,然后执行if(x.equals(y))而不是if(x == y) }

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html

这是一个复杂的过程,但基本上你会想要......

@Override
boolean equals(Object obj)
{
   if(this == obj) //Check if they're the same object
   return true;
   else if(!(obj instanceof Card)) //Check if it is not a Card
   return false
   else //Else...
   Card other = (Card) obj;
   /*Check if the variables are equal*/
}

答案 3 :(得分:0)

如果(x == y)仅在两个变量都指向同一个对象时才计算为真。

并且对于equals,你是否覆盖了equals方法?当你想要比较两个对象时,最好覆盖equals方法。

答案 4 :(得分:0)

默认情况下,equals()方法继承自超类。如果你的类没有扩展任何类,那么它是从Object类继承的,所以它看起来像

public boolean equals(Object obj) {
    return (this == obj);
}

所以现在它只检查你是否正在将你的对象与自身进行比较。在这种情况下,您需要覆盖此方法以检查您是否将对象与同一类(或派生类)的对象进行比较,比较比较对象的字段值。以下是此类实施的示例。

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null || !(obj instanceof YourClass))
        return false;

    YourClass other = (YourClass) obj;
    //if field1 is primitive type
    if (field1 != other.field1)
        return false;
    //if field2 is object type
    if (field2 == null || other.field2 != null)
        return false;
    else if (!field2.equals(other.field2))
        return false;
    //rest of fields
    return true;
}