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
。equals()
方法中不能为null
或指向null的对象
,而在调用compare
方法时有可能会出现对象是null的情况,因此应该加上对null的判断(对象为null
时直接返回false
),防止对象null时还会调用equals()的情况。对象比较是一个类本身所具备的功能,比较时最核心的问题:比较地址、判断是否为空、判断各个属性。
阿里云【名师课堂】Java面向对象开发39:【第02个代码模型】综合案例:对象比较
原文:https://www.cnblogs.com/playerone/p/13085216.html