在java中,创建和初始化捆绑在一起进行,在创建一个变量或对象时,实际上也就在进行初始化
finalize:
工作原理:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存
finalize的需求是:释放通过某种创建对象方法以外的方式为对象分配的存储空间(在java中调用非java代码,如C)
finalize中包含终结条件的验证会使得缺陷容易被发现,比如说针对cup,清理它的终结条件是杯子必须是空的
protected void finalize(){
if(full){
//ERROR LOG
}
}
垃圾回收器如何工作:
1.引用计数法:这种方法在对象之间存在循环引用时存在bug
2.自适应的,分代的,停止-复杂,标记-清扫
成员变量初始化:
定义时的初始化和构造器初始化,前者先进行
对象的创建过程
这个可以参照P96,下面是一些摘记
静态对象被初始化的前提是他们尚未因前面的对象创建过程而被初始化,因为静态对象只会被初始化一次
当使用new 关键字创建对象时,首先在堆/栈上分配空间,这块存储空间会被清零,这也就自动完成了基本类型的初始化
静态块:
static{
i=47;
}
跟静态初始化一样,只是把多个变量的初始化放在了一起
非静态实例的初始化:
{
mug1 = new Mug(1);
mug2 = new Mug(2);
}
这段在类中出现的程序将会在成员变量之后、构造函数之前执行。用于支持匿名"内部类"的初始化,使得你无论调用了哪个构造器,某些操作都会发生(因为在构造函数之前执行)。
this关键字:
Banana a = new Banana();
a.peel(1);
上面的两句话在编译器中的表现形式为Banana.peel(a,1);
如果需要在peel方法内部获取对当前对象的引用,则需要用this关键字,因为peel(a,1)中的a对程序员是不可见的
有时可能想在构造器中调用另一个构造器(不能调用超过两个),可用this实现
当形参和成员变量同名时,可用this区分 this.name = name;
java初始化顺序
见cap5_initialization_EX.test.InitOrder/staticInitlizition
当新建一java对象(如new B())时,它的内部初始化顺序为:
1. 父类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行
2. 子类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行
3. 父类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行
4. 父类构造方法
5. 子类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行
6. 子类构造方法
Finalize:
见cap5_initialization_EX.test.Finalize
可变参数列表VarArgs:
见cap5_initialization_EX.test.VarArgs
enum枚举:
见cap5_initialization_EX.test.Size/SizeTest
找不到上传附件的功能,就用图片代传了,大家只要将此文件保存并将后缀名改为rar就可以了
http://hi.csdn.net/attachment/201105/22/0_1306068571px70.gif