[Java]PTA:(选做) jmu-Java-03面向对象基础-覆盖与equals
有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)
输入样例:
此题无输入样例。main方法中已经包含多种不同的测试情况,下面的输出就是这多种测试情况的输出。
输出样例:
false
true
false
true
false
true
false
代码如下:
public boolean equals(Object obj){if(this==obj)return true;if(obj==null||getClass()!=obj.getClass())return false;if(!super.equals(obj))return false;Employee employee=(Employee) obj;if(company==null&&employee.company!=null)return false;if(company!=null&&!company.equals(employee.company))return false;DecimalFormat df=new DecimalFormat("#.#");return df.format(this.salary).equals(df.format(employee.salary));
}
学习记录:
1、getClass() 进行的是严格的类型检查,父类对象和子类对象通过 getClass() 比较时会返回 false。
因为 getClass() 方法返回的是对象的实际运行时类型(即对象在创建时的具体类型),父类和子类属于不同的类型,因此它们的 getClass() 返回值不同。与之相对的是 instanceof 关键字(如 o instanceof Employee),对于子类对象,它会返回 true(允许父类引用比较子类对象)。
2、DecimalFormat df = new DecimalFormat("#.#"); 这个写法表示创建一个 DecimalFormat 类型的格式化器对象 df ,这个格式化器的规则由模式字符串 "#.#" 定义,其中:
- # 表示可选的数字(如果该位有有效数字则显示,否则不显示)
- 中间的 . 表示小数点
- 小数部分最多显示 1 位(会自动四舍五入)
当调用 df.format (数值) 时:
传入的数值(可以是 double、float、long 等数值类型)会被按照 "#.#" 的规则转换为字符串
转换过程中会自动进行四舍五入处理。这样的写法可以保证格式的统一,且可以通过字符串的比较来避免浮点数的精度问题。