我的问题基于以下事实:
- 每当我们创建子类时,即使调用了父类(super class)构造函数,也不会创建父类(super class)对象。
- 如果子类中定义了finalize()方法,则也必须调用super.finalize()。
这一切都很好。但是当我使用jvisualjvm
(在JDK安装的/bin目录下 - 我没有看到任何创建的父类(super class)对象实例,这正如我所期望的那样。父类(super class)对象当我们创建它的子类实例时,它并没有被创建。
My question: What does GC clear up on part of the super class?
如果双击并打开jvisualjvm
,您可以看到(如果您使用Thread.sleep(forEnoughTimeToCheck_jvisualjvm)
停止程序)...您将不会在那里找到父类(super class)实例,只有子类......可能只是引用。那么GC每次都会清除父类(super class)引用吗?
I have seen many many blogs and posts on SO but I haven't seen any of them explain what GC clears up on part of super class.
最佳答案
So does the GC clears up the super class reference whenever it does?
不存在对父类(super class)实例的引用之类的东西。有两个类,例如
class Super {
int a;
}
class Sub extends Super {
int b;
}
和new Sub()
你会得到一个包含字段a
和b
的对象。所有这些父类(super class)内容仅在某些地方有趣,例如访问 sub.a
或 instanceof
检查。
Whenever we create a sub class, the superclass object is not created even if the super class constructor is invoked.
是的...像 new Sub()
这样的调用会做三件事:
- 它为一个足以容纳两个
int
的对象分配空间 - 它通过调用
Super#Super
的代码来初始化它的一部分 - 它通过调用
Sub#Super
的代码来初始化它的一部分
对 Sub
构造函数主体中包含或暗示的 super()
的调用根本不进行分配,只是进行初始化。
GC 根本不关心。它所需要的只是知道哪里是对其他对象的引用(在我的示例中没有任何地方,因为只有原始字段)。
If finalize() method is defined in subclass then super.finalize() must be called also.
finalize
是一种特殊方法,它会进行特殊处理,但同样,如果 Sub#finalize
覆盖 Super#finalize
,则后者将变为不相关(除非从前者明确调用,它应该是,但那是另一个故事)。
请注意,finalize
很少使用,可能只用于百万分之一的对象。你不应该覆盖它,除非你知道你确实需要它。这不是 GC 的基础。
关于java - 如果不是父对象,那么在 super.finalize() 方法之后 GC 会在父对象上清除什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31105907/