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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dhysh5512176 中级黑马   /  2014-11-27 12:50  /  3813 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
在TreeSet这个类中,当我们生成了一系列的String类型的对象,如下代码:
  1. public static void main(String[] args) {
  2. TreeSet ts = new TreeSet();
  3. ts.add("asdf");
  4. ts.add("ssss2");
  5. ts.add("1sd");
  6. ts.add("sdfa23fasfd");
  7. ts.add("s");
  8. ts.add("slijwld");
  9. ts.add("slds");
  10. Iterator it = ts.iterator();
  11. while(it.hasNext()){
  12. System.out.println(it.next());
  13. }
  14. }
复制代码
他会自动给我们进行排序,它调用的是String类里面的compareTo()方法,会按照字母字典的顺序进行自然排序,那如果我们需要按照字母的长度进行排序,我们一般会去重写一个比较器,例如:
TreeSet ts = new TreeSet(new ComparatorByLenth());
然后我们调用这个比较器就可以了。
可是,我想问的是,我们为什么不可以直接重写String类里面的compareTo()方法,我们既然可以重写Object类里面的方法,为什么不能重写String类里面的方法?
毕大大给的解释是因为String类已经被SUN公司写死了,所以我们不能,那Object类里面的为什么我们可以呢?

最佳答案

查看完整内容

这个原因是代码的扩展性问题,在CompareTo()方法中写了一种比较的方式,如果重写则会修改源代码,修改源代码对于程序员来说,相当于灾难性的事情,但是你重写一个比较器,就不用修改原先的CompareTo()方法

12 个回复

倒序浏览
这个原因是代码的扩展性问题,在CompareTo()方法中写了一种比较的方式,如果重写则会修改源代码,修改源代码对于程序员来说,相当于灾难性的事情,但是你重写一个比较器,就不用修改原先的CompareTo()方法
回复 使用道具 举报
:funk:表示没看太懂。。。我基础还是差,继续看视频去了。
回复 使用道具 举报
as604049322 发表于 2014-11-27 12:57
表示没看太懂。。。我基础还是差,继续看视频去了。

难道是我说的太模糊了?没事  加油  其实我也是新手,只是有问题 所以才提出来,共勉:D
回复 使用道具 举报
很深奥的问题呀,表示i'm too weak.
回复 使用道具 举报
public final class String
因为String类是final修饰的,不可以被继承,也就不能重写它的compareTo()方法,所以只有用比较器了
回复 使用道具 举报
也是新手,过来露脸的
回复 使用道具 举报
ppzx002 中级黑马 2014-11-30 08:28:59
8#
新手过来学习下!!!!!
回复 使用道具 举报
唉,好难啊
回复 使用道具 举报
可是,我想问的是,我们为什么不可以直接重写String类里面的compareTo()方法,我们既然可以重写Object类里面的方法,为什么不能重写String类里面的方法?
毕大大给的解释是因为String类已经被SUN公司写死了,所以我们不能,那Object类里面的为什么我们可以呢?

你能提出这种问题,说明你的基础实在是太差,你对java里基础包和java类的设计缺乏了解,建议你先熟悉一下jdk的api文档,看java的基础包里到底有些什么,常用类之间的继承和接口之间的关系是怎么样的。下面我来回答一下你的问题。
首先为什么不能重写String类?你看看api里的说明
[size=-1]java.lang
Class String
java.lang.Object  java.lang.StringAll Implemented Interfaces:Serializable, CharSequence, Comparable<String>
public final class Stringextends Objectimplements Serializable, Comparable<String>, CharSequence
看到了吗?String类继承了Object类,并实现了3个接口,而且String类前面有个final的修饰符,final修饰的类是不可能被修改和继承的,这个是基本常识,如果连这个都不能理解,那就没办法了,你只能自己去多啃下java的基本语法。还有你说Object类为什么可以被重写?这个原因很简单啊,因为他不是final的啊?Object是java里的基类懂吗?是所有类的祖宗懂吗?所有类都默认是Object的子类有木有?还是看看api里的介绍吧
[size=-1]java.lang
Class Object
java.lang.Object
public class Object
Class Object is the root of the class hierarchy. Every class has Object as a superclass. All objects, including arrays, implement the methods of this class.
什么?你说看不懂?好吧,如果你想学好java,钻研api是必须的。



回复 使用道具 举报
首先,我真的很感谢你很详细的给我回答这个问题,并且告诉我应该如何去做,谢谢。但是我也要说的是,确实 我承认我的基础很差,所以我敢于出来问,我并不怕我现在基础,因为这只是现在,只要我认真的学,以后,我也能够理解,也能够做到更好。
回复 使用道具 举报
因为String是final修饰的啊,所以不能继承啊,所以不能重写compareTo,这就是毕老师说的String类已经被SUN公司写死了啦
回复 使用道具 举报
String的API中你没看到吗?String是final修饰的,根本就不可以有子类,从何谈起重写compareTo方法呢?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马