【JAVA零基础入门系列】Day15 对象的比较
【JAVA零基础入门系列】(已完结)导航目录
- Day1 开发环境搭建
- Day2 Java集成开发环境IDEA
- Day3 Java基本数据类型
- Day4 变量与常量
- Day5 Java中的运算符
- Day6 Java字符串
- Day7 Java输入与输出
- Day8 Java的控制流程
- Day9 Java中的那个大数值
- Day10 Java中的数组
- Day11 Java中的类和对象
- Day12 Java类的简单应用
- Day13 Java类的继承与多态
- Day14 Java对象的克隆
- Day15 对象的比较
最近一直有事,博客也停笔了一段时间,十分抱歉。
这一篇主要讲讲对象的比较,什么是对象的比较,我们知道两个数值类型只需要用“==”符号即可进行相等判断,但如果是两个Goods对象呢?如何进行比较?这时候,我们的equals方法就派上用场了。equals方法是类的祖先Object类的另一个protected方法,既然是protected方法(能被同一个包里的所有类所访问, 能被该类的子类所访问,子类可以和父类不在一个包中),子类是可以直接访问的,但如果没有覆盖该方法,那么使用的只是Object的原始比较方法,return(this==obj) ,仅仅比较两个对象的地址是否一致。
对于String类型,已经设计好了equals方法,所以我们只需要拿来用就可以了,如果是我们自定义的类,那就得重写该方法来进行覆盖,下面还是用Goods类来举一个小栗子:
public class Goods {
private String title;
private double price;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
//构造器
public Goods(String title, double price) {
this.title = title;
this.price = price;
}
}
这是简化版的Goods类,有两个私有成员变量以及它们的设置器,访问器,还有一个构造器,下面我们来重写父类的equals方法,判断两个Goods是否相等,逻辑上,我们只需要两者标题和价格一致即可认为两个商品是相等的(当然可以根据实际情况进行调整),下面我们来设计一下equals方法:
/**
* @author Frank
* @create 2017/11/20
* @description 被测试类,测试equals方法
*/
public class Goods {
private String title;
private double price; public String getTitle() {
return title;
} public void setTitle(String title) {
this.title = title;
} public double getPrice() {
return price;
} public void setPrice(double price) {
this.price = price;
} //构造器
public Goods(String title, double price) {
this.title = title;
this.price = price;
} //覆盖equals方法
@Override
public boolean equals(Object obj) {
Goods tmp = (Goods) obj;
if (price == tmp.getPrice() && title.equals(tmp.getTitle())){
return true;
}else {
return false;
}
}
}
这里我们覆盖了父类的equals方法,在equals方法中将obj强制类型转换为Goods类,再比较两者价格和标题是否相等,只要都相等,则返回true,否则返回false,这也符合我们的需求,下面测试一下:
/**
* @author Frank
* @create 2017/11/20
* @description 测试类,用于测试equals方法
*/
public class Test {
public static void main(String[] args) {
Goods a = new Goods("Java",100);
Goods b = new Goods("C++",100);
Goods c = new Goods("Java",100);
System.out.println(a.equals(b));
System.out.println(a.equals(c));
}
}
输出结果为:false ture
这样我们就简单的实现了equals方法,但是,这个equals方法并不完美,首先,由于我们传入的是Object对象,所以并不知道它原本的类型是否为Goods类型,如果不是Goods类型,当然不能拿来比较,于是我们得先进行一下类型判断:
@Override
public boolean equals(Object obj) {//类型判断
if (obj.getClass() != this.getClass()){
return false;
}else {
Goods tmp = (Goods) obj;
if (price == tmp.getPrice() && title.equals(tmp.getTitle())){
return true;
}else {
return false;
}
}
}
仍旧不完美,如果比较的对象就是自身或者两者指向同一个对象的话,直接返回true即可:
@Override
public boolean equals(Object obj) {
//先检测是否为自比较
if ( this == obj || obj == null){
return true;
}
//类型判断
if (obj.getClass() != this.getClass()){
return false;
}else {
Goods tmp = (Goods) obj;
if (price == tmp.getPrice() && title.equals(tmp.getTitle())){
return true;
}else {
return false;
}
}
}
现在就好很多了,那么此时我们调用equals方法跟使用”==“比较符号有什么区别呢,来看一个栗子:
public class Test {
public static void main(String[] args) {
Goods a = new Goods("Java",100);
Goods b = new Goods("C++",100);
Goods c = new Goods("Java",100);
Goods d = a;
System.out.println(a.equals(b));
System.out.println(a.equals(c));
System.out.println(a.equals(d));
System.out.println(a==b);
System.out.println(a==c);
System.out.println(a==d);
}
}
输出如下:
false
true
true
false
false
true
对于前三个输出应该没什么问题,主要看后三个,这里用相等比较符时,判断的仅仅是两个变量存储的内容是否一致,由于a、b、c、d均为引用类型,所以比较的仅仅是它们是否指向相同的对象,这里只有a跟d指向的是相同的对象,c虽然title和price都与a相同,但是跟a是两个完全不同的对象,因此没有返回的是false。
另外,有人也许会问,做类型判断的时候,为什么不用instanceof或者isInstance方法,这里简单说明一下原因。instance判断的是a对象是否和b对象属于同一个类,或者有同一个父类,或者实现了同一个接口。isinstance方法则判断两种类型是否可以进行强转。
由于这个小栗子并没有相关上下文,所以还是直接用getClass方法进行判断比较稳妥,当然,以后可以根据具体实际情况进行修改。
至此,equals方法讲解完毕,很简单吧。之后还是会继续更新的,欢迎大家继续关注!
【JAVA零基础入门系列】Day15 对象的比较的更多相关文章
- 【JAVA零基础入门系列】Day11 Java中的类和对象
今天要说的是Java中两个非常重要的概念--类和对象. 什么是类,什么又是对象呢?类是对特定集合的概括描述,比如,人,这个类,外观特征上,有名字,有年龄,能说话,能吃饭等等,这是我们作为人类的相同特征 ...
- 【JAVA零基础入门系列】Day14 Java对象的克隆
今天要介绍一个概念,对象的克隆.本篇有一定难度,请先做好心理准备.看不懂的话可以多看两遍,还是不懂的话,可以在下方留言,我会看情况进行修改和补充. 克隆,自然就是将对象重新复制一份,那为什么要用克隆呢 ...
- 【JAVA零基础入门系列】Day2 Java集成开发环境IDEA
开发环境搭建好之后,还需要一个集成开发环境也就是IDE来进行编程.这里推荐的IDE是IDEA,那个老掉牙的Eclipse还是先放一边吧,(手动滑稽). IDEA的下载地址:http://www.jet ...
- 【JAVA零基础入门系列】Day4 变量与常量
这一篇主要讲解Java中的变量,什么是变量,变量的作用以及如何声明,使用变量. 那么什么是变量?对于初学者而言,可以将变量理解为盒子,这些盒子可以用来存放数据,不同类型的数据需要放在对应类型的盒子里. ...
- 【JAVA零基础入门系列】Day5 Java中的运算符
运算符,顾名思义就是用于运算的符号,比如最简单的+-*/,这些运算符可以用来进行数学运算,举个最简单的栗子: 已知长方形的长为3cm,高为4cm,求长方形的面积. 好,我们先新建一个项目,命名为Rec ...
- 【JAVA零基础入门系列】Day6 Java字符串
字符串,是我们最常用的类型,每个用双引号来表示的串都是一个字符串.Java中的字符串是一个预定义的类,跟C++ 一样叫String,而不是Char数组.至于什么叫做类,暂时不做过多介绍,在之后的篇章中 ...
- 【JAVA零基础入门系列】Day8 Java的控制流程
什么是控制流程?简单来说就是控制程序运行逻辑的,因为程序一般而言不会直接一步运行到底,而是需要加上一些判断,一些循环等等.举个栗子,就好比你准备出门买个苹果,把这个过程当成程序的话,可能需要先判断一下 ...
- 【JAVA零基础入门系列】Day9 Java中的那个大数值
什么是大数值?用脚趾头想也知道,当然是"大"的数值(233).Java中有两个用于表示大数值的类,BigInteger和BigDecimal,那到底能表示多大的数值呢?理论上,可以 ...
- 【JAVA零基础入门系列】Day10 Java中的数组
什么是数组?顾名思义,就是数据的组合,把一些相同类型的数放到一组里去. 那为什么要用数组呢?比如需要统计全班同学的成绩的时候,如果给班上50个同学的成绩信息都命名一个变量进行存储,显然不方便,而且在做 ...
随机推荐
- jquery系列教程1-选择器全解
全栈工程师开发手册 (作者:栾鹏) 快捷链接: jquery系列教程1-选择器全解 jquery系列教程2-style样式操作全解 jquery系列教程3-DOM操作全解 jquery系列教程4-事件 ...
- Python和SQL Server 2017的强大功能
Python和SQL Server 2017的强大功能 摘要: 源:https://www.red-gate.com/simple-talk/sql/sql-development/power-pyt ...
- java 静态代码块 代码块 构造函数 静态成员变量 成员变量的初始化顺序
没有父类的情况 1,静态代码块-->静态成员变量-->成员变量(实例属性)-->代码块-->构造函数 2, 静态代码块 和 静态成员变量 只会初始化一次 有父类的情况 1,父类 ...
- 关闭eclipse自动弹出console的功能
当启动项目后,console有值时就会弹出,挺烦人的,可以如下修改
- 2017值得一瞥的JavaScript相关技术趋势
2017值得一瞥的JavaScript相关技术趋势从属于笔者的Web 前端入门与工程实践,推荐阅读2016-我的前端之路:工具化与工程化获得更多关于2016年前端总结.本文主要内容翻译自,笔者对于每个 ...
- layim+signalr2.0在线轻聊版解决方案
本内容有版权限制,仅提供学习交流参考等等,请勿随便转载或者代码商用. /** layui-v2.1.5 MIT License By http://www.layui.com */; layu ...
- vim中SnipMate 和 YouCompleteMe 插件触发键 tab 冲突
花了好几天废了九牛二虎之力终于在win下把ycm插件装上了 然而在配置插件的时候发现snipmate插件与youcompleteme插件会发生tab键冲突 而ycm比较调,直接使snipmate插件完 ...
- UVa10129,Play On Words
给出n个单词,如果一个单词的尾和另一个单词的头字符相等,那么可以相连,问这n个单词是否可以排成一列.欧拉路应用,构图:一个单词的头尾字母分别作为顶点,每输入一个word,该word的头指向word的尾 ...
- Iozone
参考地址:iozone使用技巧.iozone和Fio安装测试说明 iozone介绍 iozone(www.iozone.org)是一个文件系统的benchmark工具,可以测试不同的操作系统中文件系统 ...
- JAVA基础知识总结:六
一.不定长参数 1.语法:数据类型... 变量名称 使用注意事项:a.不定长参数就相当于是一个数组 b.不定长参数只能出现在参数列表的最后面 c.一个函数的参数列表中只能出现一次不定长参数 d.对于不 ...