您的位置:首页 > 编程语言 > Java开发

Java编程思想第四版第五章学习(3)

2016-05-11 20:21 302 查看
1.在构造器中调用构造器(Java编程思想第四版P86)

notice:

(1) 构造器Flower(String s, int petals)表明:尽管可以用this调用一个构造器,但却

不能调用两个。此外,必须将构造器调用置于最起始处,否则编译器会报错。

(2) 当参数s的名称和数据成员s的名字相同,可以使用this.s来代表数据成员。

(3) 除构造器外,编译器禁止在其他任何地方中调用构造器。

Flower构造器如下:

Flower(String s, int petals){
this(petals);
//!  this(s); //Can't call two!
this.s = s ; //Another use of “this”
....
}


2.清理:终结处理和垃圾回收

(1)在C++中,对象一定会被销毁(如果程序中么有缺陷),但在Java中,对象并非总是被

垃圾回收。或者说,垃圾回收不等于C++中的“析构”。

(2)在Java中,允许在类中定义一个名为finalize()的方法,其工作原理是,一旦垃圾回

收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾

回收动作发生时,才真正回收对象占用的空间。

(3)为啥要用finalize():因为在分配内存时可能采用了“本地方法”,即在Java中调用非

Java代码的方式。(目前支持C和C++,而C和C++可以调用其他语言写的代码。)如果调用

了C语言中的malloc()函数,而没有调用free()函数,那么内存空间得不到释放,此时需要

在finalize()中用本地方法调用free()。

3.垃圾回收器如何工作

关键技术:(1)引用记数 (2)自适应方法:停止-复制,标记-清扫

4.成员初始化

(1)类的数据成员是基本类型的,默认初始化。

(2) 变量也可指定初始化或通过构造器和方法完成初始化。

(3) 在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定

义之间,它们仍然会在任何方法(包括构造器)被调用之前得到初始化。例如,Java编程

思想第四版P94。

(4)静态数据的初始化,解读P95的例子。

a. 要执行main方法,必须先加载StaticInitialization,加载过程中,发现有静态变量

table,首先执行static Table table = new Table()。newTable()需要实例化Table,必须先加载Table类。加载Table类的过程中,

发现Table类也有静态变量,首先执行static Bowl b1 = new Bowl(1);过程和上面一样,要去创建Bow1。

创建之前加载Bow1类,加载完毕,调用Bow1的构造方法,于是打印出“Bowl(1)” b1实例化(创建)完成。

然后执行static Bowl b2 = new Bowl(2); 再次调用Bow1构造方法,打印“Bowl(2)”。

这时候Table类加载完毕,开始实例化t2变量,调用Table类构造方法,打印“Table()”。

执行b2.f(1); 打印“f(1)”

b. 道理和上面a一样,只是在Cupboard中,static变量初始化完毕之后,还要去初始化一

个非static变量bowl3。依次打印出”Bowl(4)”,”Bowl(5)”,”Bowl(3)”。再调用Cupboard类

构造方法,打印”Cupboard()”。执行bowl4.f1(2),打印“f1(2)”。最后执行main中的方法,

注意的是,此时Table,Cupboard这2个类的加载过程已经完成,之后创建这2个类的实例

的过程中,不再去初始化static变量。

(5) 显示的静态初始化

Java允许将多个静态初始化动作组织成一个特殊的“静态子句”(静态块)。

例如:

static Cup cup1;
static Cup cup2;
static {
cup1 = new Cup(1);
cup2 = new Cup(2);
}


(6) 非静态实例初始化子句


{
mug1 = new Mug(1);
mug2 = new Mug(2);
System.out.print("mug1 & mug2 initialized");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 编程