在实际编程中,有时需要比较两个对象是否相等,如比较两个字符串对象。
比较两个对象是否相等,可以使用“==”运算符和对象的equals()方法。这两种方法在比较方式上是不同的。“==”运算符比较的两个对象的内存地址,equals()方法比较的是两个对象的内容。
String对象的比较在前面的课程已经讲过了,本课主要讲述自定义类的比较。
“==”运算符的比较。
“==”运算符主要是比较两个对象的内存地址是否相同。前面讲过实例化的对象变量存储的是对象的引用,使用“==”运算符可以比较两个对象变量存储的对象引用是否相同,如果这两个对象变量存储的对象引用相同,则说明它们指向同一个存储在堆中的对象,否则指向存储在堆中两个不同的对象。
案例1:实用“==”运算符比较两个对象是否相等。
在PBaseUnit14项目sample包下,创建Java类CompareObject。代码如下:
/**
* @Title: CompareObject.java
* @Package sample
* @Description: Java基础知识课程案例
* @author 编程训练营
* @date
* @version V1.0
*/
package sample;
/**
* @ClassName: CompareObject
* @Description: 对象(对象的比较)案例1
* @author 编程训练营
* @date
*
*/
public class CompareObject {
/**
* @Title: main
* @Description: Java程序入口main方法
* @param @param args 参数
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
// 创建Rectanle对象
Rectangle rect1 = new Rectangle();
Rectangle rect2 = new Rectangle();
Rectangle rect3 = rect1;
// 使用==运算符比较rect1和rect2
if( rect1 == rect2 )
{
System.out.println("rect1与rect2的内存地址相同");
}
else
{
System.out.println("rect1与rect2的内存地址不相同");
}
// 使用==运算符比较rect1和rect3
if( rect1 == rect3 )
{
System.out.println("rect1与rect3的内存地址相同");
}
else
{
System.out.println("rect1与rect3的内存地址不相同");
}
}
}CompareObject类结构分析
在CompareObject类的main()方法中,声明了三个Rectangle类型的变量,其中rect1和rect2存储了new运算符返回的对象应用,rect3存储了rect1的值。
使用“==”运算符比较rect1和rect2,因为rect1和rect2存储了不同对象的引用,因此比较结果是不相同的。
rect3和rect1指向同一个对象的引用,因此比较结果是相同的。
程序执行结果如下图所示:
使用equals()方法比较
equals()方法用于判断两个对象的内容是否相等。前面在判断String对象的内容是否相等时,使用了equals()方法。
equals()方法是Object类提供的方法,Object类是Java所有类(包括自定义类)的父类,所有的类都继承于Object类(关于类的继承内容将在Java 核心技术课程中讲述)。String类重写了Object类equals()方法,所以可以使用equals()方法来判断两个字符串对象的内容是否相等。
要实现两个自定义类实例化对象的内容比较,就需要在自定义类中重写Object类equals()方法,在equals()方法内判断两个对象的成员变量内容是否相等,如果这两个对象的成员变量内容相等,可以认为这两个对象的内容是相等的。
案例2:创建一个矩形类,重写Object类equals()方法。
在PBaseUnit14项目sample包下,创建Java类ExtendRectangle。代码如下:
/**
* @Title: ExtendRectangle.java
* @Package sample
* @Description: Java基础知识课程案例
* @author 编程训练营
* @date
* @version V1.0
*/
package sample;
/**
* @ClassName: ExtendRectangle
* @Description: 对象(对象的比较)案例2
* @author 编程训练营
* @date
*
*/
public class ExtendRectangle {
// 成员变量width
public int width;
// 成员变量height
public int height;
// 构造方法
public ExtendRectangle(int width,int height)
{
this.width = width;
this.height = height;
}
// 计算面积的成员方法
public int getArea() {
return width * height;
}
/**
* <p>Title: equals</p>
* <p>Description: </p>
* @param obj
* @return
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
// 比较两个对象的引用是否相等
if( this == obj )
return true;
// 判断obj是否是ExtendRectangle类的实例
if( !(obj instanceof ExtendRectangle) )
return false;
// 声明boolean变量,标记对象内容是否相等
boolean bEqual = true;
// obj强制转换为ExtendRectangle类型
ExtendRectangle rect = (ExtendRectangle)obj;
// 比较成员变量的值是否相等
if( this.width != rect.width )
bEqual = false;
if( this.height != rect.height )
bEqual = false;
return bEqual;
}
}ExtendRectangle类结构分析
ExtendRectangle类重写了Object类的equals()方法,equals()方法要求传入一个Object类型的实例化对象。
在equals()方法内,首先判断传入的对象引用obj和当前对象的引用是否相等,如果两个对象的引用相等,说明这两个对象是同一个对象,可以直接返回true。
instanceof是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例。如果测试对象是类的实例返回true,否则返回false。代码使用instanceof判断obj是否是ExtendRectangle的实例对象,主要是防止传入的obj不是一个合法的ExtendRectangle类的实例化对象。
传入的obj是Object类型,需要将obj强制转换为ExtendRectangle类型,才能访问ExtendRectangle类实例化对象的成员变量。
代码最后判断当前对象与obj对象的成员变量的值是否相等,如果不相等将局部变量bEqual设置为false。
如何在类代码中添加重写Object类的方法?
如果要在类代码中添加重写Object类的方法,可以让eclipse添加,具体方法如下:
(1)用鼠标选择要重写Object类方法的类,单击鼠标右键,在弹出的菜单项列表中选择【Source】菜单项;
(2)在弹出的【Source】子菜单项列表,选择【Override Implement Methods】菜单项;
(3)在弹出的对话框中(如下图所示),选择需要重写Object类的方法,单击【OK】按钮即可。

在PBaseUnit14项目sample包下,创建Java类EqualsObject。代码如下:
/**
* @Title: EqualsObject.java
* @Package sample
* @Description: Java基础知识课程案例
* @author 编程训练营
* @date
* @version V1.0
*/
package sample;
/**
* @ClassName: EqualsObject
* @Description: 对象(对象的比较)案例2
* @author 编程训练营
* @date
*
*/
public class EqualsObject {
/**
* @Title: main
* @Description: Java程序入口main方法
* @param @param args 参数
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
// 创建ExtendRectangle对象
ExtendRectangle rect1 = new ExtendRectangle(30,20);
ExtendRectangle rect2 = new ExtendRectangle(30,20);
ExtendRectangle rect3 = new ExtendRectangle(35,60);
// 比较rect1和rect2
if( rect1.equals(rect2) )
{
System.out.println("rect1与rect2相同");
}
else
{
System.out.println("rect1与rect2不相同");
}
// 比较rect1和rect3
if( rect1.equals(rect3) )
{
System.out.println("rect1与rect3相同");
}
else
{
System.out.println("rect1与rect3不相同");
}
}
}EqualsObject类结构分析
EqualsObject类的main()方法创建了三个ExtendRectangle对象,分别是rect1、rect2和rect3,然后rect1调用equals()方法分别与rect2和rect3比较:rect1和rect2的成员变量值相等,比较结果是相同;rect1和rect3的成员变量值不相等,比较结果是不相同。
程序执行结果如下图所示:
