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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© j816326 中级黑马   /  2013-6-12 20:43  /  1458 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 j816326 于 2013-6-13 19:45 编辑

TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!
看下面代码 请给我个解释 最好详细点 。不怎么明白

public class Parent implements Comparable {

private int age = 0;

public Parent(int age){

this.age = age;

}

public int compareTo(Object o) {

System.out.println("method of parent");

Parent o1 = (Parent)o;
return age>o1.age?1:age<o1.age?-1:0;
}

}

public class Child extends Parent {

public Child(){

super(3);

}

public int compareTo(Object o) {

System.out.println("method of child");

// Child o1 = (Child)o;

return 1;

}
}

public class TreeSetTest {

public static void main(String[] args) {

TreeSet set = new TreeSet();
set.add(new Parent(3));
set.add(new Child());
set.add(new Parent(4));
System.out.println(set.size());
}
}

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1 神马都是浮云

查看全部评分

6 个回复

倒序浏览
程序有点小问题:
1、没导包
2、一个文件里只能有一个public class,你一下定义了三个

你要知道你定义的TreeSet并没有限定类型,所以什么样的对象都能放(当然这是不安全的,往后面看视频,泛型里有),所以你在set.add()中放什么样的对象并没有直接关系。

你放child对象调用的就是child的compareTo方法,你放parent的对象调用的就是parent中的compareTo方法,甚至你放个cat或者dog都没关系,他们会调用自己的方法,前提是——你的compareTo方法中别写真正比较的代码,不然绝对会报类型转换异常(当然,现在你只是写了输出语句,所以没什么问题,但是这样的写法是非常不安全的),因为不同的类没有可比性啊。

如果你想用父类的方法比较子类,或将子类的方法给父类对象用,还是那句话,等你看到泛型就明白了,泛型限定就是为了泛型扩展用的。

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 x378320002 于 2013-6-12 23:47 编辑

楼主的意思我明白,没太理解好Tree类集合添加和存储特点吧,这个代码稍加改动还是能执行的,
我就给你解释下下面这段是怎么执行的,你就在仔细想想
TreeSet set = new TreeSet();
set.add(new Parent(3));    --------   Parent(3)对象调用自己的compareTo方法和自己比较,因为是第一个
set.add(new Child());----------------new Child()对象调用自己的compareTo方法和 Parent(3)比较,返回正数则说明比 Parent(3)大,放在 Parent(3)右面存储。
set.add(new Parent(4));-------------new Parent(4)对象调用自己的compareTo方法和 Parent(3)比较(注意这里是关键),发现比 Parent(3)大,往右走,发现还有个new Child()
                                              ,那么new Parent(4)对象再调用自己的compareTo方法和new Child()比较,4比3大,所以放在-new Child()右面。
System.out.println(set.size());

继续往里存储,依次规律,注意,树形结构,说明是从节点开始比较,并不是比刚存进去的哪一个。这里只讨论运行,所以泛型与否不用管,没什么关系。
这个没有多态,所以什么覆盖继承什么的,也涉及不到。

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1 赞一个!

查看全部评分

回复 使用道具 举报
比如说实现Comparable 重写compareTo方法后 在compareTo方法中在使用compareTo的话 肯定还是用的父类的。只有你子类调用 实现了Comparable 类的时候才会用到对应的CompareTo

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
如果代码多的情况下,可以将代码放在代码块中哦~编辑的时候笑脸旁边就是 "<>"
楼主您好!如果问题得到解决请将题目改成"已解决"
编辑文章-->修改 如果问题没有得到解决请继续发问谢谢您的配合{:soso_e100:}
回复 使用道具 举报
谢谢大家热心的帮我解惑。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马