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

读 《think in java》 有感 -- 第(七)章

2014-03-08 19:40 288 查看
第七章:

1.finalize的调用:当类A继承类B后,如果不在finalize()中使用super.finalize()则B的finalize方法将不会调用。

//FinalizeTest.java
public class FinalizeTest {

static class MainTestor
{
public static void main(String[] args) {
new Class3();
System.runFinalizersOnExit(true);
}
}
}

class Class1
{
@Override
protected void finalize() throws Throwable {
// TODO Auto-generated method stub

System.out.println("Class1 finalize");
//super.finalize();
}
}

class Class2 extends Class1
{
@Override
protected void finalize() throws Throwable {
// TODO Auto-generated method stub

System.out.println("Class2 finalize");
//!删除调用 super.finalize();
}
}

class Class3 extends Class2
{
@Override
protected void finalize() throws Throwable {
// TODO Auto-generated method stub

System.out.println("Class3 finalize");
super.finalize();
}
}

输出:

Class3 finalize

Class2 finalize

7.7.3 构建器内部的多形性方法的行为

在父类中调用动态绑定的方法,当调用方法操作了本类的成员变量时,可能会造成子类成员变量初始化的调用问题。

(1)在采取其他任何操作之前,为对象分配的存储空间初始化成二进制零。

(2)如果在父类中调用abstrace 方法的时候,事实上这个时候调用的是子类中覆盖的方法。

(3)这个时候子类的方法由于没有进行初始化,那么将出现变量初始化异常eg:i = 0(见(1)).

//: PolyConstructors.java
// Constructors and polymorphism
// don't produce what you might expect.

abstract class Glyph {
abstract void draw();
Glyph() {
System.out.println("Glyph() before draw()");
draw();
System.out.println("Glyph() after draw()");
}
}

class RoundGlyph extends Glyph {
int radius = 1;
RoundGlyph(int r) {
radius = r;
System.out.println(
"RoundGlyph.RoundGlyph(), radius = "
+ radius);
}
void draw() {
System.out.println(
"RoundGlyph.draw(), radius = " + radius);
}
}

public class PolyConstructors {
public static void main(String[] args) {
new RoundGlyph(5);
}
} ///:~


输出结果:

Glyph() before draw()

RoundGlyph.draw(), radius = 0

Glyph() after draw()

RoundGlyph.RoundGlyph(), radius = 5
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: