黑马程序员技术交流社区

标题: 获取线程对象自定义名称的问题 [打印本页]

作者: 刘士林    时间: 2012-10-31 21:04
标题: 获取线程对象自定义名称的问题
class Test extends Thread
{
private String name;
Test(String name)
{
  this.name=name;
}
public void run()
{
    System.out.println(this.getName());//打印的是Thread-0
}
class Test extends Thread
{

Test(String name)
{
  super(name);
}
public void run()
{
    System.out.println(this.getName());//打印的是自定义的name
}
为什么用this.name=name;时,打印的线程名称就是默认的
而用super(name);时,打印的就是自定义的呢?
毕老师说,Thread类中已定义好了给线程起名字的方法,可以直接调用,但是Test继承Thread之后
它其中也就有了getName()方法,它的返回值肯定是rerurn this.name,而本类中就有name属性,为什么不返回,却返回默认名呢?
就算调用super(name)方法,它其中应该也是this.name=name,为什么就能打印出自定义的线程名称?

作者: jsfjb    时间: 2012-10-31 21:33
如果 要是在这儿你想说是this.name=name,后 调用 getName 方法 打印出this.name的值,那么您就要重写getName的方法。
您调用的getName的方法只是调用的父类的方法,父类的方法调用的是父类的元素。而super(name)则,把参数传给了父类。所以调用getname可以查看出来。
我想应该是这样的。
作者: 林志进    时间: 2012-11-1 00:04
        private String name;
        Test(String name) {
                super(name);       // 如果只用super(name),你会发现一点,下面的打印打语句打印出来的name为null
              System.out.println(name)
              // this.name=name;除非赋值以后再打印名字才会出来。这说明了一点,你这个对象调用getName方法实际上根本与你该对象本身无关。
                                           //调用的实际上父类的方法,父类调用的其实就是子类对象赋值给父类的属性,通过super
    如果想子类自己调用的话,需要重写。但是Thread类的getName是final修饰的,所以只能新写个函数了。。




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