翁凯Java讲义概要(六)

<1>清除:收尾和垃圾收集
垃圾收集机制只知道怎样释放有new分配的内存,所以它不知道如何释放对象的"特殊"内存.
一旦垃圾收集机制准备释放对象占用的存储空间,它首先调用finalize().
但是finalize()和c++的析构函数截然不同:
1>垃圾收集不等于析构.
2>对象可能不会被当作垃圾被收集.
3>垃圾收集只跟内存有关.
<2>成员初始化
Java goes out of its way to guarantee that any variable is properly initlialized before it is used.
由于任何方法都可以初始化或使用那个数据,所以在正式使用数据前,若喊是强迫程序员将其一一初始化成一个适当的值,就可能不够实际,因此一个类的所有primitive数据数据成员都会保证获得一个缺省值,当然句柄会获得一个null值.
什么是null?
什么是句柄?
<3>定义初始化(在c++不允许)一个直接做法是在定义数据成员的同时为其赋值.
eg:class Measurement{
boolean b=ture;
char c='z';
Depth d=new Depth();
}
可以调用一个方法进行初始化
eg:class Clnit{
int i=f();
}
当然这个方法也可以使用参数
eg:class Clnit{
int i=f();
int k=g(i);
}
但是那些参数不能是尚未初始化的其他数据成员.
eg:class ClnitWrong{
int i=g(i);
int i=f();
}
<4>初始化的顺序
在一个类里,初始化的顺序是由变量在类内的定义顺序决定的,即使变量定义大量遍布于方法定义中间,那些变量仍然会在调用任何方法之前得到初始化--当然在构造函数之前.
<5>静态数据初始化
class与对象(一个是规则一个是实体)
Everything is object.
静态数据成员总在这个类的第一个对象要创建的时候便初始化.
Case:StaticInitizlization.java
//StaticInitizlization.java
class Bowl{

Bowl(int marker){
System.out.println(
"Bowl("+marker+")");
}

void f(int marker){

System.out.println(
"f("+marker+")");
}
}

class Table{

static Bowl b1=new Bowl(1);

Table(){

System.out.println(
"Table()");
b2.f(1);
}

void f2(int marker){

System.out.println(
"f2("+marker+")");
}

static Bowl b2=new Bowl(2);
}

class CupBoard{

Bowl b3=new Bowl(3);

static Bowl b4=new Bowl(4);

CupBoard(){

System.out.println(
"CupBoard()");
b4.f(2);
}

void f3(int marker){

System.out.println(
"f3("+marker+")");
}

static Bowl b5=new Bowl(5);
}

public class StaticInitialization{

public static void main(String args[]){

System.out.println(
"Creating new CupBoard() in main");
new CupBoard();

System.out.println(
"creating new Cupboard()" );
new CupBoard();

}

static Table t2=new Table();
static CupBoard t3=new CupBoard();
}
初始化顺序
1>类型为Dog的一个对象首次创建时,或者Dog类的静态方法数据首次访问时,Java解释器必须找到Dog.class.
2>找到Dog.class后,它的所有的静态初始化模块都会运行.因此静态初始化仅发生一次.
3>创建一个new Dog()时, new语句首先会在堆里分配一足够的空间.
4>这个空间将会被清除为零,因此Dog中的所有的数据成员都得到了缺省值.
5>执行定义初始化.
6>执行构造函数(先静后动).
显式初始化
Java允许我们将其他静态初始化工作划分到类内一个特殊的
"静态构造从句"(有叫"静态块")
Java1.1可以用类似的方法初始化非静态数据成员.


lunzi   2005-10-21 18:42:14 评论:0   阅读:1401   引用:0

发表评论>>

署名发表(评论可管理,不必输入下面的姓名)

姓名:

主题:

内容: 最少15个,最长1000个字符

验证码: (如不清楚,请刷新)

Copyright@2004-2010 powered by YuLog