package Initialization;
class Tank{
int howFull = 0;
Tank() { this(0);}
Tank(int fullness){
howFull = fullness;
}
void sayHowFull(){
if(howFull == 0)
System.out.println("Tank is empty!");
else
System.out.println("Tank filling status : " + howFull);
}
void empty(){
howFull = 0;
}
protected void finalize(){
if(howFull != 0){
System.out.println("Error: Tank not empty." + this.howFull);
}
//Normally,you'll also do this:
//Super.finalize(); //call the base-class version
}
}
public class TankTest {
public static void main(String[] args) {
Tank tank1 = new Tank();
Tank tank2 = new Tank(3);
Tank tank3 = new Tank(5);
tank2.empty();
//Drop the reference,forget to cleanup:
new Tank(6);
new Tank(7);
System.out.println("Check tanks:");
System.out.println("tank1:");
tank1.sayHowFull();
System.out.println("tank2:");
tank2.sayHowFull();
System.out.println("tank3");
tank3.sayHowFull();
System.out.println("first forced gc()");
System.gc();
System.out.println("try deprecated runFinalizerOnExit(true)");
System.runFinalizersOnExit(true);
System.out.println("last forced gc():");
System.gc();
}
}
运行结果如下:
Check tanks:
tank1:
Tank is empty!
tank2:
Tank is empty!
tank3
Tank filling status : 5
first forced gc()
Error: Tank not empty.7
Error: Tank not empty.6
try deprecated runFinalizerOnExit(true)
last forced gc():
Error: Tank not empty.5
System.runFinalizersOnExit()方法是指当应用程序退出时对所有对象执行终结方法。包括有引用的对象和没有通过引用的对象,而System.gc()垃圾回收方法仅回收那些没有引用指向的对象。
分享到:
相关推荐
下面是一个使用 finalize 方法的示例代码: ```java public class FinalizationDemo { public static void main(String[] args) { Cake c1 = new Cake(1); Cake c2 = new Cake(2); Cake c3 = new Cake(3); c2 ...
其中,关键字 protected 是防止在该类之外定义的代码访问 finalize() 标识符。 在使用 finalize() 方法时,需要注意以下几点: 1. finalize() 方法的调用是不确定的,JVM 不保证 finalize() 一定被调用。 2. ...
在上面的代码示例中,我们可以看到一个简单的finalize()方法的实现。这个类名为FinalizeEscapeGC,它覆盖了finalize()方法,并在其中执行了一些打印语句。在main方法中,我们首先创建了一个FinalizeEscapeGC对象,...
综上所述,为了编写更加高效、可靠的Java代码,应当避免依赖`finalize()`方法来释放资源。取而代之,应充分利用现代Java版本提供的特性,如try-with-resources语句,以确保资源的正确管理和释放。同时,理解垃圾收集...
Java中的`finalize()`方法是Java语言提供的一种机制,用于在对象被垃圾回收之前进行资源清理。这个方法在Java的`Object`类中被定义为`protected`类型,因此所有Java类都能够覆盖它来实现特定的清理操作。在垃圾回收...
下面是一个简单的示例代码,演示了finalize方法的应用: ```java public class FinalizeTest { private static FinalizeTest ft = null; public void info() { System.out.println("测试资源清理的finalize方法...
因为finalize方法是由垃圾回收线程调用,和用户代码的线程不是同一个线程,可能会导致线程安全问题。 最后,finalize方法还存在异常处理问题。如果finalize方法抛出异常,垃圾回收线程会捕获并丢弃异常,而不会将其...
当一个对象不再被引用且即将被垃圾回收器(GC)回收时,如果该对象实现了 `finalize` 方法,那么在 GC 执行前,会调用该对象的 `finalize` 方法。然而,`finalize` 的使用并不推荐,原因有以下几点: 1. **不可靠...
Java 技术允许使用finalize() 方法在垃圾收集器将对象从内存中清除出去 之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对 象调用的。它是在Object 类中定义的,因此所有的类都...
Java中的`finalize()`方法是对象生命周期的一部分,它与C++中的析构函数类似,但在功能和调用时机上有所不同。`finalize()`方法是在对象被GC标记为可回收并准备释放之前调用的,提供了在对象被彻底删除前执行某些...
- 如果实现了`Finalize`方法,则应该在`Dispose`方法中调用`GC.SuppressFinalize(this)`来抑制`Finalize`方法的执行,以避免重复释放资源。 - `Dispose`方法应该能够释放所有非托管资源。 - 当`Dispose`方法完成...
### Java极品学习资料知识点概述 #### 一、运行程序之前 **Path与Classpath图解** - **Path**: 指向系统可执行文件的位置,如JDK的bin目录。 - **Classpath**: 指定Java虚拟机查找类文件...- 示例代码说明`write`方法...
下面是一个使用finalize()方法的示例代码: ```java public class FinalizerTest { public static void main(String[] args) throws InterruptedException { User user = new User(); user = null; System.gc()...
然而,尽管Java的垃圾回收机制在大多数情况下可以正常工作,但有时我们需要对某些特定对象的清理进行特殊处理,这时`finalize`方法就显得尤为重要。 `finalize`是Java中Object类的一个方法,它的设计初衷是为了提供...
这个引用对象专门为带finalize方法的类服务,可以理解为每一个有相应的方法的对象,其都会封装为一种finalRefernece对象. 因为finalize方法是object定义的,其默认实现为空.那么如果重写了此方法,那么方法体...
在Java编程语言中,`final`, `finally`, 和...而 `finalize` 则是一个与垃圾回收相关的特殊方法,虽然不推荐直接使用,但在特定场景下可以帮助清理资源。在Java面试中,理解和掌握这些关键字的用法是非常基础且重要的。
"css3finalize"可能指的是一个工具或库,用于帮助开发者完成CSS3代码,尤其是自动添加浏览器厂商前缀,以确保在不同浏览器中的兼容性。 【描述详解】 描述中的"Automatically add vendor prefixes"是关键点,它提到...
在API_day01的练习代码中,你可能会看到如何使用这些类和方法的实例,通过编写和运行这些代码,你可以更好地理解和掌握这些概念。同时,这些实践也会帮助你在实际项目中更有效地处理时间和对象相关的问题。
最后,`finalize()` 方法是一个特殊的方法,用于对象被垃圾回收之前进行清理工作。这个方法在对象被垃圾收集器销毁之前自动调用,但并不保证一定会执行,因为垃圾回收的行为是不确定的。一般不推荐直接使用 `...
final 关键字用于限制变量、方法和类的修改和继承,finally 块用于异常处理中的清理操作,finalize 方法用于垃圾回收器执行内存对象清理时的清理工作。了解这三个关键字的区别可以帮助我们更好地编写 Java 代码,...