这是来自Android开发人员网站的示例代码:

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的匿名类?

为了比较:
在这段代码中

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类型的对象。以前的代码是什么情况?

最佳答案

new DownloadImageTask()是否创建DownloadImageTask类的对象


是。因为它是一个内部类,它将隐式地将当前的封闭实例传递给(隐藏的)构造函数,但这与构造函数调用稍有不同。

匿名类创建表达式始终在括号中使用new Something() { ... }

section 15.9.1 of the JLS


  如果类实例创建表达式以类主体结尾,则实例化的类是匿名类。

09-28 06:31