Logo

郎哥编程

对象的比较

2019-12-13 971

在实际编程中,有时需要比较两个对象是否相等,如比较两个字符串对象。

比较两个对象是否相等,可以使用“==”运算符和对象的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指向同一个对象的引用,因此比较结果是相同的。

程序执行结果如下图所示:

image.png      

                                       

使用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】按钮即可。

image.png

在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的成员变量值不相等,比较结果是不相同。

程序执行结果如下图所示:

image.png


代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论