Java中equals()方法的重写

简介: 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)));
  }
 }


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


相关文章
|
10天前
|
算法 Java Linux
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
这篇文章介绍了如何使用Java的Graphics2D类在图片上合成另一个照片,并将照片切割成圆形头像的方法。
21 1
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
|
4天前
|
Java Apache Maven
Java将word文档转换成pdf文件的方法?
【10月更文挑战第13天】Java将word文档转换成pdf文件的方法?
15 1
|
8天前
|
Java 编译器
Java“返回类型为 void 的方法不能返回一个值”解决
在 Java 中,如果一个方法的返回类型被声明为 void,那么该方法不应该包含返回值的语句。如果尝试从这样的方法中返回一个值,编译器将报错。解决办法是移除返回值语句或更改方法的返回类型。
|
8天前
|
Java
让星星⭐月亮告诉你,Java NIO之Buffer详解 属性capacity/position/limit/mark 方法put(X)/get()/flip()/compact()/clear()
这段代码演示了Java NIO中`ByteBuffer`的基本操作,包括分配、写入、翻转、读取、压缩和清空缓冲区。通过示例展示了`position`、`limit`和`mark`属性的变化过程,帮助理解缓冲区的工作原理。
17 2
|
8天前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
14 1
|
8天前
|
Java
让星星⭐月亮告诉你,Java synchronized(*.class) synchronized 方法 synchronized(this)分析
本文通过Java代码示例,介绍了`synchronized`关键字在类和实例方法上的使用。总结了三种情况:1) 类级别的锁,多个实例对象在同一时刻只能有一个获取锁;2) 实例方法级别的锁,多个实例对象可以同时执行;3) 同一实例对象的多个线程,同一时刻只能有一个线程执行同步方法。
9 1
|
10天前
|
存储 算法 Java
java制作海报六:Graphics2D的RenderingHints方法参数详解,包括解决文字不清晰,抗锯齿问题
这篇文章是关于如何在Java中使用Graphics2D的RenderingHints方法来提高海报制作的图像质量和文字清晰度,包括抗锯齿和解决文字不清晰问题的技术详解。
17 0
java制作海报六:Graphics2D的RenderingHints方法参数详解,包括解决文字不清晰,抗锯齿问题
|
1月前
|
Java 编译器 数据安全/隐私保护
Java 重写(Override)与重载(Overload)详解
在 Java 中,重写(Override)和重载(Overload)是两个容易混淆但功能和实现方式明显不同的重要概念。重写是在子类中重新定义父类已有的方法,实现多态;重载是在同一类中定义多个同名但参数不同的方法,提供多种调用方式。重写要求方法签名相同且返回类型一致或为父类子类关系,而重载则关注方法参数的差异。理解两者的区别有助于更好地设计类和方法。
|
2月前
|
Java
【Java基础面试十八】、说一说重写与重载的区别
这篇文章阐述了Java中重写与重载的区别:重载是同一个类中方法名相同但参数列表不同的方法之间的关系,而重写是子类中方法与父类中相同方法名和参数列表的方法之间的关系,且子类的返回值应小于等于父类,访问修饰符应大于等于父类。
【Java基础面试十八】、说一说重写与重载的区别
|
4月前
|
Java 编译器
在 Java 中,重写(Override)和重载(Overload)是两种不同的概念,用于实现多态性。它们有着不同的作用和使用场景。
在 Java 中,重写(Override)和重载(Overload)是两种不同的概念,用于实现多态性。它们有着不同的作用和使用场景。