以前忘了是在哪位前辈的博客中看到一句话,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.