问题
Java程序中测试两个变量是否相等有两种方式:一种是利用==运算符,另一种是利用equals。
当使用==比较两个引用变量时,它们必须指向同一个对象,==判断才会返回true。
equals方法是Object类提供的一个实例方法,因此所有引用变量都可以调用该方法来判断是否与其它引用变量相等。但使用这个方法判断两个对象相等的标准与使用==运算符没有区别,同样要求两个引用变量指向同一个对象才会返回true。因此这个Object类提供的equals方法没有太大的实际意义,如果希望采用自定义的相等标准,则可以采用重写equals方法。
本案例要求在Cell类中重写equals方法,两个Cell引用变量相等的条件是行行相等,列列相等。
方案
首先,在上一案例的基础上,在Cell类中覆盖equals方法,两个Cell引用变量相等的条件是行行相等,列列相等
然后,测试equals方法是否覆盖生效。首先,在类TestCell中添加测试方法testEquals,然后,创建cell1对象和cell2对象,代码如下:
Cell cell1=new Cell(6,3);
Cell cell2=new Cell(6,3);
最后分别使用==和equals比较cell1对象和cell2对象是否相等。
步骤
实现此案例需要按照如下步骤进行。
步骤一:在Cell类中覆盖equals方法
在上一案例的基础上,在Cell类中覆盖equals方法,两个Cell引用变量调用equals方法返回ture的条件是行行相等,列列相等,代码如下所示:
package day02;
public class Cell{
int row;
int col;
public Cell(int row,int col){
this.row=row;
this.col=col;
}
public Cell(){
this(0,0);
}
public Cell(Cell cell){
this(cell.row,cell.col);
}
public void drop(){
row++;
}
public void moveRight(){
col++;
}
public void moveLeft(){
col--;
}
@Override
public String toString(){
return row+","+col;
}
@Override
public boolean equals(Object obj){
if(obj==null){
return false;
}
if(this==obj){
return true;
}
if(obj instanceof Cell){
Cell cell=(Cell)obj;
return cell.row==row&&cell.col==col;
}else{
return false;
}
}
}
步骤二:测试equals方法是否生效
测试equals方法是否覆盖生效。首先,在类TestCell中添加测试方法testEquals,然后,创建cell1对象和cell2对象;最后分别使用==和equals比较cell1对象和cell2对象是否相等,代码如下所示:
package day02;
import org.junit.Test;
public class TestCell{
/**
*测试equals方法
*/
@Test
public void testEquals(){
Cell cell1=new Cell(6,3);
Cell cell2=new Cell(6,3);
System.out.println(cell1==cell2);//false
System.out.println(cell1.equals(cell2));//true
}
}
步骤三:运行
运行testEquals方法,控制台输出结果如下所示:
false true
从运行结果可以看出,使用==比较的结果为false、使用equals比较的结果为true,说明Cell类成功覆盖了equals方法,实现了行行相等并且列列相等两个Cell的引用变量则相等。