黑马程序员技术交流社区

标题: if (!(obj instanceof student))什么时候满足条件? [打印本页]

作者: 张晓辉    时间: 2013-9-11 13:13
标题: if (!(obj instanceof student))什么时候满足条件?
本帖最后由 张晓辉 于 2013-9-11 16:25 编辑
  1. import java.util.*;
  2. class student implements Comparable
  3. {
  4. private String name;
  5. private int age;
  6. student(String name,int age)
  7. {
  8. this.name=name;
  9. this.age=age;
  10. }
  11. public String getName()
  12. {return name;}
  13. public int getAge()
  14. {
  15. return age;
  16. }
  17. public int compareTo(Object obj)
  18. {
  19. if (!(obj instanceof student))
  20. {
  21. throw new RuntimeException("不是学生对象");
  22. }
  23. student s=(student)obj;
  24. if (this.age>s.age)
  25. {
  26. return 1;
  27. }
  28. if (this.age==s.age)
  29. {
  30. return this.name.compareTo(s.name);
  31. }
  32. return -1;
  33. }

  34. }

  35. class treesetlianxi
  36. {
  37. public static void main(String[] args)
  38. {
  39. TreeSet al=new TreeSet();
  40. al.add(new student("jack001",20));
  41. al.add(new student("jack002",20));
  42. al.add(new student("jack001",20));
  43. al.add(new student("jack003",21));
  44. al.add(new student("jack004",10));

  45. Iterator it=al.iterator();
  46. while (it.hasNext())
  47. {
  48. student s=(student)it.next();
  49. System.out.println(s.getName()+"-----"+s.getAge());
  50. }
  51. }
  52. }
复制代码
在student类覆写Comparable接口compareTo()方法中
  1. if (!(obj instanceof student))
  2. {
  3. throw new RuntimeException("不是学生对象");
  4. }
复制代码
不一样的对象,会抛出异常,求个验证过的实例。


作者: 斗胆潇洒    时间: 2013-9-11 13:37
if (!(obj instanceof student))
满足条件是,传入的obj 不能转student类型,
这个判断你只要满足它就是了,
比如在mian函数中加一句
al.add(new String());
就能进if了
作者: 周文斌    时间: 2013-9-11 13:44
斗胆潇洒 发表于 2013-9-11 13:37
if (!(obj instanceof student))
满足条件是,传入的obj 不能转student类型,
这个判断你只要满足它就是了 ...

求指教。。“compareTo”这个函数 是怎么进去的。。我没找到调用的地方

作者: 斗胆潇洒    时间: 2013-9-11 14:25
。。。。
compareTo是Comparable接口的抽象方法
Student实现时需复写该方法,
每次集合add一个Student对象,都会自动
调用compareTo进行比较
是内部隐式调用的,你只复写就行了
作者: 张晓辉    时间: 2013-9-11 14:32
周文斌 发表于 2013-9-11 13:44
求指教。。“compareTo”这个函数 是怎么进去的。。我没找到调用的地方

java就这么定义的,TreeSet集合在进行数据存储时要进行比较(以便数据结构存储),在不能比较的情况下,就需要定义自定义比较方法,否则数据存不进去,这个方法是覆写  接口Comparable中compareTo()方法,只要存就会自动调用
作者: 张晓辉    时间: 2013-9-11 14:37
斗胆潇洒 发表于 2013-9-11 13:37
if (!(obj instanceof student))
满足条件是,传入的obj 不能转student类型,
这个判断你只要满足它就是了 ...

还是没抛出异常啊,我很费解,不是student类型的,怎么可能传进来,
作者: 斗胆潇洒    时间: 2013-9-11 14:40
本帖最后由 斗胆潇洒 于 2013-9-11 15:25 编辑
周文斌 发表于 2013-9-11 13:44
求指教。。“compareTo”这个函数 是怎么进去的。。我没找到调用的地方

还有,

由于compareTo是Student的复写方法
所以绝对是Student对象 点 调用,
由TreeSet这个容器管理
Student的对象顺序,
如有s1和s2两个Student对象
TreeSet添加s1后
在添加s2时,TreeSet会叫
s2这样做,s2.compareTo(s1),
TreeSet只要返回值,排顺序就行


作者: 斗胆潇洒    时间: 2013-9-11 14:44
C:\Users\zzb520\Desktop\捕获.JPG
C:\Users\zzb520\Desktop\捕获2.JPG
作者: 斗胆潇洒    时间: 2013-9-11 14:45
额,我这里验证了才给你发的

捕获.JPG (17.36 KB, 下载次数: 101)

捕获.JPG

捕获2.JPG (17.79 KB, 下载次数: 92)

捕获2.JPG

作者: 张晓辉    时间: 2013-9-11 14:49
斗胆潇洒 发表于 2013-9-11 14:45
额,我这里验证了才给你发的

为什么只能夹在添加数据的第一行

作者: 斗胆潇洒    时间: 2013-9-11 14:51
张晓辉 发表于 2013-9-11 14:37
还是没抛出异常啊,我很费解,不是student类型的,怎么可能传进来,

compareTo(Object obj)
中传入的是Object,所以其它类型也能进来啊
然后你那if (!(obj instanceof student))中是加了!的取反符号,
String类型就满足if条件的

作者: 张晓辉    时间: 2013-9-11 14:55
斗胆潇洒 发表于 2013-9-11 14:51
compareTo(Object obj)
中传入的是Object,所以其它类型也能进来啊
然后你那if (!(obj instanceof studen ...

compareTo()定义在student中,不是student类型的,怎么会进来数据,并且调用此方法?
作者: 斗胆潇洒    时间: 2013-9-11 15:04
。。。。
compareTo(Object obj)中传入的Object类型
Object是所有类的父类,
所有类都可以向上转型成Object,String也是,
你在if (!(obj instanceof student))下面加一句
System.ou.println("aaaaa");测试句子
就知道进来了不
作者: 张晓辉    时间: 2013-9-11 15:12
想了想,应该是这么理解:
先在al中添加一个不同类型的对象,当每次添加student类型对象时,都会调用student中的比较方法与集合中对象依次比较,发现不同类型,会抛出异常;发现相同数据不与存储。
如果在集合中先添加有了student对象,此时,再添加其他类型对象时,调用的是其他类型中的比较方法,如果这个类型中没有定义方法,或者定义的方法没有跟student类型比较的代码,JVM就会报错。应该是这样了。
万分感谢各位!
作者: 斗胆潇洒    时间: 2013-9-11 15:23
张晓辉 发表于 2013-9-11 15:12
想了想,应该是这么理解:
先在al中添加一个不同类型的对象,当每次添加student类型对象时,都会调用studen ...

的确,这样才能解释为什么移动这句话add(String)到不同位置
会报不同异常了,我把我那个例子
s1.compareTo(s2);改成s2.compareTo(s1)了
后添加的s2才是比较的发起者。
这一个小问题,也是受益匪浅啊{:soso_e181:}

作者: lonely_zb    时间: 2013-9-11 15:29
if (!(obj instanceof student))
如果你的obj对象的类型是Student的话,那么obj instanceof student返回true,if条件表达式不会成立;

obj是任何类型都可以被传入进来的,你可以把obj.getClass.getName();-- 通过反射的方式,你在每次进入到这里的时候,就可以知道你的obj参数的类型到底是什么?




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