最近做Java实验,写Student、Goods实体类的时候,踩了equals和==的大坑。很多新手分不清什么时候用==,什么时候重写equals,今天结合实验代码一次性讲清楚。
Object是Java中所有类的父类,我们写的任何自定义类,默认继承Object。Object自带两个非常重要的方法:toString()、equals(),也是期末考试、实验作业高频考点。
一、toString()方法
默认Object的toString打印的是对象地址,没什么意义。重写toString(),可以自定义打印对象的信息,直接System.out.println(对象)就会自动调用。
实验需求:Student类,输出格式:id: xxx, name: xxx, age: xxx
public class Student {
// 封装:私有属性
private String id;
private String name;
private int age;
// 构造方法
public Student(String id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
// get set
public String getId() { return id; }
public void setId(String id) { this.id = id; }
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; }
// 重写toString
@Override
public String toString() {
return "id: " + id + ", name: " + name + ", age: " + age;
}
}
二、equals()重写(重点!)
==:引用类型比较内存地址,只有两个是同一个对象才返回true。
默认Object的equals底层就是==。
业务需求:学号相同,就认为是同一个学生,和内存地址无关,这时候必须重写equals。
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
// 判断学号相等即相同对象
return id.equals(student.id);
}
三、测试类
public class TestStudent {
public static void main(String[] args) {
Student s1 = new Student("1111111111","xxx",19);
Student s2 = new Student("1111111111","张三",20);
System.out.println(s1);
System.out.println("s1和s2是否是同一个学生:" + s1.equals(s2));
}
}
运行结果:id: 1111111111, name: xxx, age: 191
s1和s2是否是同一个学生:true
四、实验易错总结
1. 封装:成员变量用private,外部不能直接访问,必须get/set。
2. equals重写一定要做类型判断,防止类型转换异常。
3. 区分:==比较地址;重写后的equals比较对象内容。
结尾
本次实验的Goods商品类思路完全一样,根据商品编号重写equals。
网硕互联帮助中心







评论前必须登录!
注册