Object又叫超类,是所有类的祖先,所有类都继承了toString、equals、hashCode等方法。
继承过来的方法大部分需要重写加以改善,才能投入到实际应用中。
toString
输出一个对象时,默认输出的内容是:类名 + “@” +hashCode值。
输的内容:com.ives.fourteen.Student@745f
输出太抽象,看不到有价值的信息。
重写toString
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
输出的内容:Student{name='tom', sex='man', age=18}
输出对象时,可以看到对象的属性和对应的值
equals
比较两个对象时,equals默认比较两个对象的内存地址。
如果变量A和变量B的ID相等,对于我们人类来说,他们应该是相等的,但是在机器看来,A和B的内存地址不一致,所以不相等。
所以我们需要对equals进行符合现实生活规则的重写。
public boolean equals(Object o) {
//如果两个对象内存地址相同,那么返回true
if (this == o) return true;
//如果比较的对象为null、或者两个对象的类不一样,那么返回false
if (o == null || getClass() != o.getClass()) return false;
//强制类型转换
Student student = (Student) o;
//比较两个对象的ID,如果ID相等,就代表两个对象相等。(ID是唯一的)
return ID == student.ID;
}
hashCode
在Java集合中,判断两个对象是否相等的流程如下:
- 比较两个对象的hashCode
- 两个对象进行equals
比如有两个ID相等的对象,分配了不同hashCode,那么在集合中,机器会认为这是两个不同的对象。
所以我们需要对hashCode进行符合现实生活规则的重写。
public int hashCode() {
//根据ID分配hashCode值
return Objects.hash(ID);
}