重寫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);
    }
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM