2013-05-27 159 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」。

相關問題