【ThinkingInJava】4、关于finalize()的调用

/**
* 书本:《Thinking In Java》
* 功能:关于finalize()的调用
* 文件:TerminationCondition.java
* 时间:2014年10月6日17:49:09
* 作者:cutter_point
*/

package Lesson5InitializationAndCleanUp;

class Book
{
	boolean checkedOut=false;	//检验是否已经是知道的
	Book(boolean checkOut)	//构造函数
	{
		checkedOut=checkOut;	//初始化
	}
	//这里定义一个方法
	void checkIn()
	{
		checkedOut=false;	//查找出来定义为假
	}

	//当程序结束被垃圾回收的时候,调用默认调用这个
	protected void finalize()		//继承自Object
	{
		if(checkedOut)	//如果被检测出来了
		{
			System.out.println("错误:检测出来!");
		}
		else	//没有检测出来
		{
			System.out.println("这个已经被签入");
		}
	}
}

//主函数
public class TerminationCondition
{
	public static void main(String [] args)
	{
		Book novel=new Book(true);	//这是还没有被回收的
		novel.checkIn();	//改为false
		new Book(true);	//匿名构造一个对象
		new Book(false);
		System.gc();	//回收垃圾
	}
}

//从结果上看,只出来了            这个被回收了! 和      错误:检测出来!
//说明这个只有匿名对象创建的时候才会调用finalize

输出结果:

这个已经被签入

错误:检测出来!

时间: 2024-11-12 17:33:42

【ThinkingInJava】4、关于finalize()的调用的相关文章

什么导致Finalize方法被调用

Finalize方法在垃圾回收结束时被调用,下面有5种事件会导致开始垃圾回收 1.第0代已满    第0代已满,垃圾回收会自动开始.该事件是目前导致Finalize方法被调用的最常见的一种方式,因为虽然应用程序的运行并分配新对象,这个事件会自然而然的发生. 2.代码显示调用System.GC的静态方法Collect   代码可以显示的请求CLR执行垃圾回收.虽然Microsoft强烈建议不要这样做,但某些时候还是必要的. 3.Windows报告内存不足   CLR内部使用Win32 Create

java gc的调用机制 和编程规则

一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能提高整个应用程序的性能.本文将从GC的工作原理.GC的几个关键问题进行探讨,最后提出一些Java程序设计建议,如何从GC角度提高Java程序的性能. GC的基本原理        GC是什么? 为什么要有GC呢?     GC是垃圾收集的意思(Garbage Collection),内存处理是编程人员容易出现问题的

[java]final关键字、finally关键字与finalize()方法

final关键字: final关键字通常指的是“无法改变的”,使用“无法改变”这样修饰可能出于两个原因:设计或者效率. final可以修饰变量.方法和类. 一.final变量 一个既是static又是final的域只占据一段不能改变的存储空间. 当对对象引用而不是基本类型运用final修饰时,其含义会有一点迷惑.对于基本类型,final使数值恒定不变.而用于对象引用,final使引用恒定不变.一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象.然而,对象自身却是可以修改的,java并未

System.gc()与Object.finalize()的区别

finalize()是由JVM自动调用的,你可以用System.gc(),但JVM不一定会立刻执行,JVM感觉内存空间有限时,才会开始执行finalize(),至于新的对象创建个数和被收集个数不同是因为收集的对象只和JVM的垃圾收集策略有关. 1.构造函数 要点: 构建器(Constructor)属于一种较特殊的方法类型,因为它没有返回值.这与 void返回值存在着明显的区别.对于void返回值,尽管方法本身不会自动返回什么,但仍然可以让它返回另一些东西.构建器则不同,它不仅什么也不会自 动返回

Java中的finalize方法理解

首先:system.gc()并不是你调用就马上执行的, 而是根据虚拟机的各种算法来来计算出执行垃圾回收的时间,另外,程序自动结束时不会执行垃圾回收的. 其次:对象被回收时,要经过两次标记,第一次标记,如果finalize被重写,或者finalize被调用过,那么垃圾回收并不会去执行finalize,第二次标记,如果对象不能在finalize中成功拯救自己,那真的就要被回收了. 咱们用的虚拟机一般都是sun的hotspot,以下描述都是针对hotspot虚拟机,当然其他虚拟机也差不多, ,,他是根

java---final、finally、finalize的区别

Java finalize方法使用 标签: javaappletobjectwizardjvm工作 2011-08-21 11:37 48403人阅读 评论(5) 收藏 举报  分类: Java(96)  <JAVA编程思想>: Java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize(). (1).对象不一定会被回收. (2).垃圾回收不是析构函数. (3).垃圾回收只与内存有关. (4).垃圾回收和finalize()都是靠不住的,只要JVM还没有快到耗

java基础知识分析: final , finally,finalize

final final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为 abstract的,又被声明为final的.将变量或方法声明为final,可以保证它们在使用中不被改变.被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改.被声明为final的方法也同样只能使用,不能重载 具体的用法: 1.         修饰基础数据成员的final 这是final的主要用途,该成员被修饰为常量,意味着

java finalize方法

程 序员都了解初始化的重要性,但常常会忘记同样重要的清除工作.毕竟,谁需要清除一个int 呢?但在使用程序库时,把一个对象用完后就“弃之不顾”的做法并非总是安全的.当然,Java有垃圾回收器来回收无用对象占据的内存资源.但也有特殊情 况:假定你的对象(并非使用 new)获得了一块“特殊”的内存区域,由于垃圾回收器只知道释放那些经由 new分配的内存,所以它不知道该如何释放该对象的这块 “特殊”内存. 为了应对这种情况,Java允许你在类中定义一个名为finalize( )的方法.它的工作原理“应

java的finalize()函数

在说明finalize()的用法之前要树立有关于java垃圾回收器几个观点: "对象可以不被垃圾回收" : java的垃圾回收遵循一个特点, 就是能不回收就不会回收.只要程序的内存没有达到即将用完的地步, 对象占用的空间就不会被释放.因为如果程序正常结束了,而且垃圾回收器没有释放申请的内存, 那么随着程序的正常退出, 申请的内存会自动交还给操作系统; 而且垃圾回收本身就需要付出代价, 是有一定开销的, 如果不使用,就不会存在这一部分的开销. 垃圾回收只能回收内存, 而且只能回收内存中由