码迷,mamicode.com
首页 > 编程语言 > 详细

Java中包含继承关系时对象的创建与销毁顺序详解(附源码)

时间:2016-07-13 13:59:28      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:

前言


      通过组合和继承方法来创建新类时,永远不必担心对象的清理问题,子对象通常都会留给垃圾回收器进行处理。如果确实遇到清理的问题,那么必须用心为新类创建dispose()方法(在这里我选用此名称,读者可以提出更好的)。并且由于继承的缘故,如果我们有其他作为垃圾回收一部分的特殊清理动作,就必须在导出类中覆盖dispose()方法。当覆盖被继承类的dispose()方法时,务必记住调用基类版本dispose()方法;否则,基类的清理动作就不会发生。下例就证明了这一点:

示例源码


package com.mufeng.theeighthchapter;

class Characteristic {// 特征
	private String s;

	public Characteristic(String s) {
		// TODO Auto-generated constructor stub
		this.s = s;
		System.out.println("Creating Characteristic " + s);
	}

	protected void dispose() {
		System.out.println("disposing Characteristic " + s);
	}
}

class Description {// 描述
	private String s;

	public Description(String s) {
		// TODO Auto-generated constructor stub
		this.s = s;
		System.out.println("Creating Description " + s);
	}

	protected void dispose() {
		System.out.println("disposing Description " + s);
	}
}

class LivingCreature {// 生物
	private Characteristic p = new Characteristic("is alive");
	private Description t = new Description("Basic Living Creature");

	public LivingCreature() {
		// TODO Auto-generated constructor stub
		System.out.println("LivingCreature()");
	}

	protected void dispose() {
		System.out.println("LivingCreature dispose");
		t.dispose();
		p.dispose();
	}
}

class Animal extends LivingCreature {// 动物
	private Characteristic p = new Characteristic("has heart");
	private Description t = new Description("Animal not Vegetable");

	public Animal() {
		// TODO Auto-generated constructor stub
		System.out.println("Animal()");
	}

	protected void dispose() {
		System.out.println("Animal dispose");
		t.dispose();
		p.dispose();
		super.dispose();
	}
}

class Amphibian extends Animal {// 两栖动物
	private Characteristic p = new Characteristic("can live in water");
	private Description t = new Description("Both water and land");

	public Amphibian() {
		// TODO Auto-generated constructor stub
		System.out.println("Amphibian()");
	}

	protected void dispose() {
		System.out.println("Amphibian dispose");
		t.dispose();
		p.dispose();
		super.dispose();
	}
}

public class Frog extends Amphibian {// 青蛙
	private Characteristic p = new Characteristic("Croaks");
	private Description t = new Description("Eats Bugs");

	public Frog() {
		// TODO Auto-generated constructor stub
		System.out.println("Frog()");
	}

	protected void dispose() {
		System.out.println("Frog dispose");
		t.dispose();
		p.dispose();
		super.dispose();
	}

	public static void main(String[] args) {
		Frog frog = new Frog();
		System.out.println("Bye!");
		frog.dispose();
	}

}


输出结果


Creating Characteristic is alive
Creating Description Basic Living Creature
LivingCreature()
Creating Characteristic has heart
Creating Description Animal not Vegetable
Animal()
Creating Characteristic can live in water
Creating Description Both water and land
Amphibian()
Creating Characteristic Croaks
Creating Description Eats Bugs
Frog()
Bye!
Frog dispose
disposing Description Eats Bugs
disposing Characteristic Croaks
Amphibian dispose
disposing Description Both water and land
disposing Characteristic can live in water
Animal dispose
disposing Description Animal not Vegetable
disposing Characteristic has heart
LivingCreature dispose
disposing Description Basic Living Creature
disposing Characteristic is alive


源码解析


       层次结构中的每个类都包含CharacteristicDescription这两种类型的成员对象,并且它们也必须被销毁。所以万一某个子对象要依赖于其他对象,销毁的顺序应该和初始化顺序相反。对于字段,则意味着与声明的顺序相反(因为字段的初始化是按声明的顺序进行的)。对于基类(遵循C++中析构函数的形式),应该首先对于其导出类进行清理,然后才是基类。这是因为导出类的清理可能会调用基类中的某些方法,所以需要使基类中的构件仍起作用而不应该过早地销毁它们。从输出结果可以看到,Frog对象的所有部分都是按照创建的逆序进行销毁的。
       在这个例子中可以看到,尽管通常不必执行清理工作,但是一旦选择要执行,就必须谨慎和小心。




Java中包含继承关系时对象的创建与销毁顺序详解(附源码)

标签:

原文地址:http://blog.csdn.net/u013693649/article/details/51896450

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!