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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭孟涛 高级黑马   /  2013-2-14 03:26  /  1482 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郭孟涛 于 2013-2-14 03:29 编辑


  1. import java.util.*;


  2. class TreeSetDemo2  
  3. {
  4.     public static void main(String[] args)  
  5.     {
  6.         TreeSet ts = new TreeSet();

  7.         ts.add(new Student("lisi0",30));
  8.         ts.add(new Student("lisixx",29));
  9.         ts.add(new Student("lisi9",29));
  10.         ts.add(new Student("lisi8",38));
  11.         ts.add(new Student("lisixx",29));
  12.         ts.add(new Student("lisi4",14));
  13.         //ts.add(new Student(39));
  14.         ts.add(new Student("lisi7",27));



  15.         System.out.println(new Student("lisi0",30)); //输出结果为什么是:lisi0::30 ?这个值怎么从构造函数中传到toString函数中了呢?
  16.     }
  17. }

  18. //同姓名同年龄的学生视为同一个学生。按照学生的年龄排序。
  19. class Student implements Comparable
  20. {
  21.     private int age;
  22.     private String name;
  23.     Student(String name,int age)
  24.     {
  25.         this.age = age;
  26.         this.name = name;
  27.     }

  28.     public int compareTo(Object obj)
  29.     {
  30.         
  31.         Student stu = (Student)obj;
  32.         
  33.         int num = new Integer(this.age).compareTo(new Integer(stu.age));

  34.         return num==0?this.name.compareTo(stu.name):num;

  35.         /*
  36.         if(this.age>stu.age)
  37.             return 1;
  38.         if(this.age==stu.age)
  39.             return this.name.compareTo(stu.name);
  40.         return -1;
  41.         */
  42.         /**/
  43.     }

  44.     public int getAge()
  45.     {
  46.         return age;
  47.     }
  48.     public String toString()
  49.     {
  50.         return name+"::"+age;
  51.     }
  52. }
复制代码
以上代码中的31行,打印输出结果为什么是:lisi0::30 ?这个值怎么从构造函数中传到toString函数中了呢?

我觉得值就是接收到了构造函数里面。其它toString和compareTo函数 我没有发现调用他们的语句 怎么就执行了呢?


5 个回复

正序浏览
你应该在脑子里走一遍 System.out.println(new Student("lisi0",30)); 这段代码是怎样执行的。
首先,打印语句里面是new Student("lisi0",30),new 关键字分配内存空间,调用构造函数,
但是,新生成的对象并没有放进ts.add()方法里面,所以并没有调用compareTo方法,因为TreeSet确定元素唯一性是判断元素compareTo()方法是否return 0。
生成好对象之后,自然就是System.out.ptintln()打印了,自动调用new Student("lisi0",30)的toString()方法,你重写了toString()方法,自然就打印lisi0::30
回复 使用道具 举报
罗海云 发表于 2013-2-14 09:38
应该是因为你是实现了comparable接口, 覆盖了他的方法.. 会自动调用compareTo比较..然后就返回了. ...

请问代码中的getAge()函数在什么时候用到了?
回复 使用道具 举报
不需要手动调用。
回复 使用道具 举报
System.out.println(new Student("lisi0",30)); //输出结果为什么是:lisi0::30 ?这个值怎么从构造函数中传到toString函数中了呢?
        //朋友,        System.out.println(new Student("lisi0",30));的实质就是
        //System.out.println(new Student("lisi0",30).toString());
回复 使用道具 举报
应该是因为你是实现了comparable接口, 覆盖了他的方法.. 会自动调用compareTo比较..然后就返回了.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马