0

下面的代码是使用匿名类实现的对象的实例化。

我不太清楚的是匿名类创建的对象的确切寿命。

线

PictureCallback jpegCallback;

创建一个 PictureCallback 类型的变量并将名称 jpegCallback 分配给它。该变量是 MainClass 类的成员变量。

接下来,它实例化一个 PictureCallback 类型的新对象并将其存储到 jpegCallback 变量中。

我不明白这段代码到底是什么时候执行的。因为 PictureCallback jpegCallback 变量是 MainClass 的成员,所以它看起来必须在类加载器加载 MainClass 时创建,同时它是 MainClass 的其他成员变量和静态变量。

因此,如果这是真的,那么必须以与静态内部类或静态变量相同的方式创建 PictureCallback 匿名类。在运行时开始。

匿名对象必须像静态对象一样存在,因为如果它在运行时中间停止存在,那么如果调用回调方法,则覆盖方法中定义的操作将不会发生,因为该对象不再存在。

我最好的猜测是,当 MainClass 被加载时,这个对象就像一个静态对象一样被创建,它会一直持续到 MainClass 被销毁。

有人可以解释这个匿名类对象何时存在,何时被垃圾收集器清除或不再可访问?

 public class MainClass extends Activity {

     PictureCallback jpegCallback = new PictureCallback() {

           @Override void onPictureTaken(byte[], data, Camera camera){

              // some action performed

           }

     }

 } // end of MainClass
4

2 回答 2

2

我不明白这段代码到底是什么时候执行的

每当执行一个实例时MainClass。请注意,创建的每个实例MainClass将依次创建匿名类的新实例。

因为 PictureCallback jpegCallback 变量是 MainClass 的成员,所以它看起来必须在类加载器加载 MainClass 时创建,同时它是 MainClass 的其他成员变量和静态变量。

一点都不。它不是静态变量,因此在初始化时不会初始化它 - 它仅在初始化实例时才初始化。

因此,如果这是真的,那么必须以与静态内部类或静态变量相同的方式创建 PictureCallback 匿名类。在运行时开始。

我希望在MainClass创建第一个实例时初始化类本身。

我最好的猜测是,当 MainClass 被加载时,这个对象就像一个静态对象一样被创建,它会一直持续到 MainClass 被销毁。

不,它的处理方式与任何其他实例变量一样。MainClass假设没有其他对该对象的引用,则当实例符合垃圾回收条件时,它将符合垃圾回收条件。

你可以把你的代码想象成这样:

public class MainClass extends Activity {

     PictureCallback jpegCallback;

     public MainClass() {
         jpegCallback = new PictureCallback() {
              @Override void onPictureTaken(byte[], data, Camera camera) {
                  // some action performed
              }

         };
     }
}

这有帮助吗?不要忘记,就运行时而言,匿名类只是一个扩展PictureCallback并引用MainClass. 它并不关心它是由编译器合成的。

于 2013-10-04T05:42:19.957 回答
1

使用PictureCallback 每个实例创建一个实例MainClass(它在实例字段中声明和初始化)。

只要关联的MainClass实例存在,该实例就有资格进行垃圾回收。这是因为匿名内部类实例具有对封闭类实例的隐式引用。

于 2013-10-04T05:45:02.130 回答