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


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


相关文章
|
12天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
53 4
|
23天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
43 17
|
16天前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
32 2
|
24天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
19 3
|
24天前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
16 2
|
24天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
16 1
|
18天前
|
Java Spring
JAVA获取重定向地址URL的两种方法
【10月更文挑战第17天】本文介绍了两种在Java中获取HTTP响应头中的Location字段的方法:一种是使用HttpURLConnection,另一种是使用Spring的RestTemplate。通过设置连接超时和禁用自动重定向,确保请求按预期执行。此外,还提供了一个自定义的`NoRedirectSimpleClientHttpRequestFactory`类,用于禁用RestTemplate的自动重定向功能。
|
Java
JAVA方法的定义
JAVA方法的定义
85 0
|
5月前
|
安全 Java 编译器
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
41 1
|
6月前
|
存储 Java
Java数组与带参数方法:定义、调用及实践
Java数组与带参数方法:定义、调用及实践
71 1