2013-08-20 21 views
1

這是從Android開發網站一個示例代碼:這也是一個匿名派生類的例子嗎? (Java基礎)

public void onClick(View v) { 
    new DownloadImageTask().execute("http://example.com/image.png"); 
} 

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { 
    /** The system calls this to perform work in a worker thread and 
     * delivers it the parameters given to AsyncTask.execute() */ 
    protected Bitmap doInBackground(String... urls) { 
     return loadImageFromNetwork(urls[0]); 
    } 

    /** The system calls this to perform work in the UI thread and delivers 
     * the result from doInBackground() */ 
    protected void onPostExecute(Bitmap result) { 
     mImageView.setImageBitmap(result); 
    } 
} 

在此,在線路new DownloadImageTask().execute("http://example.com/image.png");,並new DownloadImageTask()創建DownloadImageTask類的對象,或者它創建擴展DownloadImageTask一個annonymous類?

對於比較:
在該代碼中,

public void onClick(View v) { 
    new Thread(new Runnable() { 
     public void run() { 
      Bitmap b = loadImageFromNetwork("http://example.com/image.png"); 
      mImageView.setImageBitmap(b); 
     } 
    }).start(); 
} 

從Thread類派生的類的對象已取得和實例化,但不保存對它的引用(這使得它,以便它以後不能再使用),而不是Thread類型的對象。前代碼中的情況如何?

回答

3

確實new DownloadImageTask()創建DownloadImageTask

是的對象。因爲它是一個類,所以它會隱式地將當前的封閉實例傳遞給(隱藏的)構造函數,但這就是構造函數調用甚至稍有不同之處。

匿名類創建表達式始終使用帶有大括號的new Something() { ... }

section 15.9.1 of the JLS

如果類別實例創建表達式中的一類的身體末端,然後被實例化的類是匿名類。

3

它創建DownloadImageTask的一個對象。

這將是一個匿名類,如果它看起來像這樣:

new DownloadImageTask(){ ... }.execute()