2013-10-04 22 views
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 

回答

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的一个实例。它并不关心它是由编译器合成的。

+0

是的。我忘了......创建静态变量和实例变量之间存在巨大差异。 – Kevik

1

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

只要关联的MainClass实例处于有效状态,实例就有资格进行垃圾回收。发生这种情况是因为匿名内部类实例对封闭类实例具有隐式引用。