下面的代码是使用匿名类实现的对象的实例化。
我不太清楚的是匿名类创建的对象的确切生命周期。
行
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
答案 0 :(得分: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
的实例。它并不真正关心它是由编译器合成的。
答案 1 :(得分:1)
使用PictureCallback
的每个实例创建MainClass
实例(它在实例字段中声明并初始化)。
只要关联的MainClass
实例,该实例就有资格进行垃圾回收。这是因为匿名内部类实例具有对封闭类实例的隐式引用。