可以在 Java 中重载 finalize() 方法吗
Can finalize() method be overloaded in Java
我在某处读到过每个方法都可以重载。
finalize()
当然是一种方法。但是在搜索时我也发现你不能重载这个方法。
所以问题是我们可以重载finalize()方法吗?如果是那么它是如何实现的?
您可以重载 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)
,GC 也会调用它,因为你覆盖了 finalize()
来调用它。
是的,你可以。但是JVM不会调用重载版本。
@Override
protected void finalize() throws Throwable
{
super.finalize();
}
protected void finalize(String lol) throws Throwable
{
finalize();
}
您可以毫无问题地重载 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");
}
}
方法重载在相同的&childclass中完成,而覆盖在[=中完成19=] class 而已。由于它们的重要性,我们确实覆盖了其他 Object class 方法(equals()、hashCode() 等),但从不重载任何这些方法。
因此,虽然您可以重载 finalize()
方法,但它就像 child class 中的新方法一样,不会被 JVM 考虑(作为确实是 finalize() 方法)。
虽然可以像任何其他方法一样重载 finalize(),但我不认为这样做有什么意义。 JVM 不会调用该方法,即使这不是您的目标,重载它也只会产生混乱。
另一方面,如果您的意思是覆盖,它可能更有意义,但强烈不推荐这种方法。使用终结器有很多缺点。有关详细信息,您可以在 Joshua Bloch 的 "Effective Java" 书中找到一些好的建议(第 7 项)。它基本上说,避免使用终结器。
我在某处读到过每个方法都可以重载。
finalize()
当然是一种方法。但是在搜索时我也发现你不能重载这个方法。
所以问题是我们可以重载finalize()方法吗?如果是那么它是如何实现的?
您可以重载 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)
,GC 也会调用它,因为你覆盖了 finalize()
来调用它。
是的,你可以。但是JVM不会调用重载版本。
@Override
protected void finalize() throws Throwable
{
super.finalize();
}
protected void finalize(String lol) throws Throwable
{
finalize();
}
您可以毫无问题地重载 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");
}
}
方法重载在相同的&childclass中完成,而覆盖在[=中完成19=] class 而已。由于它们的重要性,我们确实覆盖了其他 Object class 方法(equals()、hashCode() 等),但从不重载任何这些方法。
因此,虽然您可以重载 finalize()
方法,但它就像 child class 中的新方法一样,不会被 JVM 考虑(作为确实是 finalize() 方法)。
虽然可以像任何其他方法一样重载 finalize(),但我不认为这样做有什么意义。 JVM 不会调用该方法,即使这不是您的目标,重载它也只会产生混乱。
另一方面,如果您的意思是覆盖,它可能更有意义,但强烈不推荐这种方法。使用终结器有很多缺点。有关详细信息,您可以在 Joshua Bloch 的 "Effective Java" 书中找到一些好的建议(第 7 项)。它基本上说,避免使用终结器。