重写Object类中的equals方法

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

 1 public class Student {
 2     //姓名、学号、年纪
 3     private String name;
 4     private int sid;
 5     private int age;
 6     
 7     //定义构造方法,给对象初始化
 8     public Student(){
 9         
10     }
11     public Student(String name,int sid,int age){
12         this.name=name;
13         this.sid=sid;
14         this.age=age;
15     }
16     
17     public String getName() {
18         return name;
19     }
20     public void setName(String name) {
21         this.name = name;
22     }
23     public int getSid() {
24         return sid;
25     }
26     public void setSid(int sid) {
27         this.sid = sid;
28     }
29     public int getAge() {
30         return age;
31     }
32     public void setAge(int age) {
33         this.age = age;
34     }
35

测试类:

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

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

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

这里有一个知识点:instanceof

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

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

 1 package com.cn.reequlas;
 2 
 3 public class Student {
 4     //姓名、学号、年纪
 5     private String name;
 6     private int sid;
 7     private int age;
 8     
 9     //定义构造方法,给对象初始化
10     public Student(){
11         
12     }
13     public Student(String name,int sid,int age){
14         this.name=name;
15         this.sid=sid;
16         this.age=age;
17     }
18     
19     public String getName() {
20         return name;
21     }
22     public void setName(String name) {
23         this.name = name;
24     }
25     public int getSid() {
26         return sid;
27     }
28     public void setSid(int sid) {
29         this.sid = sid;
30     }
31     public int getAge() {
32         return age;
33     }
34     public void setAge(int age) {
35         this.age = age;
36     }
37     //重写equlas方法,判断姓名、学号相等,就是同一个学生
38     //obj是给我们的一个学生对像
39     //this是我们自己的学生对像equals
40     
41     public boolean equals(Object obj){
42         boolean flag=false;
43         //判断对像是否相同,基本是不可能的
44         if(obj==this){
45             flag=true;
46         }
47         //
48         if(!(obj instanceof Student)){
49             flag=false;
50         }else{
51             Student stu=(Student)obj;
52             if(stu.name.equals(this.name) && stu.sid==this.sid){
53                 flag=true;
54             }
55         }
56         System.out.println(flag);
57         return flag;
58     }
59 }

测试类不变,输出结果就是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);
    }
    
}