我在某处读过每个方法都可以重载。
的finalize()
当然是一种方法。但在搜索时我也发现你不能重载这个方法。
所以问题是我们可以重载finalize()方法吗?如果是那么它是如何实现的?
答案 0 :(得分:7)
是的,你可以。但是JVM不会调用重载版本。
@Override
protected void finalize() throws Throwable
{
super.finalize();
}
protected void finalize(String lol) throws Throwable
{
finalize();
}
答案 1 :(得分:4)
您可以重载finalize
方法,这将成功编译:
public class Test
{
public void finalize(String hi)
{
System.out.println("test");
}
}
然而,它不会被垃圾收集器和JVM调用,因为它将调用没有参数的那个。
GC和JVM将始终只使用签名
调用finalize
protected void finalize() throws Throwable
解决方法强>
您可以简单地覆盖finalize
并使用参数调用方法:
public class Test
{
public static void main(String args[])
{
new Test();
System.gc();
}
@Override
public void finalize() throws Throwable
{
super.finalize();
this.finalize("allo");
}
public void finalize(String hi)
{
System.out.println(hi);
}
}
那会打印allo
。这样你就可以在你想要的地方拨打finalize(String hi)
,当你覆盖finalize()
来调用它时,GC也会调用它。
答案 2 :(得分:1)
您可以毫无问题地重载finalize方法。这是另一个例子:
public class FinalizeOverloader {
protected void finalize(String userId) {
System.out.println("I could overload finalize...");
}
public static void main(String[] args) {
FinalizeOverloader fO = new FinalizeOverloader();
fO.finalize("AbC");
}
}
答案 3 :(得分:1)
方法重载在同一&子类,而覆盖仅在子类中完成。由于它们的重要性,我们会覆盖其他Object类方法(equals(),hashCode()等),但绝不会重载任何这些方法。
因此,当你重载finalize()
方法时,它就像你的子类中的一个新方法,并且不会被JVM考虑(真的是作为finalize()方法)。
答案 4 :(得分:0)
虽然像其他任何方法一样可以重载finalize(),但我没有看到这样做的重点。 JVM不会调用该方法,即使这不是你的目标,重载它也只会产生混淆。
另一方面,如果你的意思是覆盖,它可能会更有意义,但强烈建议不要这样做。使用终结器有许多缺点。有关更多信息,您可以在Joshua Bloch" Effective Java"中找到一些好的建议(第7项)。书。它基本上说,避免使用终结器。