黑马程序员技术交流社区

标题: 我的思维有点混乱关于String类的equals()方法 [打印本页]

作者: 927233671    时间: 2014-5-29 16:47
标题: 我的思维有点混乱关于String类的equals()方法
本帖最后由 927233671 于 2014-5-30 10:42 编辑

为什么说String类复写了Object类的equals()方法,而不是直接继承啊,既然任何类都是Object类子类,子类直接继承父类,拿过来直接用啊,为什么要复写啊?
作者: Alan_Kwan    时间: 2014-5-29 17:40
因为Object类的equals()方法仅仅是比较两对象的地址值。
假设有一个Person类,并且new出了p1和p2。p1和p2内容相同,但是在堆中是不同的空间。此时使用equals方法得到的结果是false,原因是两对象的引用地址不相同。

但是我们要的结果是比较地址值吗?所以往往要复写就是这个原因。其实就是因为比较地址值没有什么意义,所以要复写。
作者: fenzheng    时间: 2014-5-29 17:45
Object类的equals()方法仅仅是比较两对象的hashcode地址值,
而String 类的equalse()方法 比较的两个对象是否相等
果他们将返回true,对象必须是类的一个实例,与相同的字符字符串 这个时候使用object的equals方法比较hashcode地址是没有意义的
作者: fenzheng    时间: 2014-5-29 17:49
Stirng类比较的是比较指定的字符串,这个字符串忽视的情况
*字符,返回true,如果他们是平等的。
作者: BigKarel    时间: 2014-5-29 18:32
我觉得你不是不理解equals方法,而是没理解继承和复写的意义,首先说说继承,继承一个类主要是增加了新的拓展功能,而复写父类中的方法是实现新功能的手段,为什么不能拿过来直接用?说白了就是虽然方法名相同,但子类复写后功能已经不同,正如你的问题,object类是所有类的父类,他的equals比较的是地址,而子类string复写后比较的是字符串对象,子类经过复写父类方法实现了父类功能的拓展。
作者: 唤月    时间: 2014-5-29 18:33
Obeject类中的equals方法是这样定义的public boolean equal(Object obj)如果String类继承该方法没有重写,若传递的参数是其他类型的参数就会编译失败....你说需要重写不?????
作者: 13556793092    时间: 2014-5-29 18:44
好好看一下为什么继承这一小节的视频吧
作者: 927233671    时间: 2014-5-29 20:23
唤月 发表于 2014-5-29 18:33
Obeject类中的equals方法是这样定义的public boolean equal(Object obj)如果String类继承该方法没有重写 ...

不会编译失败,因为Object类是所有类的父类,这样就是多态啊
作者: 小坏坏    时间: 2014-5-29 20:32
Object类是比较的内存地址,如果内存地址相等返回true。如果String类不重写equal()方法,==的功能和equal功能相等,如果重写了,可能会比较二者的值。
作者: JavaStudy770    时间: 2014-5-29 20:41
方法的覆写和类的继承是两个概念。要想理解这两个概念,就要明白:之所以要去继承一个类,是因为该类的
作者: JavaStudy770    时间: 2014-5-29 21:00
   方法的覆写和类的继承是两个概念。要想理解这两个概念,就要明白:之所以要去继承一个类,是因为该类的一些属性和方法是我们实际情况所需要的,所以我们不必再去定义另一个新的和它差不多的类,这样一来就减少了很多重复的代码,提高了代码的复用性。所以父类具有其所有子类的共性(属性和方法)。
    而方法的覆写是在继承的基础上的,没有继承就没有方法的覆写。之所以要覆写,是因为子类对父类的实现很不满意,或者说父类的实现没有达到子类的需求,实现的不够完整;所以子类只好把父类的方法给覆写了。补充:当子类去调用覆写后的方法时,调用的是子类覆写后的方法,而不是原来父类的方法。这就是动态绑定,即多态。不知你听懂了没?
作者: 宋健敏    时间: 2014-5-29 21:00
你应该明白多态的概念,然后就可以知道为什么有时候子类不直接去继承父类的方法,而是去覆写父类的方法。因为一个好的程序设计是不会去继承已经实现好了功能的类,而是去继承一个抽象类。这是因为抽象类中的抽象方法没有实现方法功能,而是让子类去覆写,起一个模板的作用。
作者: 唤月    时间: 2014-5-30 06:59
927233671 发表于 2014-5-29 20:23
不会编译失败,因为Object类是所有类的父类,这样就是多态啊

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

终于搞明白了!!!
作者: 钟翠翠    时间: 2014-7-29 10:51
学习了,终于弄懂了!!
作者: 王洪涛    时间: 2014-7-29 15:57
子类继承了父类的方法为的是扩展功能,提高代码复用性,子类继承了父类的方法,方法名相同但具体实现不相同,就不用去修改父类的方法的代码,Object类的equals()方法是比较两对象的地址值,
而String 类的equalse()方法 比较的两个对象 ,这样子类继承了父类的equalse()的方法但是具体实现不同,
作者: 渐行渐远    时间: 2014-11-5 22:10
好贴,学到了
作者: 游客也爱学    时间: 2014-11-5 23:02
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比较字符串的具体内容,不是地址
作者: lxztravel    时间: 2016-2-27 09:44
String类中的equals()方法是要比较字符串的相同与否,而object类中的equals()方法比较的是hashcoad的值,所以如果不复写那么String类中的equals()方法在比较时都会是false所以要复写




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2