在平时开发中,想要比较自定义类对象中的特定成员时,我们需要逐一手动比较,非常不方便。

举个栗子,我们有两个cafe对象,我们想比较两杯咖啡的价格是否一样,一般来说我们使用getter()来比较,但是这样写非常麻烦,

于是我们重写equals()方法。

现在我们有两个类:User()主类 、 Cafe()类。

Cafe()类:

public class Cafe {
private String name;//咖啡的名字
private int price;//咖啡的价格 public Cafe(String name, int price) {
this.name = name;
this.price = price;
} public String getName() {return name;}
public void setName(String name)
      {this.name = name;}
public int getPrice() {return price;}
public void setPrice(int price)
      {this.price = price;}
}

倘若我们不重写equals()方法,Cafe类:

 public class User{
public static void main(String[] aa) {
Cafe c1 = new Cafe("西达摩",33);
Cafe c2 = new Cafe("云南冰滴",33);
System.out.println(c1==c2);//输出false
System.out.println(c1.equals(c2));
//false 每一个类都继承自object类,所以有equals方法
Cafe c3 = c1;
System.out.println(c3.equals(c1));
//因为c3和c1指向同一块内存区域,所以输出true
}
}

输出 false false true

第五行中直接用==直接比较的时c1 c2的内存引用地址,我写的基础篇1中有说到,new出来在栈中的对象都是独一无二的,输出false

第六行的默认equals方法比较的是对象的内存地址,当然不同,输出false

第八行的c3被赋值了c1的内存地址,再用equals方法比较,显然内存地址相同,输出false

那么我们如何比较不同cafe咖啡对象的价格呢?

一个方法是使用c1.getPrice()函数。

另一个方法就是重写equals()函数。

步骤:

1、我们在Cafe类中重写equals()方法。

需要特别注意的是:虽然我们没有在Cafe类中定义equals()方法,但是Java规定所有的类都继承自Object类,equals()方法在Object类中。

重写后的Cafe类:

 1 public class Cafe {
2 private String name;//咖啡的名字
3 private int price;//咖啡的价格
4
5 public boolean equals(Cafe caf) {
6 return caf.getPrice() == this.getPrice();
7 }
8
9 public Cafe(String name, int price) {
10 this.name = name;
11 this.price = price;
12 }
13
14 public String getName() {return name;}
15 public void setName(String name) {this.name = name;}
16 public int getPrice() {return price;}
17 public void setPrice(int price) {this.price = price;}
18 }

5-7行即为重写equals方法。我们再运行起来,结果是false true true。

System.out.println(c1.equals(c2));

上面这一条语句中,equals方法被重写了

2、如何查看方法是否被重写

在IDE中按住CTRL键,鼠标点击想要查看的方法,跳转的位置即为调用的位置。

【java】学习路径16-重写Object方法(equals()等)的更多相关文章

  1. Java学习(API及Object类、String类、StringBuffer字符串缓冲区)

    一.JAVA的API及Object类 1.API 概念: Java 的API(API: Application(应用) Programming(程序) Interface(接口)) Java API就 ...

  2. [Guava源码分析]Objects 和 ComparisonChain:帮助重写Object方法

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3874194.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  3. Java学习路径及练手项目合集

    Java 在编程语言排行榜中一直位列前排,可知 Java 语言的受欢迎程度了. 实验楼上的[Java 学习路径]中将首先完成 Java基础.JDK.JDBC.正则表达式等基础实验,然后进阶到 J2SE ...

  4. 在java中为啥要重写toString 方法?

    在java中为啥要重写toString 方法?下面以一个简单的例子来说明. 先定义一个test5类.并写它的get,set方法. package test5; public class Test5 { ...

  5. Java学习路径(抛光砖)

    这就是我刚刚在五孔问答中找到的Java学习路线图抛光砖价格.我个人认为,这条Java学习路线是可以的.它是2018年相对较新的Java学习路线,更符合企业就业标准. Java学习路径的第一阶段:Jav ...

  6. 重写Object的equals方法和Objects的equals方法

    Object类的equals方法默认比较的是两个对象的地址值,没有意义 所以我们需要重写equals方法,比较两个对象的属性值(name,age等等): 对象的属性值一样返回true否则返回false ...

  7. 重写Object的equals方法

    Object的equals比较两个对象是否相同,没有重写时比较的是内存地址是否相同(==). 但我们有时候比较的是两个对象中的属性是否相同, 重写equals: package cn.sasa.dem ...

  8. JAVA学习(七):方法重载与方法重写、thiskeyword和superkeyword

    方法重载与方法重写.thiskeyword和superkeyword 1.方法重载 重载可以使具有同样名称但不同数目和类型參数的类传递给方法. 注: 一是重载方法的參数列表必须与被重载的方法不同,而且 ...

  9. Object方法equals、hashCode

    java知识背景: 1)hashCode()方法返回的是Jvm的32位地址 2)==比较的是对象在jvm中的地址 3)Object的equals()比较的就是jvm物理地址 4)比较2个对象使用equ ...

随机推荐

  1. junit 5 - Display Name 展示名称

    本文地址:https://www.cnblogs.com/hchengmx/p/14883563.html @DisplayName可以给 测试类 或者 测试方法来自定义显示的名称.可以支持 空格.特 ...

  2. Jmeter(五十三) - 从入门到精通高级篇 - 懒人教你在Linux系统中安装Jmeter(详解教程)

    1.简介 我们绝大多数使用的都是Windows操作系统,因此在Windows系统上安装JMeter已经成了家常便饭,而且安装也相对简单,但是服务器为了安全.灵活小巧,特别是前几年的勒索病毒,现在绝大多 ...

  3. html实现3d视觉特效

    <html> <head> <title>HTML5实现3D球效果</title> <style type="text/css" ...

  4. C++ 之多态总结

    前言 最近为了完成数据库系统的实验,又复习起了<C++ Primer>,上一次看这本巨著也是大二下的六月份,那时看面向对象程序编程这一章还云里雾里的,没有领会多态的奥妙,学完 Java 之 ...

  5. 【Redis】事件驱动框架源码分析

    aeEventLoop初始化 在server.c文件的initServer函数中,对aeEventLoop进行了初始化: 调用aeCreateEventLoop函数创建aeEventLoop结构体,对 ...

  6. Javaweb-pom文件

    pom.xml是maven的核心配置文件 <?xml version="1.0" encoding="UTF-8"?> <!--maven版本 ...

  7. 知道vue组件同级传值吗?

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Vue 3.0 有哪些新特性值得我们提前了解

    一.迎接 Vue 3.0 简介 ​ Vue.js 作者兼核心开发者尤雨溪宣布 Vue 3.0 进入 Beta 阶段. 已合并所有计划内的 RFC 已实现所有被合并的 RFC Vue CLI 现在通过 ...

  9. 017(Power Strings二刷)(KMP)

    题目:http://ybt.ssoier.cn:8088/problem_show.php?pid=1466 题目思路:不知道大家在KMP算法里有没有看见这么个句子 while(j<len) 这 ...

  10. FFT 学习笔记(自认为详细)

    引入 什么是 \(\text{FFT}\) ? 反正我看到 \(\text{wiki}\) 上是一堆奇怪的东西. 快速傅里叶变换(英语:Fast Fourier Transform, FFT),是快速 ...