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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 927233671 于 2014-5-30 10:42 编辑

为什么说String类复写了Object类的equals()方法,而不是直接继承啊,既然任何类都是Object类子类,子类直接继承父类,拿过来直接用啊,为什么要复写啊?

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

19 个回复

倒序浏览
因为Object类的equals()方法仅仅是比较两对象的地址值。
假设有一个Person类,并且new出了p1和p2。p1和p2内容相同,但是在堆中是不同的空间。此时使用equals方法得到的结果是false,原因是两对象的引用地址不相同。

但是我们要的结果是比较地址值吗?所以往往要复写就是这个原因。其实就是因为比较地址值没有什么意义,所以要复写。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报 1 0
Object类的equals()方法仅仅是比较两对象的hashcode地址值,
而String 类的equalse()方法 比较的两个对象是否相等
果他们将返回true,对象必须是类的一个实例,与相同的字符字符串 这个时候使用object的equals方法比较hashcode地址是没有意义的

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
Stirng类比较的是比较指定的字符串,这个字符串忽视的情况
*字符,返回true,如果他们是平等的。
回复 使用道具 举报
我觉得你不是不理解equals方法,而是没理解继承和复写的意义,首先说说继承,继承一个类主要是增加了新的拓展功能,而复写父类中的方法是实现新功能的手段,为什么不能拿过来直接用?说白了就是虽然方法名相同,但子类复写后功能已经不同,正如你的问题,object类是所有类的父类,他的equals比较的是地址,而子类string复写后比较的是字符串对象,子类经过复写父类方法实现了父类功能的拓展。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
Obeject类中的equals方法是这样定义的public boolean equal(Object obj)如果String类继承该方法没有重写,若传递的参数是其他类型的参数就会编译失败....你说需要重写不?????
回复 使用道具 举报
好好看一下为什么继承这一小节的视频吧
回复 使用道具 举报
唤月 发表于 2014-5-29 18:33
Obeject类中的equals方法是这样定义的public boolean equal(Object obj)如果String类继承该方法没有重写 ...

不会编译失败,因为Object类是所有类的父类,这样就是多态啊
回复 使用道具 举报
Object类是比较的内存地址,如果内存地址相等返回true。如果String类不重写equal()方法,==的功能和equal功能相等,如果重写了,可能会比较二者的值。
回复 使用道具 举报
方法的覆写和类的继承是两个概念。要想理解这两个概念,就要明白:之所以要去继承一个类,是因为该类的
回复 使用道具 举报
   方法的覆写和类的继承是两个概念。要想理解这两个概念,就要明白:之所以要去继承一个类,是因为该类的一些属性和方法是我们实际情况所需要的,所以我们不必再去定义另一个新的和它差不多的类,这样一来就减少了很多重复的代码,提高了代码的复用性。所以父类具有其所有子类的共性(属性和方法)。
    而方法的覆写是在继承的基础上的,没有继承就没有方法的覆写。之所以要覆写,是因为子类对父类的实现很不满意,或者说父类的实现没有达到子类的需求,实现的不够完整;所以子类只好把父类的方法给覆写了。补充:当子类去调用覆写后的方法时,调用的是子类覆写后的方法,而不是原来父类的方法。这就是动态绑定,即多态。不知你听懂了没?

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1 回答的nice!

查看全部评分

回复 使用道具 举报
你应该明白多态的概念,然后就可以知道为什么有时候子类不直接去继承父类的方法,而是去覆写父类的方法。因为一个好的程序设计是不会去继承已经实现好了功能的类,而是去继承一个抽象类。这是因为抽象类中的抽象方法没有实现方法功能,而是让子类去覆写,起一个模板的作用。
回复 使用道具 举报
927233671 发表于 2014-5-29 20:23
不会编译失败,因为Object类是所有类的父类,这样就是多态啊

是我搞错了....Object类中的equals方法比较的是地址值,如要比较String对象中的内容就必须得重写
回复 使用道具 举报
继承和复写不是一个概念,继承就是子类继承了父类,为的是扩展功能,提高代码复用性,又不用去修改父类的代码;如果要用到一个类中的方法,方法名相同但具体实现不相同,就不用去修改父类的方法的代码,而可以写一个类继承这个类,然后复写这个方法,这样就提高了扩展性
回复 使用道具 举报
fenzheng 发表于 2014-5-29 17:45
Object类的equals()方法仅仅是比较两对象的hashcode地址值,
而String 类的equalse()方法 比较的两个对象 ...

终于搞明白了!!!
回复 使用道具 举报
学习了,终于弄懂了!!
回复 使用道具 举报
子类继承了父类的方法为的是扩展功能,提高代码复用性,子类继承了父类的方法,方法名相同但具体实现不相同,就不用去修改父类的方法的代码,Object类的equals()方法是比较两对象的地址值,
而String 类的equalse()方法 比较的两个对象 ,这样子类继承了父类的equalse()的方法但是具体实现不同,
回复 使用道具 举报
好贴,学到了
回复 使用道具 举报
String类的定义方法
  第一种 String s = "abc";
  第二种 String s1 = new String("abc"); //创建字符串,使用的是String类的构造器

  区别,第一种创建一个对象 s直接指向对象"abc"
        第二种创建两个对象,对象"abc",对象 new String() 变量s1指向的是new String()
  s == s1  结果是false 指向不同的对象
  s.equals(s1)结果是true,String类重写equals比较字符串的具体内容,不是地址
回复 使用道具 举报
String类中的equals()方法是要比较字符串的相同与否,而object类中的equals()方法比较的是hashcoad的值,所以如果不复写那么String类中的equals()方法在比较时都会是false所以要复写
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马