这也是匿名派生类的一个例子吗? (java基础知识)

时间:2013-08-20 08:27:21

标签: java android

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

2 个答案:

答案 0 :(得分:3)

  

new DownloadImageTask()创建DownloadImageTask

的对象

是。因为它是一个内部类,它会隐式地将当前的封闭实例传递给(隐藏)构造函数,但这对构造函数调用来说甚至有点不寻常。

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

来自section 15.9.1 of the JLS

  

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

答案 1 :(得分:3)

它创建了DownloadImageTask的对象。

如果它看起来像这样,那将是一个匿名类:

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