美文网首页
Object类equals

Object类equals

作者: 爱做梦的严重精神病患者 | 来源:发表于2018-10-16 16:01 被阅读0次

    Object类是Java中所有类的始祖,每个类都是由Object类扩展而来。
     在Java中,只有基本类型不是对象,例如,数值(int等)字符(char)布尔类型(boolean)的值都不是对象。所有的数组类型都扩展了Object类

    1.equals方法

     Object类中的equals方法用于检测一个对象是否等于另外一个对象。在Object类中,这个方法将判断两个对象是否具有相同的引用。然而为了防备两个变量均为null的情况,经常使用Objects.equals(a, b)

    Object.equals(a);
    Objects.equals(a,b);
    



    编写完美某个类的equals方法的建议:public boolean equals (Object otherObject)

    1. 显示参数命名为otherObject,稍后需要将它转换成一个叫做other的变量。

    2. 检测this与otherObject是否引用同一个对象。计算这个等式比一个个比较类中的域所付出的代价小得多。

    if(this == otherObject) return true;
    
    1. 检测otherObject是否为null,如果为null,返回false。
    if(otherObject == null) return false;
    
    1. 比较this与otherObject是否属于同一个类。如果equals的语义在每个子类中有所改变,就使用getClass检测:
    if (getClass() != otherObject.getClass()) return false;
    

     如果所有的子类都有统一的语义,就使用instanceof检测

    if(!(otherObject instanceof ClassName)) return false;
    
    1. otherObject转换相应的类类型变量:
    ClassName other = (ClassName) otherObject;
    
    1. 现在开始对所有需要比较的域进行比较。使用==比较基本类型域,使用Objects.equals(a, b)比较对象域(不使用本类的equals是因为防止对象域都为null)。对于数组类型的域,可以使用静态Arrays.equals方法检测相应的数组元素是否相等。如果所有的域都匹配,就返回true;否则返回false。
    return field1 == other.field1 && Objects.equals(field2, other.field2) && ...;
    

     如果在子类中重新定义equals,就要在其中包含调用super.equals(other)

    public class Employee {
        private String name;
        private double salary;
        private LocalDate hireDay;
    
    
        public boolean equals(Object otherObject) {
           if (this == otherObject) return true;
    
           if (otherObject == null) return false;
    
           if (getClass() != otherObject.getClass()) return false;
    
           Employee other = (Employee) otherObject;
    
           return Objects.equals(name, other.name) && salary == other.salary
                   && Objects.equals(hireDay, other.hireDay);
        }
    }
    
    
    public class Manager extends Employee {
        private double bonus;
    
        public boolean equals(Object otherObject) {
            if (!super.equals(otherObject)) return false;
    
            Manager other = (Manager) otherObject;
    
            return bonus == other.bonus;
        }
    }
    
    

    相关文章

      网友评论

          本文标题:Object类equals

          本文链接:https://www.haomeiwen.com/subject/rolhzftx.html