gpt4 book ai didi

java - 这个匿名类对象什么时候被创建和访问,什么时候被垃圾回收?

转载 作者:行者123 更新时间:2023-12-01 23:31:41 26 4
gpt4 key购买 nike

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

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

线

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

最佳答案

what i don't understand is exactly when is this code executed

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

Because the PictureCallback jpegCallback variable is a member of MainClass it looks like it must be created when the MainClass is loaded by the class loader, at the same time as it's other member variables and static variables of MainClass.

不,一点也不。它不是静态变量,因此在初始化时不会对其进行初始化 - 它仅在实例初始化时进行初始化。

so if this is true then the PictureCallback anonymous class must be created in the same way as a static inner class or a static variable. at the beginning of runtime.

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

my best guess is that this object is created like a static object as the MainClass is loaded and it continues until the MainClass is destroyed.

没有。它的处理方式与任何其他实例变量一样。假设没有其他对该对象的引用,当 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实例的引用的类。它并不真正关心它是由编译器合成的。

关于java - 这个匿名类对象什么时候被创建和访问,什么时候被垃圾回收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19174054/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com