第七章:
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