首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

第五章-初始化与清算

2012-09-07 
第五章-初始化与清理一、方法传值????? 在方法调用中,如果传入的数据类型(实际参数类型)小于方法中声明的形

第五章-初始化与清理

一、方法传值

????? 在方法调用中,如果传入的数据类型(实际参数类型)小于方法中声明的形式参数类型,实际数据类型就会被提升。char类型略有不同,如果无法找到恰好接受char参数的方法,就会把char直接提升至int类型。

????? 相反,如果传入的实际参数较大,就得通过类型转换来执行窄化转换,否则编译器就会报错。

?

二、finalize()与垃圾回收

????? Java允许在类中定义一个名为finalize()的方法:一旦垃圾回收器准备好释放对象占用的储存空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

????? 之所以要有finalize(),是由于在分配内存时可能采用了类似C语言中的做法,而非Java中的通常做法。这种情况主要发生在使用“本地方法”的情况下,本地方法是一种在Java中调用非Java代码的方式。在非Java代码中,也许会调用C的malloc()函数系列来分配存储空间,而且除非用了free()函数,否则存储空间将得不到释放,从而造成内存泄漏。当然,free()是C和C++中的函数,所以需要在finalize()中用本地方法调用它。

????? 至此,读者或许已经明白了不要过多使用finalize()的道理了,它确实不是进行普通的清理工作的合适场所。

????? 在Java的“垃圾回收机制”中,如果Java虚拟机并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的。因此,垃圾回收器可能永远也无法被调用,即使被调用,它也可能以任何它想要的顺序来回收对象。最好的办法是除了内存以外,不能依赖垃圾回收器去做任何事情。如果需要进行清理,最好是编写自己的清理方法,但不要用finalize()。

?

三、对象的创建过程,假设有个名为Dog的类(暂不考虑继承):

????? 1.即使没有显式地使用static关键字,构造器实际上也是静态方法。因此,当首次创建类型为Dog的对象时,或者Dog类的静态方法/静态域首次被访问时,Java解释器必须查找类路径,以定位Dog.class文件。

????? 2.载入Dog.class(这将创建一个Class对象),有关静态初始化的所有动作都会执行。因此,静态初始化只在Class对象首次加载的时候进行一次。

????? 3.当用new Dog()创建对象的时候,首先将在堆上为Dog对象分配自购的存储空间。

????? 4.存储空间被清零,这就自动将Dog对象中的所有基本类型数据都设置成了默认值。

????? 5.执行所有出现于字段定义处的初始化动作。

????? 6.执行构造器。

热点排行