阿里云【名师课堂】Java面向对象开发39:【第02个代码模型】综合案例:对象比较

阿里云【名师课堂】Java面向对象开发39:【第02个代码模型】综合案例:对象比较


确定两个对象是否相等,比较的应该是对象的完整信息,而对象的完整信息就是对象的所有属性。因此对象比较就是对两个对象的属性进行比较。

实现形式一

class Person{
	private String name ;
	private int age ;
	
	public Person() {};
	public Person(String name,int age){
		this.name = name ;
		this.age = age ;
	}
	
	public String getName(){
		return this.name ;
	}
	public int getAge(){
		return this.age ;
	}
}

public class TestDemo {
	public static void main(String args[]) {
		Person per1 = new Person("Dexter",20) ;
		Person per2 = new Person("Dexter",20) ;
		System.out.println(per1 == per2) ;  // 比较的是两个对象的内存地址空间,显然是不同的
		
		// 根据对象所拥有的完整信息来进行比较
		// 注意观察:getName的返回值是String,getAge的返回值是int
		if(per1.getName().equals(per2.getName()) && per1.getAge() == per2.getAge()) {
			System.out.println("两个对象相等") ;
		} else {
			System.out.println("两个对象不相等") ;
		}
	}
}

在这里插入图片描述
虽然这段程序可以实现比较功能,但是实际上并不会这么做,因为客户端(主方法、调用处)涉及到的逻辑太多,对象比较操作应该是一个类本身所具有的功能,而不应该变为外部的操作。

实现形式二

class Person{
	private String name ;
	private int age ;
	
	public Person() {};
	public Person(String name,int age){
		this.name = name ;
		this.age = age ;
	}
	
	// 这时会有两个对象:this表示的当前对象,调用comapre()方法时传入的要比较的对象
	public boolean compare(Person per){
		// 传入的对象per在类内部中,不受private封装限制。可以直接使用”对象.属性“进行访问
		if(per == this) {
			return true ;
		}
		if(per == null) {
			return false ;
		}
		if(this.name.equals(per.name) && this.age == per.age) {
			return true ;
		}
		return false ;
	}
	public String getName(){
		return this.name ;
	}
	public int getAge(){
		return this.age ;
	}
}

public class TestDemo {
	public static void main(String args[]) {
		Person per1 = new Person("Dexter",20) ;
		Person per2 = new Person("Dexter",20) ;
		
		if(per1.compare(per2)) {
			System.out.println("两个对象相等") ;
		} else {
			System.out.println("两个对象不相等") ;
		}
		/*
		if(per1.compare(per1)) {
			System.out.println("两个对象相等") ;
		} else {
			System.out.println("两个对象不相等") ;
		}
		
		if(per1.compare(null)) {
			System.out.println("两个对象相等") ;
		} else {
			System.out.println("两个对象不相等") ;
		}
		*/
	}
}
  • 注意:
    • 在调用compare方法时有可能会出现自己与自己比较(per == this)的情况,而结果显然是真,直接返回true
    • 通过之前的学习(请回顾《阿里云【名师课堂】Java面向对象开发21 ~ 25:String类的基本特点》的22、23部分https://blog.csdn.net/weixin_43624945/article/details/106622718)我们知道,equals()方法中不能为null指向null的对象,而在调用compare方法时有可能会出现对象是null的情况,因此应该加上对null的判断(对象为null时直接返回false),防止对象null时还会调用equals()的情况。

总结

对象比较是一个类本身所具备的功能,比较时最核心的问题:比较地址、判断是否为空、判断各个属性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值