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

第七章:

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值