重写Object类中的equals方法

时间:2023-01-05 21:16:02

Object是所有类的父亲,这个类有很多方法,我们都可以直接调用,但有些方法并不适合,例如下面的student类

 public class Student {
//姓名、学号、年纪
private String name;
private int sid;
private int age; //定义构造方法,给对象初始化
public Student(){ }
public Student(String name,int sid,int age){
this.name=name;
this.sid=sid;
this.age=age;
} public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

测试类:

 package com.cn.reequlas;
//equals是比较2个对象是否相等,因为stu1和stu2是2个对像,在内在中是存了2个地址,所以不相同,找的是内存地址、
public class TestStudent {
public static void main(String[] args) {
Student stu1=new Student("张三",1,1);
Student stu2=new Student("张三",1,1);
boolean flag=stu1.equals(stu2);
System.out.println(flag);
} }

因为对于Object类中的equals方法来讲,它是用来对比,2个对像的在内存中的地址是否相同,很显然,stu1 new了一个新地址,stu2也new了一个新地址,当然不同

而实际应用中,2个学生都叫张三,学号都一样,因为学号是唯一的,所以他俩就是同一个人来着。那么我们就得重写equals方法,当name和学号一样的时候,就是相同的一个对像咯

这里有一个知识点:instanceof

//instanceof是指obj对像属于Student
if(!(obj instanceof Student))

添加重写后的equals方法如下:

 package com.cn.reequlas;

 public class Student {
//姓名、学号、年纪
private String name;
private int sid;
private int age; //定义构造方法,给对象初始化
public Student(){ }
public Student(String name,int sid,int age){
this.name=name;
this.sid=sid;
this.age=age;
} public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//重写equlas方法,判断姓名、学号相等,就是同一个学生
//obj是给我们的一个学生对像
//this是我们自己的学生对像equals public boolean equals(Object obj){
boolean flag=false;
//判断对像是否相同,基本是不可能的
if(obj==this){
flag=true;
}
//
if(!(obj instanceof Student)){
flag=false;
}else{
Student stu=(Student)obj;
if(stu.name.equals(this.name) && stu.sid==this.sid){
flag=true;
}
}
System.out.println(flag);
return flag;
}
}

测试类不变,输出结果就是true

package com.cn.reequlas;
//equals是比较2个对象是否相等,因为stu1和stu2是2个对像,在内在中是存了2个地址,所以不相同,找的是内存地址、
public class TestStudent {
public static void main(String[] args) {
Student stu1=new Student("张三",1,1);
Student stu2=new Student("张三",1,1);
/*Pet pet=new Pet("张三",1,1);*/
//使用重写后的equlas方法,第1个if里面,判断对像是否相同,这个(stu1)就是是obj,stu1是this
/*boolean flag1=stu1.equals(stu1);
System.out.println(flag1);
*/
//验证Student类中重写object方法的第2个if,不是同等类型
/*boolean flag2=stu1.equals(pet);
System.out.println(flag2);*/
//验证Student类中重写object方法的第2个if中的else
/*boolean flag4=stu1.getName().equals(stu2.getName());
System.out.println(flag4); boolean flag5=stu1.getSid()==(stu2.getSid());
System.out.println(flag5);*/ boolean flag=stu1.equals(stu2);
System.out.println(flag);
} }