thinking in java (五) ----- equals()方法

equals()

equals()方法用来比较两个对象是否相等,父类是Object。其中在String中的equals()源代码如下

y

对象都是由引用reference和对象实例组成的。“==”是用来比较两个引用类型的reference,所以Object中的equals()方法是比较两个引用类型的reference是否相等。和"=="的效果是一样的。但是我们可以看到源代码中,如果对象是String类型的话,就会进行内容上的比较。实际上,在JDK中,Msth,String等封装类都对equals()方法进行了重写。

在java规范中,应该使用的几个规则:

equals方法在飞空对象引用上实现相等关系

  1. 自反性:对于任何非空引用X,X.equals(X)都应该返回true
  2. 对称性:对于任何非空引用X和Y,当且仅当X.equals(Y)才为true时,Y.equals(X)才为true
  3. 传递性:对于任何非空引用X,Y,Z.如果X.equals(Y)为true。Y.equals(Z)为true,那么X.equals(Z)为true
  4. 一致性:对于任何非空引用X,Y,多次调用X.equals(Y)始终为true或者始终为false,前提是XY中信息并没有被修改
  5. 对于任何非空引用X,X.equals(NULL)都应该返回false

重写equals注意事项(不用instanceof关键字判断类型)

众所周知,instanceof关键字的作用是判断左边对象是否是右边的实例,返回boolean类型的数据,可以用来判断继承中的子类实例是否是父类的实现。也就是说子类的实例instanceof父类,也会返回true。示例如下

父类Person

public class Person {
    protected String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    public Person(String name){
        this.name = name;
    }
    
    public boolean equals(Object object){
        if(object instanceof Person){
            Person p = (Person) object;
            if(p.getName() == null || name == null){
                return false;
            }
            else{
                return name.equalsIgnoreCase(p.getName());
            }
        }
        return false;
    }
}

子类Employee

public class Employee extends Person{
    private int id;
    
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Employee(String name,int id){
        super(name);
        this.id = id;
    }
    
    /**
     * 重写equals()方法
     */
    public boolean equals(Object object){
        if(object instanceof Employee){
            Employee e = (Employee) object;
            return super.equals(object) && e.getId() == id;
        }
        return false;
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        Employee e1 = new Employee("chenssy", 23);
        Employee e2 = new Employee("chenssy", 24);
        Person p1 = new Person("chenssy");
        
        System.out.println(p1.equals(e1));
        System.out.println(p1.equals(e2));
        System.out.println(e1.equals(e2));
    }
}

返回结果

true
true
false

在测试类里面定义了两个员工和一个普通人,都是同名,但是肯定不是同一个人,但是返回比较结果却不是false false  false,

这就是因为Person中的equals方法中是用 的instanceof判断类型,Employee继承与Person,类型判断结果为true,而name也相同,所以结果为true。

因此重写equals的时候,需要进行类型判断就使用getClass,

其中Person中的equals方法修改为:

public boolean equals(Object object){
        if(object != null && object.getClass()== this.getClass()){
            Person p = (Person) object;
            if(p.getName() == null || name == null){
                return false;
            }
            else{
                return name.equalsIgnoreCase(p.getName());
            }
        }
        return false;
    }

参考文献:https://www.cnblogs.com/chenssy/p/3416195.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值