关于重写equals方法的学习

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


猜你喜欢

转载自blog.csdn.net/qq_39209361/article/details/80545582
今日推荐