Java中的finalize方法

Java中的finalize方法,java,garbage-collection,Java,Garbage Collection,可能重复: finalize方法是用受保护的范围定义的,那么,像垃圾收集器这样的其他对象怎么可能调用它呢。因为垃圾收集器是语言规范的一部分,因此可以执行语言规范所说的任何操作。因为垃圾收集器是语言规范的一部分,因此可以执行语言规范所说的任何操作说明书上说它可以。那是真的。就像那样。就像protected和private不一样,垃圾收集器可以访问它,即使它是private 受保护与私有不同,垃圾回收器可以访问它,即使它是私有的 从Java语言规范的角度来看,垃圾收集器不是对象,也不受正常访问规则

可能重复:


finalize方法是用受保护的范围定义的,那么,像垃圾收集器这样的其他对象怎么可能调用它呢。

因为垃圾收集器是语言规范的一部分,因此可以执行语言规范所说的任何操作。

因为垃圾收集器是语言规范的一部分,因此可以执行语言规范所说的任何操作说明书上说它可以。

那是真的。就像

那样。就像

protected和private不一样,垃圾收集器可以访问它,即使它是private


受保护与私有不同,垃圾回收器可以访问它,即使它是私有的


从Java语言规范的角度来看,垃圾收集器不是对象,也不受正常访问规则的控制。它是“JVM的一部分”,可以做普通Java代码做不到的事情。(事实上,它可能根本没有实现为Java代码!)


想想看。如果GC需要符合访问规则,那么它将无法在标记阶段访问对象的
私有
字段,因此无法确定对象是否可访问。换句话说,它将无法满足JLS对内存管理的要求。

从Java语言规范的角度来看,垃圾收集器不是一个对象,不受正常访问规则的控制。它是“JVM的一部分”,可以做普通Java代码做不到的事情。(事实上,它可能根本没有实现为Java代码!)


想想看。如果GC需要符合访问规则,那么它将无法在标记阶段访问对象的
私有
字段,因此无法确定对象是否可访问。换句话说,它将无法满足JLS对内存管理的要求。

虽然GC不使用这种机制(它根据自己的规则运行),但仅仅因为方法是私有的,并不意味着即使从类外部也不能执行它,请参见AccessibleObject.setAccessible(boolean);这也适用于访问字段。访问修饰符用于控制类的正常使用。虽然GC不使用这种机制(它按照自己的规则运行),但仅仅因为方法是私有的,并不意味着即使从类外部也不能执行它,请参见AccessibleObject.setAccessible(布尔);这也适用于访问字段。访问修饰符用于控制类的正常使用。