Java中equals()方法的重写

equals

我们知道equals()方法是定义在Object类中的,在没有被覆写时该方法与运算符==的作用是一样的。因为在 Object 类中equals()直接使用= =来实现。
值得注意的是 == 比较时用的是正真的地址。
那是不是我们要用时都需要覆写呢?其实也不是这样的,在一些标准类库中有的已经覆写好了可以直接使用,常见的有 file , integer , data , String类。

下面我们一起来学习吧!

public  boolean equals(Object obj)

指示其他某个对象是否与此对象“相等”。
equals 方法在非空对象引用上实现相等关系:

· 自反性:对于任何非空引用值
x,x.equals(x) 都应返回 true。

· 对称性:对于任何非空引用值
x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。

· 传递性:对于任何非空引用值
x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。

· 一致性:对于任何非空引用值
x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。

· 对于任何非空引用值 x,x.equals(null) 都应返回 false。

Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。

注意:当此方法被重写时,通常有必要重写
hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

参数:

obj

  • 要与之比较的引用对象。

返回:

如果此对象与 obj 参数相同,则返回 true;否则返回 false。

此处只是为了实现equals方法的重写,就不对hashcode方法的重写。
那怎样实现呢?
Students类

 
 
 package it.itcost;
 
 public class Students {
 
  //学生的姓名
  private String name;
  
  //学生的学号
  private int id;
  
  //学生的成绩
  private double grade;
  
  Students(String name,int id,double grade){//三个参数的构造函数,用于给属性初始化
   
   this.name = name;
   this.id = id;
   this.grade = grade;
   
  }
  
  //重写object的equals方法
  //形参用object类型,有利于在继承了同一个父类的子类对象可以使用该方法
  public boolean equals(Object obj){//显示参数名为obj
   
   //检测this与obj是否引用同一个对象
   if(this == obj)
    return true;
   
   //检测odj是否为null,如果为空则返回false
   if(obj == null)
    return false;
   
   //比较this与odj是否属于同一个类如果equals的语义在每一个类中有所改变,就使用getClass检测
   if(this.getClass().getName() != obj.getClass().getName())
    return false;
   
 //  //如果所有的子类都有统一的语义,就使用instanceof检测
 //  //instanceof是Java中的二元运算符,左边是对象,右边是类;当对象是右边类或子类所创建对象时,返回true;否则,返回false。
 //  if(!(obj instanceof Students))
 //   return false;
   
   
   //通过以上的判断我们知道了Students的对象以及传给obj的对象不为null
   
   //对obj向下造型
   Students other = (Students)obj;
   
   //测试对象的各属性的值是否相等
   return name.equals(other.name)  //name是String类型是引用类型并且覆写了equals方法,可以通过调用String类的equals来比较
     &&this.id==other.id  //id是基本类型直接使用==比较值是否相等
     &&this.grade==other.grade;  //grade是基本类型直接使用==比较值是否相等
  
  }
 
   
 }

下面是测试代码

 package it.itcost;

 public class StudentsTest {
 
  public static void main(String[] args) {
   
   
   Students Stu0 = new Students("柒间",20182206,90.00);
   Students Stu1 = new Students("柒间",20182206,90.00);
 
   Students Stu = new Students("Tom",20180000,80.00);
   
   //Stu1---Stu0
   System.out.println((Stu1.equals(Stu0)));
   
   //Stu---Stu0
   System.out.println((Stu.equals(Stu0)));
  }
 
 }

上面代码自己手写的如有改进的地方欢迎留言一起学习!

发布了32 篇原创文章 · 获赞 24 · 访问量 5905

猜你喜欢

转载自blog.csdn.net/qq_43663493/article/details/103429316
今日推荐