1.前面讲过String类的equals()方法,此方法的主要功能是判断两个字符串的内容是否相等,现在要比较一个类的两个对象是否相等,要依次比较两个对象中的每一个属性的内容.
第一种对象比较形式
package lesson12;
class Deo{
private String name;
private int age;
public Deo(String name,int age){
this.name=name;
this.age=age;
}
void setName(String name){
this.name=name;
}
void setAge(int age){
this.age=age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
}
public class TestDeo6 {
public static void main(String[] args) {
Deo deo1=new Deo("芷若",20); //实例化对象
Deo deo2=new Deo("芷若",20); //实例化对象
if (deo1.getName().equals(deo2.getName()) && deo1.getAge()==deo2.getAge()){ //属性比较
System.out.println("是同一个对象");
}else{
System.out.println("不是同一个对象");
}
}
}
运行结果
虽然实现了两个对象比较,但是以上代码进行对象比较过程中采用了客户端来判断,不合适,这种比较操作应该是每一个对象自己应该具备的功能,由本类完成.
第二种对象比较形式
package lesson12;
class Deo{
private String name;
private int age;
public Deo(String name,int age){
this.name=name;
this.age=age;
}
//一个类可以接收本类引用,接收完成之后可以直接调用本类的私有操作
public boolean compare(Deo per){
if (per==null){ //比较对象为null
return false; //直接返回false
}
if (this==per){
return true; //地址相同
}
//这样一来compare()方法之中有两个对象,传入的Person,另一个是this
if (this.name.equals(per.name)&&this.age==per.age){
return true;
}
return false;
}
void setName(String name){
this.name=name;
}
void setAge(int age){
this.age=age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
}
public class TestDeo6 {
public static void main(String[] args) {
Deo deo1=new Deo("芷若",20); //实例化对象
Deo deo2=new Deo("芷若",20); //实例化对象
if (deo1.compare(deo2)){ //只关心比较结果
System.out.println("是同一个对象");
}else{
System.out.println("不是同一个对象");
}
}
}
运行结果
在Deo内部定义了一个compare()方法,而此时方法所完成的功能就是进行比较,并且当一个类接受了本类对象引用后,可以直接调用本类中的私有化操作.所以compare()方法就有了两个实例化对象,一个传入为Deo类对象,一个当前对象this.
对象比较的特点:
本类接收自己的引用,而后与本类当前对象(this)进行操作
为了避免NullPointerException的产生,首先增加一个null的判断
为了防止浪费性能的情况出现(要判断属性会多),可以增加地址数值的判断,因为相同的对象地址相同.
进行属性的依次比较,如果属性全部相同,则返回true,否则返回false.