阿里云【名师课堂】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()的情况。
- 在调用
总结
对象比较是一个类本身所具备的功能,比较时最核心的问题:比较地址、判断是否为空、判断各个属性。
目前还是不适应博客园的界面,等学成了再回归吧,对我来说当下还是csdn比较方便快捷:https://blog.csdn.net/weixin_43624945