面向对象之重写equals方法

我们来看一个这个例子

public void test() {
        Student  s = new Student(21,"张三",'男');
        Student  s1 = new Student(21,"张三",'男');
        System.out.println(s==s1);
        System.out.println(s.equals(s1));
        System.out.println(s);
        
    }

这样运行结果:

 

那么为什么都是false呢,我们解析一下

当判断s==s1时。它比较的是对象的引用,每new一个对象都开辟了一片内存,s和s1指向的是不同的内寸,引用的对象不一样,就指向的是不同对象的地址,所以判断为false。

当使用equals方法时,为什么还会错呢?因为它调用的是Object类的equals方法

 public boolean equals(Object obj) {
        return (this == obj);
    }

 在equals方法中,用来比较的是两个对象的引用是否相等,即是否指向同一个对象。

本题我们指向的Student对象的两个不同引用,所以判断为false

一般我们为了避免这种情况,就重写equals方法,自己定义判断方法。

public boolean equals(Object obj) {
        //instanceof判断是不是自己定义的类型
        if(obj instanceof Student) {
            Student s = (Student)obj;
            if(this.id == s.getId() 
                    && 
                    this.name.equals(s.getName())
                    &&
                     this.sex == s.getSex())
            
            return true;
            
        }
        return false;
    }

 加了以上代码,就可以自己定义判断方法。

运行结果:

总结:

当对象使用==比较时,比较的是使用对象的地址

当用equals方法比较的时候,没有重写则比较的是引用类型所指向的地址。重写可以根据自己定义的equals方法比较。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值