A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© nengYouDuoNiu 中级黑马   /  2016-7-8 18:01  /  1542 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

提问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;
}

路途遥远,勿忘初心.jpg (12.58 KB, 下载次数: 7)

路途遥远,勿忘初心

路途遥远,勿忘初心

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马