在定义一个对象的时候,会在内存中开辟一个空间来存放这个对象的信息,在我们System.out.println(此对象)就会发现所展示的是对象所在的地址,那么哪怕两个对象的所有属性方法都一样,用equals也直接比对不了,因为他们所在的地址不同。就好比一对双胞胎,长得完全一样,名字也一样。但他们是两个人。
可是在实际开发中,我们会遇到这种需要进行两个对象的比对问题,如果单独把每个对象的属性挑出来进行比对会造成大量的重复代码。所以我们可以进行equals代码的重写,使得equals方法适应开发环境。
方法的重写牵扯到java的三大特性之一:继承,即子类可以使用父类的方法。这时就有疑问,我没有使用继承也没有定义过父类,为什么会有继承特性呢?那是因为,即使不写父类代码,系统也会为你定义的类找一个父类(Object)来继承。而equals方法就是系统默认父类中的方法。
那么什么是重写?
答:当父类中某一个方法,满足不了子类的需求的时候,可以在子类中对父类的方法进行重新编写覆盖。
方法重写的原则
1、方法名必须与父类相同
2、参数列表必须与父类相同
3、返回值类型相同或者是其子类
4、访问权限相同或不能严于父类
现在有个需求:
需求 :给你一个班级某个学生(对象)的姓名,学号,年龄,要你确认这些信息和班级的某个学生是否为同一人?
name:姓名 , id:学号 ,age:年龄
如果采用分别对比,必然造成大量重复代码存在。
如果采用重写,那么只需要一个方法就能满足所有需求。
重写后equals的调用方式,和原来一样,只不过重写后的equals更能适应需求
public boolean equals(Object obj){
if(this == obj){
return true;
}
if(obj instanceof Student){
Student s = (Student) obj;
if(this.getName().equals(s.getName()) &&
this.getId()==s.getId() && this.getAge() == s.getAge()){
System.out.println("这是一个人");
return true;
}else{
System.out.println("这不是一个人");
return false;
}
}
return false;
}
Student a = new Student("张三",12,23);
Student b = new Student("张三",12,23);
Student c = new Student("李四",4,27);
System.out.println(a.equals(b));