对象比较

如果说现在有两个数字判断是否相等使用“==”,两个字符串判断是否相等使用“equals()”,如果现在有一个自定义的类,要想判断它的两个对象是否相等,那么必须要实现类对象之中所有属性内容的比较。

对象 = 数据集合,那么进行比较一定要依次比较所有的属性。

范例:基础的比较方式

class Book {
	private String title;
	private double price;

	public Book(String title, double price) {
		this.title = title;
		this.price = price;
	}

	public String getTitle() {
		return this.title;
	}

	public double getPrice() {
		return this.price;
	}
}

public class TestDemo {
	public static void main(String args[]) {
		Book b1 = new Book("Java开发", 79.5);
		Book b2 = new Book("Java开发", 89.5);
		if (b1.getTitle().equals(b2.getTitle()) && b1.getPrice() == b2.getPrice()) {
			System.out.println("是同一个对象");
		} else {
			System.out.println("不是同一个对象");
		}
	}
}

此时一个最基础的对象比较功能实现,以上按照要求进行了对象中属性内容的比较。

但是以上的程序里面存在有问题:

主方法(main)就是一个客户端,客户端的程序逻辑越简单越好,最好隐藏所有的细节逻辑。

如果要想进行信息比较,那么所有的具体比较细节必须有每个对象自己完成,对象所在的类一定要提供有对象比较的方法。

那么该如何定义这个方法呢?假如说这个方法名称暂时定义为compare()。

额外讲解:

如果说现在一个类的属性使用private封装了,那么在类的外部不能够通过对象直接调用属性。

但是如果说将一个对象传递回类的方法里面,那么就相当于取消了封装的形式,可以直接通过对象访问属性。

class Info {
	private String msg = "Hello";

	public void print() {
		System.out.println(msg);

	}

	// 本类接受本类对象
	public void fun(Info temp) {
		// 在类的内部直接利用对象访问私有属性
		temp.msg = "修改内容";
	}
}

public class Demo {
	public static void main(String args[]) {
		Info x = new Info();
		x.fun(x);// 没有意义,只是一个语法验证
		x.print();
	}
}

此类形式的代码会在对象比较中出现,但是也是一种常见形式,即:一个类可以接受本类对象。

范例:对象比较实现

class Book {
	private String title;
	private double price;

	public Book(String title, double price) {
		this.title = title;
		this.price = price;
	}

	// 本类接收本类对象,对象可以直接访问属性,不需要getter了
	// 两个功能,带回了需要比较的信息,方便访问
	public boolean compare(Book book) {
		if (book == null) {
			return false;// 没有必要进行具体判断
		}
		if (this == book) {// 内存地址相同
			return true;// 避免了进行具体细节的比较,节约时间
		}
		// 执行“b1.compare(b2)”代码时会有两个对象
		// 当前对象this(调用方法对象,就是b1引用)
		// 传递的对象book(引用传递,就是b2 引用)
		if (this.title.equals(book.title) && this.price == book.price) {
			return true;
		} else {
			return false;
		}
	}

	public String getTitle() {
		return this.title;
	}

	public double getPrice() {
		return this.price;
	}
}

public class TestDemo {
	public static void main(String args[]) {
		Book b1 = new Book("Java开发", 79.5);
		Book b2 = new Book("Java开发", 89.5);
		if (b1.compare(null)) {
			System.out.println("是同一个对象");
		} else {
			System.out.println("不是同一个对象");
		}
	}
}

对象比较的操作代码形式都是固定的,都会按照固定的步骤进行同一对象的验证,并且在对象比较里面也可以发现this表示当前对象出现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值