Person类,Company类,Employee类。

其中Employee类继承自Person类,属性为:

private Company company;
private double salary;

现在要求覆盖Employee类的equals方法,判定两个Employee对象是否相等,请见如下判断方法:

  1. 其继承自父类Person的属性值都相等,其company属性对象equals返回true,且其salary也相等。

  2. 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 等数值类型)会被按照 "#.#" 的规则转换为字符串
转换过程中会自动进行四舍五入处理。这样的写法可以保证格式的统一,且可以通过字符串的比较来避免浮点数的精度问题。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐