编写具有finalize( )方法的类 编写具有finalize( )方法的类,并在方法中打印相关信息.在main( )中为该类创建一个对象,试解释这个程序的行为. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 自己刚才写的程序如下,简单解释请看注释.public class GcTest { private String name; public GcTest(String name){ this.name=name; System.out.println(name+ "建立"); } //对象回收前执行 protected void finalize(){ System.out.println(name+ "被回收"); } public static void main(String[] args){ GcTest obj1=new GcTest("对象一"); GcTest obj2=new GcTest("对象二"); GcTest obj3=new GcTest("对象三"); obj1=null;//标识对象为null obj2=null; obj3=null; System.gc(); while(true);//不断执行程序,以让垃圾收集在程序结束前有机会执行 }}这是一个涉及java垃圾回收和finalize()的小程序.在java中,我们可以使用system.gc()建议程序进行垃圾收集,如果建议被采纳,则对象资源会被回收,回收前会执行finalize()方法.请注意:在一般的程序里,finalize()真正被执行的时间是不知道的.不相当c++里的析构函数! finalize()不被建议使用,因为1、finalize()的执行时间不确定,具体根据不同版本的JVM和不同垃圾回收策略有关2、finalize()中抛出的任何异常都将被忽略Effective JAVA 中介绍finalize()的作用有两个1、作为释放资源的安全网,在JDK,OutputStream等流中,如果使用者万一忘了关闭流,finalize()还可以最终得到一次关闭的机会(注意,不要指望靠它关,它只能作为一种备用策略)。2、JNI调用的外部资源,在JAVA里没有直接关闭的代码,写在finalize()中。子类一旦复写了finalize(),必须super.finalize(),否则父类的finalize()不执行。根据楼主的描述,我觉得不会有什么反应。 补充2楼1.所有对象被Garbage Collection时自动调用,比如运行System.gc()的时候.2.程序退出时为每个对象调用一次finalize方法。3.显式的调用finalize方法除此以外,正常情况下,当某个对象被系统收集为无用信息的时候,finalize()将被自动调用,但是jvm不保证finalize()一定被调用,也就是说,finalize()的调用是不确定的,这也就是为什么sun不提倡使用finalize()的原因. java垃圾回收都是自动在一定时间运行的,有可能是程序运行的间隙,也有可能是程序运行结束后,这个时间确实不能确定,所以java才会有垃圾自动回收机制 [技术讨论]谈谈Android开发中的Java。 print和printf的问题、 UML中的接口 求一个关于验证文件路径的正则表达式 rmi找不到stub。 帮忙看看这段代码 求教!急!当有一工程完成以后,要这工程弄成一班的安装软件,拿到其他机子上安装后,也可以运行!急! 应该非常容易的问题!不管你懂不懂进来看看,大家交流交流也好! 关于类 java中如何调用c写的dll? 我要这样在控制台输出咋办:System.out.print("sum = %s , %s) ",proName, MyVersion); 一个比较诡异的JAVA问题
public class GcTest { private String name;
public GcTest(String name){
this.name=name;
System.out.println(name+ "建立");
}
//对象回收前执行
protected void finalize(){
System.out.println(name+ "被回收");
}
public static void main(String[] args){
GcTest obj1=new GcTest("对象一");
GcTest obj2=new GcTest("对象二");
GcTest obj3=new GcTest("对象三");
obj1=null;//标识对象为null
obj2=null;
obj3=null;
System.gc();
while(true);//不断执行程序,以让垃圾收集在程序结束前有机会执行
}
}
这是一个涉及java垃圾回收和finalize()的小程序.在java中,我们可以使用system.gc()建议程序进行垃圾收集,如果建议被采纳,则对象资源会被回收,回收前会执行finalize()方法.
请注意:
在一般的程序里,finalize()真正被执行的时间是不知道的.不相当c++里的析构函数!
1、finalize()的执行时间不确定,具体根据不同版本的JVM和不同垃圾回收策略有关
2、finalize()中抛出的任何异常都将被忽略Effective JAVA 中介绍finalize()的作用有两个
1、作为释放资源的安全网,在JDK,OutputStream等流中,如果使用者万一忘了关闭流,finalize()还可以最终得到一次关闭的机会(注意,不要指望靠它关,它只能作为一种备用策略)。
2、JNI调用的外部资源,在JAVA里没有直接关闭的代码,写在finalize()中。子类一旦复写了finalize(),必须super.finalize(),否则父类的finalize()不执行。根据楼主的描述,我觉得不会有什么反应。
2.程序退出时为每个对象调用一次finalize方法。
3.显式的调用finalize方法除此以外,正常情况下,当某个对象被系统收集为无用信息的时候,finalize()将被自动调用,但是jvm不保证finalize()一定被调用,也就是说,finalize()的调用是不确定的,这也就是为什么sun不提倡使用finalize()的原因.