class Equals {
public static void main(String[] args) {
Person p1 = new Person(new String("张三"), 21);
Person p2 = p1;
System.out.println(p1);
System.out.println(p2);
System.out.println("地址是否相同: " + (p1 == p2)); // 比较两个对象的地址, 判断是否是同一个对象
System.out.println("属性是否相同: " + p1.equals(p2)); // 需求: 比较两个对象的成员变量是否完全相同
}
}
class Person extends Object {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() { // Object类默认是返回"类名@地址", 建议每个类都重写它
return "Person [name=" + name + ", age=" + age + "]"; // 返回一个易于读懂的字符串
}
@Override
public boolean equals(Object obj) { // Object类的equals默认比较地址, 如果我们想比较成员变量, 就可以重写
if (this == obj) // 如果地址相同
return true; // 返回true, 不用比较了, 提高效率
if (!(obj instanceof Person)) // 如果obj不是Person类型
return false; // 返回false, 类型都不一样, 就不用继续比了
Person other = (Person)obj; // 为了访问Person类的成员变量, 所以把Object类型的obj强转为Person
if (this.name == null) { // 如果当前name为空
if (other.name != null) // 另一个对象name不为空
return false; // 返回false, 代表两个对象不一样
} else if (!this.name.equals(other.name)) // 如果name不同
return false; // 返回false, 代表两个对象不一样
if (this.age != other.age) // 如果age不同
return false; // 返回false, 代表两个对象不一样
return true; // 如果上面都没返回, 就返回true, 代表两个对象一样
}
/*
@Override
public boolean equals(Object obj) { // Object类的equals默认比较地址, 如果我们想比较成员变量, 就可以重写
Person other = (Person)obj; // 为了访问Person类的成员变量, 所以把Object类型的obj强转为Person
if (this.name != other.name) // 如果name不同
return false; // 返回false, 代表两个对象不一样
if (this.age != other.age) // 如果age不同
return false; // 返回false, 代表两个对象不一样
return true; // 如果上面都没返回, 就返回true, 代表两个对象一样
}
*/
|