2013-05-27 62 views
1
class MyThread extends Thread 
{ 
    MyThread() 
    { 
     System.out.print(" MyThread"); 
    } 
    public void run() 
    { 
     System.out.print(" bar"); 
    } 
    public void run(String s) 
    { 
     System.out.println(" baz"); 
    } 
} 
public class TestThreads 
{ 
    public static void main (String [] args) 
    { 
     Thread t = new MyThread() 
     { 
      public void run() 
      { 
       System.out.println(" foo"); 
      } 
     }; 
     t.start(); 
    } 
} 

您好,我是在java中新目前正在学习多线程,当我运行上面的程序,然后我得到这个特定的输出MyThread的富请解释一下为什么?为什么我从这个Java程序获得以下输出?

+0

那你觉得呢? – cHao

回答

4

MyThread的来自构造

来自run方法时start()被称为其被调用。

本质上run()方法(打印巴兹)是main重写

run(String s)重载方法,这在这里没有意义。

1

据执行MyThread构造函数,然后执行该方法run()

Thread t = new MyThread(),您正尝试创建一个MyThread对象,因此它会执行构造函数。

MyThread() 
{ 
    System.out.print(" MyThread"); 
} 

然后你开始线程t.start();,它执行run()方法,你在main(String[] args)已覆盖:

public void run() 
{ 
    System.out.println(" foo"); 
} 
1

首先创建的MyThread一个实例,它调用构造函数并打印“MyThread的” 。然后,您致电t.start();,它调用run方法。

即使您定义了一个run方法打印“条”,它将被main方法(打印“foo”)中的方法覆盖。

尝试以下操作:

Thread t = new MyThread(); 
t.start(); 

看看会发生什么!

1

的原因是,第一,当创建对象调用构造函数MyThread并打印字符串的第一部分。当你开始线程时,执行继续运行方法并打印foo

1

MyThread的默认构造内的第一输出,和它覆盖一个run()方法:

Thread t = new MyThread() 
     { 
      public void run() 
      { 
       System.out.println(" foo"); 
      } 
     }; 

输出:

螺纹FOO

Thread t = new MyThread() ; 

输出:

MyThread的 酒吧

注意,第一个你推翻了run()方法和使用它里面的自定义消息,但第二个将默认在覆盖run()MyThread class。

0

当您创建Thread t时,您正在重写run方法。这个新的实现打印出“foo”,它优先于你在MyThread类中实现的那个,它仍然运行着自己的构造函数,打印出“MyThread”。

相关问题