这是来自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:
如果类实例创建表达式以类主体结尾,则实例化的类是匿名类。