提问1:在Student类中为什么要重写toString方法和equals方法?
--------------------------------------------------
解答1:
Object类是类层次结构的根类,是超类,Student类也默认继承该类。
-------------
* 如果不重写toString方法,调用的就是Object类中toString方法(参见源码解析),它返回的是对象的字符串形式:
比如com.heima.test.Student@14e8cee,这对我们来说没有意义,所以需要重写,如下:
@override
public String toString() {
return "Student[name="+ name + ", age=" + age +"]";
}
-------------
* 如果不重写equals方法,调用的也是Object类中equals方法,它比较的是对象的引用值(参见源码解析)。
但是:
Student s1 = new Student("张三");
Student s2 = new Student("张三");
boolean b = s.equals(s2);返回值是false。因为不同的对象,在堆内存中开辟的空间地址也就不一样,所以返回false,
但,我们想要的结果是,在姓名不允许重复的情况下,只要名字是张三,就是同一对象,因此需要重写equals方法。如下:
@Override
public boolean equals(Object obj) { //为何这样写?提示一点:this.name返回的是一个字符串,所以需查看String的equals方法(参见源码解析)
Student s = (Student) obj;
return this.name.equals(s.name) && this.age==s.age;
}
开发中都采用的是自动生成方式了,但走向大牛的路上,不可不知道源码。
-------------
源码解析:
Object类:toString和equals方法
public String toString(){ //返回该对象的字符串表示
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
public boolean equals(Object obj) { //比较的是对象的引用
return (this == obj);
}
String类:toString和equals方法
public String toString() { //返回字符串本身
return this;
}
public boolean equals(Object anObject) { //将此字符串与指定的对象比较,比较的是字符序列。
if (this == anObject) { //如果这个字符串和传入的对象,地址值相同,说明是同一个字符串,就返回true;
return true;
}
if (anObject instanceof String) { //如果传入的对象是一个字符串
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) { //比较这个字符串的长度和传入字符串的长度是否相同
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) { //一个字符一个字符地比较
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
|
|