f4.3 jmu-Java-03面向对象基础-覆盖与equals (6 分)
有Person
类,Company
类,Employee
类。
其中Employee
类继承自Person
类,属性为:
private Company company;
private double salary;
现在要求覆盖Employee类的equals
方法,判定两个Employee对象是否相等,请见如下判断方法:
-
其继承自父类Person的属性值都相等,其company属性对象equals返回true,且其salary也相等。
-
salary是double型,比较时,使用
DecimalFormat df = new DecimalFormat("#.##");
使salary保留两位小数,然后再进行比较。
注意:要考虑company为null的情况。
函数接口定义:
public boolean equals(Object obj)
输入样例:
输出样例:
false
true
false
true
false
true
false
题目分析
- 默认的
equals
函数的第一个比较:都要最先比较当前类和传入的类的引用是不是相同,就相当于是比较身份证,如果身份证号相同,直接默认这是同一个人。 - 接着几乎也是一个惯用的比较:需要先判断传入的类是否为空,若传入的类为空则直接返回false。
- 题目的要求有三个需要比较的类型:
- 首先是要比较父类的属性是否都相等,于是我们就用
super
调用父类的equals函数,直接比较两个类的父类。 - 然后是要比较company,并且要考虑company为空的情况,而company还分为本类的company,传入类的company,一共要讨论4种情况,其中,最首先是两者同时为null的情况,就默认这两者相同,直接返回浮点数的比较结果,要注意的是,当有一方为
null
的时候,我们就不能通过调用它的equals
函数来判断是否相等了,否则会报错应直接用==
;接下来是两者中有一个为null的情况,都直接返回false;再接着是两者都不为空的情况,那就调用equals
函数来比较两个company是否相等。 - 最后是要对浮点数进行比较,就按照题目的提示预先设置好浮点数的格式后,再按设定好的格式调用equals函数来比较即可。
- 首先是要比较父类的属性是否都相等,于是我们就用
我的代码:
public boolean equals(Object obj) {
//直接比较引用的地址码是否相同
if (this == obj) return true;
//判断传入的参数是否为null
if (obj == null) return false;
//判断父类的属性是否相同
if (!super.equals(obj)) return false;
//浮点数的比较和company为null的情况的辨析
DecimalFormat df = new DecimalFormat("#.##");
Employee other = (Employee) obj;
if (company == null && other.company == null)
return df.format(salary).equals(df.format(other.salary));
else if (company == null || other.company == null) return false;
return company.equals(other.company)
&& df.format(salary).equals(df.format(other.salary));
}