繁体   English   中英

为什么我从此Java程序获取以下输出?

[英]Why i am getting following output from this java program?

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,请解释为什么?

MyThread来自构造函数

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

本质上, run()方法(显示baz )在您的main覆盖

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

它正在执行MyThread构造函数,然后执行run()方法。

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

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

然后启动线程t.start(); ,它将执行在main(String[] args)已覆盖的run()方法:

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

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

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

请尝试以下操作:

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

看看会发生什么!

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

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

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

输出:

线程foo

Thread t = new MyThread() ;

输出:

MyThread栏

请注意,第一个覆盖了run()方法并在其中使用了自定义消息,但是第二个覆盖了MyThread类中的默认run()

创建Thread t时,您将覆盖run方法。 此新实现将打印“ foo”,它比您在类MyThread中实现的优先级更高,该类仍运行自己的构造函数,该构造函数将打印“ MyThread”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM