/**
* 深入理解重写equals()方法
* 结论:自定义的类,如果需要对"对象"进行比较,都需要根据实际需要重写"equals()"方法
*/
public class Test {
public static void main(String[] args) {
//创建用户对象
//下行代码中的"new Address("秦皇岛市","海阳路","066300")"就是一个家庭住址对象
User u1 = new User("张三",new Address("秦皇岛市","海阳路","066300"));
User u2 = new User("张三",new Address("秦皇岛市","海阳路","066300"));
//比较u1与u2是否相等
//使用"=="比较
System.out.println(u1 == u2);//执行结果:false
//使用equals()方法比较
//User类的equals()方法重写,但是Address类的equals()不重写,比较的结果是:false
//User类的equals()方法重写,Address类的equals()也重写,比较的结果是:true
System.out.println(u1.equals(u2));
//字符串使用赋值的方式创建,可以使用"=="去比较,也可以使用equals()方法去比较,建议使用equals()方法
String s1 = "abc";
String s2 = "abc";
System.out.println(s1.equals(s2)); //true
System.out.println(s1 == s2); //true
}
}
//用户类
class User{
//用户姓名
private String name;
//用户家庭住址
private Address addr;
//无参构造
public User() {
}
//有参构造
public User(String name, Address addr) {
this.name = name;
this.addr = addr;
}
//get and set方法(略)
//重写toString()方法
public String toString() {
//要求返回用户姓名和家庭住址
return "用户姓名:" + name + ", 家庭住址:" + addr;
}
//重写equals()方法
// 这个equals()方法比较的是两个用户是否相等 两个用户相等的条件是:用户名相同且家庭住址相同
// 这个方法里需要比较用户的家庭住址,所以Address类的equals()方法必须重写
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || !(o instanceof User)) return false;
User user = (User) o;
return name.equals(user.name) && addr.equals(user.addr);
}
}
//家庭住址类
class Address{
//城市
private String city;
//街道
private String street;
//邮政编码
private String zipCode;
//无参构造
public Address() {
}
//有参构造
public Address(String city, String street, String zipCode) {
this.city = city;
this.street = street;
this.zipCode = zipCode;
}
//get and set方法(略)
//重写toString()方法
public String toString() {
//返回城市、街道和邮政编码
return "居住城市:" + city + ", 街道:" + street + ", 邮政编码:" + zipCode;
}
//重写equals()方法
// 这个equals()方法比较的是两个对象的家庭住址是否相等
//判断相等的条件是:城市相同、街道相同、邮政编码相同
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || !(o instanceof Address)) return false;
Address address = (Address) o;
return this.city.equals(address.city) &&
this.street.equals(address.street) &&
this.zipCode.equals(address.zipCode);
}
}