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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 尘埃落定 中级黑马   /  2014-7-26 15:08  /  1015 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请见代码中的注释部分,求答案。

  1. package p_0726;
  2. class Test extends Thread
  3. {
  4.         private String name;
  5.         Test(String name)
  6.         {
  7.                 this.name=name;
  8.         }
  9.         public void run()
  10.         {
  11.                 for (int x = 0;x < 60 ;x++ )
  12.                 {
  13.                         System.out.println(getName()+"--run---x="+x);
  14.                 }                                        //此处的getName怎么不是构造函数初始化的名字?        
  15.         }                                                //this.name=name;改成 super(name)就可以打印出构造函数初始化的名字,啥情况?
  16. }
  17. class ThreadDemo
  18. {
  19.         public static void main(String[] args)
  20.         {
  21.                 Test t1 = new Test("thread_1");
  22.                 Test t2 = new Test("thread_2");
  23.                 t1.start();
  24.                 t2.start();

  25.                 for (int y = 0;y < 60 ;y++ )
  26.                 {
  27.                         System.out.println("main-----y="+y);
  28.                 }
  29.         }
  30. }
复制代码


3 个回复

倒序浏览
子类中没有重写父类的getName()方法,当你调用这个方法时,它获取的是父类中的name值(也就是继承来的值);当你使用super(name)时,是通过父类中的构造方法对name进行初始化,所以在使用getName()方法就可以获取正确的name值了。

希望能帮到你!
回复 使用道具 举报
Thread类中的方法被final所修饰,所以不能被重写,修改线程名两种方式,一种是通过超类的构造方法,第二种是通过setName();方法。
回复 使用道具 举报
chen010yu 发表于 2014-7-26 19:47
子类中没有重写父类的getName()方法,当你调用这个方法时,它获取的是父类中的name值(也就是继承来的值) ...

有道理......:)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马