为什么我从这个java程序获得以下输出?

时间:2013-05-27 06:00:35

标签: java multithreading

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 foo 请解释原因?

6 个答案:

答案 0 :(得分:4)

MyThread 来自构造函数

foo 来自run方法,该方法在调用start()时被调用。

基本上run()方法(打印 baz )在main中被覆盖

并且run(String s)重载的方法,此处没有任何意义。

答案 1 :(得分: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");
}

答案 2 :(得分:1)

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

即使你定义了一个run方法打印“bar”,它也会被main方法中的那个覆盖(打印“foo”)。

尝试以下方法:

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

看看会发生什么!

答案 3 :(得分:1)

原因是首先调用create对象构造函数MyThread并打印字符串的第一部分。启动线程时,继续执行run方法并打印foo

答案 4 :(得分:1)

MyThread 的默认构造函数中的第一个输出,覆盖 run()方法:

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

输出:

  

线程foo

Thread t = new MyThread() ;

输出:

  

MyThread的   酒吧   

请注意,首先您覆盖run()方法并在其中使用自定义消息,但第二个将在 MyThread 类中默认覆盖run()

答案 5 :(得分:0)

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