黑马程序员技术交流社区

标题: 关于Thread(String name)的问题 [打印本页]

作者: dicegame    时间: 2013-7-27 00:05
标题: 关于Thread(String name)的问题
  1. package qbb;

  2. class PrimeThread extends Thread{
  3.         PrimeThread(String name){
  4.                 super(name);
  5.         }
  6.         public void run(){
  7.                 for(int x =0; x < 3; x++){
  8.                         System.out.println(this.getName() + " run---" + x);
  9.                 }
  10.         }
  11. }
  12. class ThreadDemo extends Thread{
  13.         ThreadDemo(String name){
  14.                 super(name);
  15.         }
  16.         public void run(){
  17.                 for(int x =0; x < 3; x++){
  18.                         System.out.println(this.getName() + " run---" + x);
  19.                 }
  20.         }
  21.        
  22. }
  23. public class ThreadTest {

  24.         public static void main(String[] args) {
  25.                 PrimeThread t1 = new PrimeThread("PrimeThread one");
  26.                 PrimeThread t2 = new PrimeThread("PrimeThread two");
  27.                 ThreadDemo d1 = new ThreadDemo("ThreadDemo one");
  28.                 t1.start();
  29.                 t2.start();
  30.                 d1.start();
  31.                 for(int x =0; x < 3; x++){
  32.                         System.out.println("main---" + x);
  33.                 }
  34.         }
  35. }
复制代码
运行结果:
main---0
main---1
main---2
PrimeThread two run---0
PrimeThread two run---1
PrimeThread two run---2
PrimeThread one run---0
PrimeThread one run---1
PrimeThread one run---2
ThreadDemo one run---0
ThreadDemo one run---1
ThreadDemo one run---2

下面的这段代码有点不明白
PrimeThread(String name){
        super(name);
    }
构造器是用来初始化对象属性的
那么super(name);是给Thread类的对象命名
运行结果显示该对象把名称传给了PrimeThread类的对象
可构造体没有传递name的代码啊,why?


作者: 无气打火机    时间: 2013-7-27 00:23
在主程序创建线程的对象的时候,把线程的名称传给了构造器,但是这个构造器调用了父类的构造器,super(name),
这样就把你传给构造器的这个值再次传给了父类的构造器,查看API你会发现父类Thread里面的构造方法有一个
Tread(String name){} 这个代码就是分配一个新的Thread 他的名称就是你传进来的那个名称,
所以你会看到现在这种情况。
希望能解答你的问题
作者: dicegame    时间: 2013-7-27 00:36
无气打火机 发表于 2013-7-27 00:23
在主程序创建线程的对象的时候,把线程的名称传给了构造器,但是这个构造器调用了父类的构造器,super(name ...

对,现在是想创建一个PrimeThread类的对象(为了理解我们用A来标记)并为该对象命名
因此调用PrimeThread(String name)方法
该方法又调用了super(name)方法,即Thread(name)方法
该方法创建了一个名称为name的Thread对象(我们用B来标记)
问题是B是怎么把名称name传递给A的???
作者: 草貌路飞    时间: 2013-7-27 00:52
调用了从父类继承而来的getName方法
作者: の放下执著    时间: 2013-7-27 01:19
PrimeThread(String name){
        super(name);
    }
super(name);调用父类Thread类的构造函数,实际上就是调用了这个构造方法:Thread(String name) 分配新的 Thread 对象。这样就把name值付给了类Thread中的一个成员变量。当你调用this.getName();方法时,实际上也是调用了Thread类中的getName()方法,因为子类PrimeThread根本就没有定义过这个方法。getName()方法 返回的就是线程的名称。
作者: xwf4348    时间: 2013-7-27 07:35
super(name)调用了父类Thread类的构造函数,即这个构造方法:Thread(String name) 分配新的 Thread 对象。这样就把name值付给了类Thread中的一个成员变量。
当你调用this.getName()时,因为子类中自己未定义,所以就直接调用了父类Thread类中的getName方法。
作者: dicegame    时间: 2013-7-27 21:51
草貌路飞 发表于 2013-7-27 00:52
调用了从父类继承而来的getName方法

谢谢,明白了:lol
作者: dicegame    时间: 2013-7-27 21:52
の放下执著 发表于 2013-7-27 01:19
PrimeThread(String name){
        super(name);
    }

谢谢啊,说的很详细,这下彻底懂了




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