如果说现在有两个数字判断是否相等使用“==”,两个字符串判断是否相等使用“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表示当前对象出现。