package apidoc;
public class EqualsTest {
public static void main(String[] args) {
Person p=new Person("Tom",18);
Person p1=new Person("Tom",18);
System.out.println(p);
System.out.println(p1);
System.out.println(p==p1);
System.out.println(p.equals(p1));
System.out.println(p.getClass()); //class apidoc.Person
System.out.println(p.getClass()==p1.getClass());
}
}
class Person{
private String name;
private int age;
public Person() {
}
public Person(String name,int age) {
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "姓名:"+name+" 年龄:"+age;
}
@Override
public int hashCode() {
/**
* 如果两个对象相同,那么它们的hashCode值一定要相同;
* 如果两个对象的hashCode相同,它们并不一定相同。
*/
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
//Object类有equals方法 但是它的源代码 是== 只适用于基本数据类型
//String 类型重写了equal方法 使得可以从引用变量指向对象是否相同
/**
* String str="a";
* String str1="a";
* str.equals(str1) //true
*/
@Override
public boolean equals(Object obj) { //重写的是Object的equal方法 所以括号里面的参数不能改变
// 类似于 p.equal(p1); Object obj是传进来的参数
/**
*主要是对Object类型的equal方法进行重写
*
*/
if (this == obj)
return true; //如果是本身 那么就返回true 比如 p.equal(p);
if (obj == null) //如果传进来的参数是空 那么就直接返回true
return false;
if (getClass() != obj.getClass()) //class apidoc.Person 获取的是要给类名
return false; //如果返回的类型不一样 那么就直接返回的是false
Person other = (Person) obj; //向上造型 "other"只是一个变量存着(Person)obj的引用而已
if (name == null) { //name 指的是p的name
if (other.name != null) //other.name指的是 p1的name
return false; //如果在类型相同的情况下 那么一个为空 另个不为空 那么返回的是false
} else if (!name.equals(other.name)) //如果两个不为空 如果不相等的话 那么返回的是false
return false;
return true; //上面的条件都不满足的话 那么就返回的是true 即:同样的类型内容相同
//为什么要分开if (name == null) { if (other.name != null)
//不直接 !name.equals(other.name) 因为如果p的name是null 那么就会发生空指针异常
}
}