以前忘了是在哪位前辈的博客中看到一句话,Java中一切皆为对象,当初还不太理解,以为对象就是对象就是Person p = new Person();中的p,随着越来越深入的学习,也越来越觉得这句话简单又深刻。
Gd今天学习的是equals()方法的重写,看起来很简单,但是拓展起来也是很有意思的,首先来看一下没有重写的equals()方法:
package org.requals; class Person { private String name; private int age; public Person(String name,int age) { this.name = name; this.age = age; } } class unRequals { public static void main(String[] args) { Person p1 = new Person("小巴",18); Person p2 = new Person("小巴",18); System.out.println(p1.equals(p2)); } }
Gd之前看过关于“==”和equal()方法的区别,“==”比较的是对象的地址,equals()方法比较的是对象的内容,所以想当然的以为内容相同,运行结果一定为true,就很得意的进行了测试,结果如下:
控制台好像在对我说:“没想到吧,是false,哈哈哈哈哈哈!!!”,这就很让人头大了,不是比较的内容吗?内容一样怎么就成了false呢???作为初学者的Gd一脸茫然。不甘心的Gd找到以前看过的代码写了一遍equals()方法,结果并没有让人意外,可爱的true出现在控制台上了:
package org.requals; public class Cequals { public static void main(String[] args) { String s1 = new String("小巴"); String s2 = new String("小巴"); System.out.println(s1.equals(s2)); } }
打开两个equals()方法的声明发现,后者比前者长了一大截:
而且前者所在的类类名为Object.class,后者所在的类类名为String.class,这样就明白多了,后者的equals()方法已经被重写,而前者的equals()方法没有被重写,Person类在创建类的对象时所默认继承的Object类中并没有重写equals()方法,而Cequals类中创建的String对象所继承的String类中已经默认将equals()方法重写,所以出现的结果才会不同!
Gd通过参考相关书籍和网上资料手动重写了Person类中的equals()方法,终于得到了可爱的true:
重写equals()方法的代码就在这里了:
package org.requals; class Person { private String name; private int age; public Person(String name,int age) { this.name = name; this.age = age; } public boolean equals(Object obj) { boolean temp = true; Person p1 = this; //声明一p1对象,此对象实际上就是当前调用equals()方法的对象. if(obj instanceof Person) //判断Object类对象是否是Person的实例. { Person p2 = (Person)obj; //如果是Person类实例,则进行向下转型. if(!(p1.name.equals(p2.name)&&p1.age ==p2.age)) //调用String类中的equals()方法. { temp = false; } } else { temp = false; //如果不是Person实例,则直接返回false. } return temp; } } class unRequals { public static void main(String[] args) { Person p1 = new Person("小巴",18); Person p2 = new Person("小巴",18); System.out.println(p1.equals(p2)); } }
在前辈的博客上看见重写equal()方法的同时还要重写hasCode()方法,目的大概就是保证属性值相同的同时也要保证属性的hasCode值相等,所以在重写equals()方法下面重写了hasCode()方法:
public int hasCode() { String id = this.name + this.age + ""; return id.hashCode(); }
运行结果是一样的,都为true.