重写Object类中的equals方法
Posted 雪山非猪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重写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); } }
以上是关于重写Object类中的equals方法的主要内容,如果未能解决你的问题,请参考以下文章
字符串类中的Object的equals方法和自定义类中的Object的equal方法之间有什么区别
java 集合中重写hashCode方法和重写equals方法啥关系?