【0】README

0.1) 本文章节【1】和【2】的内容转自 http://www.cnblogs.com/bluestorm/archive/2012/03/01/2376236.html ; 旨在区分重载与重写以及他们的相关概念;
0.2) 本文章节【3】的内容转自 http://blog.csdn.net/pacosonswjtu/article/details/49495977 的章节【2】, 但源代码为原创, 旨在给出 “编写一个完美的 equals 方法的建议” 的源代码实现;


【1】java重载

1.1) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载Overloading是一个类中多态性的一种表现。
1.2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。
1.3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。


【2】java重写

2.1) 父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。
2.2)若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
2.3)子类函数的访问修饰权限不能少于父类的;


【3】下面给出编写一个完美的 equals 方法的建议:

3.1)显式参数命名为 otherObject, 稍后需要将它转换为另一个叫做 other的变量;
3.2)检测this 与 otherObject 是否引用同一个对象:
if(this == otherObject) return true; 实际上, 这是一种经常采用的形式, 因为计算这个等式要比一个一个地比较类中的域所付出的代价小得多;
3.3)检测otherObject 是否为 null, 如果为 null ,则返回 false, 这项检测很有必要:
if(otherObject == null) return false;
3.4)比较this 与 otherObject 是否属于同一个类: 如果equals 的语义在每个子类中有所改变,就是用 getClass 进行检测:if(getClass() != otherObject.getClass()) return false;
3.5) 将 otherObject 转换为 相应的类类型变量:
ClassName other = (ClassName)otherObject;
3.6)现在开始对所有需要比较的域进行比较了:
使用 == 比较基本类型域, 使用 equals比较对象域, 如果所有的域都匹配返回 true, 否则返回 false;
return field1 == other.field1 && Objects.equals(field2, other.field2) && ……;
如果在子类中重新定义 equals, 就要在其中包含 调用 super.equals(other);
Hint)对于数组类型的域, 可以使用静态的Arrays.equals 方法检测相应的 数组元素是否相等;
Alert)看个荔枝(下面是实现 equals 方法的一种常见的错误,请结合上述内容对方法重写的定义来分析):

3.7)依据以上规则,重写equals方法(为什么最后对 salary 和 name的比较方法不同,这是朋友些应该要注意的)

package com.corejava.test;import java.util.Objects;public class Student
{private String name;private double salary;@Overridepublic boolean equals(Object otherObject){Student other;if(this == otherObject)//检测this 与 otherObject 是否引用同一个对象return true;else if(otherObject == null)//检测otherObject 是否为 null(很有必要 )return false;else if(getClass() != otherObject.getClass())//比较this 与 otherObject 是否属于同一个类return false;other = (Student)otherObject;//将 otherObject 转换为 相应的类类型变量return Objects.equals(name, other.name) //现在开始对所有需要比较的域进行比较&& salary == other.salary; }
}

java重载与重写的区别+重写父类equals方法的完美实现相关推荐

  1. 重写equals()时为什么也得重写hashCode()之深度解读equals方法与hashCode方法渊源

    重写equals()时为什么也得重写hashCode()之深度解读equals方法与hashCode方法渊源 在使用Map接口时,我们的愿望是当key1.equals(key2)时,它们获取的valu ...

  2. Overload重載和Override重写的区别。Overloaded的方法是否可以改变返回值的类型?

    Overload是重载的意思,Override是覆盖的意思,也就是重写. 重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同). 重写Ove ...

  3. java重载this_Java的this关键字的使用与方法的重载相关知识

    Java this关键字详解 this 关键字用来表示当前对象本身,或当前类的一个实例,通过 this 可以调用本对象的所有方法和属性.例如: public class Demo{ public in ...

  4. java 重载赋值_java中构造方法,set/get方法,方法重载使用解读

    给对象赋值的方法: 1.对于public修饰的属性,对象可以在外部直接调用. 定义一个类class Poker{ public String num; private String number; p ...

  5. java:为什么字符串比较时要用equals方法而不是==运算符

  6. Java中方法重载和方法重写的区别

    文章目录 1 Java中方法重载和方法重写的区别 1 Java中方法重载和方法重写的区别 主要区别如下: 方法重载: 在同一个类中 方法名相同 参数个数.顺序.类型不同 返回值类型.访问修饰符任意 方 ...

  7. java全栈系列之JavaSE-面向对象(方法重写)037

    子类在调用父类的私有方法中不能直接调用,但是可以通过get方法进行调用,修改属性的值可以通过set方法进行修改.而子类想要修改父类中的方法可以使用方法重写进行操作. 方法重写与之前的方法重载不同 回顾 ...

  8. 【Java基础】重写equals方法详讲

    一.重写equals方法 [Java比较学习]重写equals方法的安全写法 1.重写equals方法的两种方式 这里提供两个比较常见的equals重写方法: ● 用instanceof实现重写equ ...

  9. Java实验:重写equals方法

    (1)实验题目:实现一个名为Value 的类,其中含有一个字符类型的成员x 和双精度类型的成员y.请重写(override)其equals( )方法,使得用equals( )比较Value 类的两个对 ...

最新文章

  1. linux POSIX 信号集,读书笔记:第10章 Posix信号量 (6)
  2. 吃完降压药多久能睡觉 降压药什么时候吃好
  3. 产线数字化软件源码_数字化工厂规划的十大核心要素
  4. Windows常见宏的使用
  5. 软件包管理器(树链剖分)
  6. Windows10系统Python2.7通过Swig调用C++过程
  7. sqlserver2012——XML查询
  8. UCOSII学习笔记[开篇]
  9. Android Studio如何隐藏系统的状态栏
  10. Lecture 3:动态规划
  11. 分组的listview——ExpandableListView
  12. 记录repast4py环境配置
  13. C/C++编程笔记:C语言编程知识要点总结!大一C语言知识点(全)
  14. 工单流转 指派 php,第三节 工单的指派和处理
  15. 开源应用中心 | KodBox快捷高效的私有云在线文档管理系统
  16. 猫眼电影MySQL数据库怎么写_MySQL简要分析猫眼电影TOP100榜
  17. 3 Linux 10个主流发行版本
  18. echarts图表的自适应处理,包含同页面单个图表和多个图表两种情况
  19. 2022煤气上岗证题目及答案
  20. 网络状态码302和303的区别究竟是啥?面试官最满意这种回答

热门文章

  1. Intervals on the Ring
  2. Codeforces Round #721 (Div. 2)
  3. CF1534F:Falling Sand(tarjan、贪心、dp)
  4. YBTOJ洛谷P4869:出现位置(线性基)
  5. [2020.10.30NOIP模拟赛]字符串水题【SA,树状数组】
  6. nssl1469-W【dp】
  7. 【DP】小明在边塞(jzoj 2147)
  8. HiveSQL常用优化方法全面总结
  9. Hadoop生态Flume(二)安装配置
  10. 再有人问你volatile是什么,就把这篇文章发给他