代碼 new Thread(new Runnable() {...}).start(); 中究竟是「匿名對象傳入匿名對象」還是「匿名類傳入匿名對象」?本文從語法本質剖析兩者區別,消除概念模糊。
new Thread( new Runnable() { ... } ).start();
// │ │ │
// │ │ └─ 實現 Runnable 接口的匿名內部類
// │ └─ 作為 Thread 構造參數的對象(即上述匿名類的實例)
// └─ Thread 匿名對象(無變量引用)
| 術語 | 定義 | 本例中的體現 |
|---|---|---|
| 匿名類 | 無類名、繼承類或實現接口、僅用一次的類定義 | new Runnable() {...} 實現了 Runnable 接口 |
| 匿名對象 | 無變量引用、僅用一次的對象實例 | new Thread(...) 和 new Runnable() {...} 產生的實例均為匿名對象 |
這是一個匿名對象(Thread 實例)調用 start(),其構造參數是另一個匿名對象(Runnable 實現類的實例),該實例來源於匿名類定義。 簡記:「外層 new Thread 是匿名對象,內層 new Runnable 是匿名類產生的匿名對象」。
new Thread(() -> {...}).start(); 更簡潔。