2010-11-28 57 views
5

我目前正在學習Java課程,並遇到一些令人困惑的代碼。Java可運行問題

例子:

Runnable runnable = new Runnable() 
     { 
      public void run() 
      { 
       //doStuff 
      } 
     }; 

我真的不明白這是什麼代碼正在做什麼。

run方法如何與一個類的實例關聯?

我搜索了一下「Runnable」,發現它是一個接口。我是通過在大括號之間聲明run方法來實現接口嗎?這可以在java中的任何接口完成嗎?

我可以使用一些鏈接/解釋。謝謝!

+2

+1猜測發生了什麼事情。從你已經知道的邏輯上推斷是發展的核心技能。 – SLaks 2010-11-28 22:25:26

回答

8

這是一個匿名內部類這是實現接口Runnable。是的,你可以用這種方式實現任何接口,儘管在任何情況下你會或不會有這樣的理由(缺乏可重用性在「不會」列中是很大的一個)。更多關於匿名類here,但它基本上這是一個方便的形式:

// Define it 
class Foo implements Runnable 
{ 
    public void run() 
    { 
     // Do stuff 
    } 
} 

// And then use it 
Runnable runnable = new Foo(); 

...提供Foo是內(或「嵌套」)類。更多關於嵌套類here

2

是的,你通過聲明運行來實現接口。是的,它可以爲任何接口完成。

這通常是在將實現傳遞給期望接口類型參數的方法並且沒有適當的聲明類時完成的。你可以在現場實現接口,並運行代碼。很簡約。

2

我搜索了一下「Runnable」,發現它是一個接口 。我在 執行界面通過 聲明方括號之間的曲線 ?這可以在java中的任何 接口完成嗎?

是的!

此代碼正在實例化一個實現Runnable的對象。因爲我們實際上不能構造一個接口,所以任何試圖這樣做的代碼都必須在大括號中提供接口方法的實現。我們並沒有真正瞭解Java創建的實現Runnable的類(這些是抽象的術語)。

如果你要做到以下幾點:

Runnable runnable = new Runnable() 
     { 
      public void run() 
      { 
       System.out.println("I'm running"); 
      } 
     }; 
runnable.run(); 

您將看到「我跑」作爲輸出。

0

在某些情況下,此示例代碼將是有益的.... test runna = new test()

class test implements Runnable{ 
     test(){ 
      Thread t = new Thread(this); 
      t.start(); 
     } 
     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      while(true){ 
       try { 
        Thread.sleep(3000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       System.out.print("asd"); 
      } 
     } 

    }