黑马程序员技术交流社区

标题: 构造函数传值问题 [打印本页]

作者: 郭孟涛    时间: 2013-2-14 03:26
标题: 构造函数传值问题
本帖最后由 郭孟涛 于 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函数 我没有发现调用他们的语句 怎么就执行了呢?



作者: 罗海云    时间: 2013-2-14 09:38
应该是因为你是实现了comparable接口, 覆盖了他的方法.. 会自动调用compareTo比较..然后就返回了.
作者: 陈科宇    时间: 2013-2-14 14:58
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());
作者: 陈科宇    时间: 2013-2-14 14:58
不需要手动调用。
作者: 郭孟涛    时间: 2013-2-15 23:37
罗海云 发表于 2013-2-14 09:38
应该是因为你是实现了comparable接口, 覆盖了他的方法.. 会自动调用compareTo比较..然后就返回了. ...

请问代码中的getAge()函数在什么时候用到了?
作者: 王钊    时间: 2013-2-16 11:48
你应该在脑子里走一遍 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




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