Java初始化与清理

来源:互联网 发布:淘宝上论文查重靠谱吗 编辑:程序博客网 时间:2024/05/21 10:24

在Java中,资源的初始化采用构造器(constructor)的方式,构造器需要程序员定义。资源的清理由“垃圾回收器”完成,而不必像C或C++中一样,需要程序员手动释放new出的资源。


一 、 Java构造器

1 从概念上讲,“初始化”和“创建”是相互独立的动作,而在Java中,这两者被捆绑在一起,由构造器来完成。

2 构造器是一个静态函数,该函数与类的名称相同(每个方法首字符小写的编程风格不适用于构造器)。构造器并不返回任何东西(新建对象的引用由new表达式返回)。

3 函数的重载被大量应用于构造器。(函数重载是指使用相同的函数名来实现不同的函数操作,算是一种函数级别的“多态”。函数重载要求函数参数列表中的参数个数不同,或者是参数的数据类型不同。需要注意的是,函数返回值的不同不是决定重载的指标)。通过函数重载,程序员可以定义多种不同的构造器来构造对象。

4 默认情况下,如果程序员没有定义构造器,则编译器会自动定义一个默认构造器,如果用户定义了构造器,则编译器不会额外定义构造器。


二、 this关键字

同一个类的对象共享类的方法,当同一个类的不同对象调用相同的方法时,如何区分是哪个对象调用了方法呢?事实上,当对象调用方法时,编译器会“暗自”将表达对象引用的this作为第一个参数传递给方法。


三、垃圾回收

1 Java允许在类中定义一个名为finallize()的方法,一旦垃圾回收器准备回收对象,那么首先会调用对象的finallize方法,之后在下次垃圾回收动作发生时,再真正的回收对象。因此,finallize方法可以进行一些清理操作。但实际上,Java中的对象并不需要程序员手动释放,之所以要有finallize,是由于在分配对象的时候,使用了类似C语言的做法,即Java调用了C或者C++的方法,C或者C++申请的空间需要使用free或者delete来释放,这些操作可以在finallize中完成。


2 垃圾回收的工作方式

垃圾回收对于提高对象的分配速度具有明显的效果,因为垃圾回收器工作时,一面回收空间,一面使堆中的对象尽量紧凑的排列。通过垃圾回收器对对象的重新排列,实现了一种高速的、有无限空间可供分配的堆模型。


要想深入的了解Java的垃圾回收,先了解其他系统中的垃圾回收机制将会很有帮助。

—— 引用计数:这是一种简单但是速度很慢的垃圾回收机制。每个对象都含有一个“引用计数器”,当有一个引用指向对象时,计数器加1,当引用离开作用域或者被置为null时,计数器减一。这种方式简答但是开销大,因为垃圾回收器在整个程序运行期间不断遍历所有对象的引用列表,如果引用数量为0则清除对象。此外,这个方法还有个缺陷,就是对于“循环引用”而言,对象无法被回收。所以,这种机制没有被应用到任何Java虚拟机中。

——另一种较快的方式,其思想是,对于任何“活”的对象,一定能追溯到其存活在堆栈或者静态存储区中的引用。因此,这种方式从堆栈和静态存储区开始,遍历所有引用,这样就会形成一个“引用网络”,网络中的对象都是存活的,其他对象都需要被清理。这种方法也解决了“循环引用”的问题。

在这种方式下,Java采用了“自适应”的垃圾回收技术,包括两种策略,即“停止-复制”和“标记-清扫”。

停止-复制是指停止当前运行的程序,然后将所有存活的对象复制到另一块区域,复制后的对象是紧凑排列的,这有助于快速、简单的分配空间。

标记-清扫会遍历引用网,给所有活的对象一个标记,之后清扫所有没有标记的对象。

Java的自适应技术是指,当垃圾比较多的时候,Java垃圾回收器使用“停止-复制”模式,当程序处于稳定状态,只有很少垃圾产生时,则使用“标记-清扫”模式,所以,Java的垃圾回收器是“自适应”的。


四 初始化

1 对象中的字段初始化顺序是先静态变量初始化,然后非静态对象初始化。

2 一个对象在实例化时的工作:

(1)定位并载入class文件。

(2)静态初始化。

(3)在堆上分配空间。

(4)堆空间被清零,对象的非静态属性会被赋予一个默认值。

(5)执行出现在字段定义处的初始化操作。

(6)执行构造器。

原创粉丝点击