从头认识java6.3 组合使用聚合和继承

这一章节我们来讨论一些组合使用聚合和继承

之前已经讲过想过的基础知识以及注意点,现在我们直接上代码:

1.例子

 

package com.ray.ch05;

public class PlaceSetting extends Custom {
	private DinnerPlate dinnerPlate;
	private Spoon spoon;
	private Fork fork;
	private Knife knife;

	public PlaceSetting(int i) {
		super(i);
		dinnerPlate = new DinnerPlate(i + 1);
		spoon = new Spoon(i + 1);
		fork = new Fork(i + 1);
		knife = new Knife(i + 1);
		System.out.println(done);
	}

	public static void main(String[] args) {
		new PlaceSetting(9);
	}
}

class Plate {
	public Plate(int i) {
		System.out.println(create Plate);
	}
}

class DinnerPlate extends Plate {
	public DinnerPlate(int i) {
		super(i);
		System.out.println(create DinnerPlate);
	}
}

class Utensil {
	public Utensil(int i) {
		System.out.println(create Utensil);
	}
}

class Spoon extends Utensil {
	public Spoon(int i) {
		super(i);
		System.out.println(create Spoon);
	}
}

class Fork extends Utensil {
	public Fork(int i) {
		super(i);
		System.out.println(create Fork);
	}
}

class Knife extends Utensil {
	public Knife(int i) {
		super(i);
		System.out.println(create Knife);
	}
}

class Custom {
	public Custom(int i) {
		System.out.println(create Custom);
	}
}

输出:

 

create Custom
create Plate
create DinnerPlate
create Utensil
create Spoon
create Utensil
create Fork
create Utensil
create Knife
done

 

上面就是一个同时使用聚合以及继承的典型的例子。

上面的例子体现了我们之前所说的有参数继承的初始化和聚合对象。

再次强调:编译器不会给对象初始化成new,只会初始化为null,因此这一点大家必须注意。

 

2.对象的清理以及清理顺序

沿用上一点的代码,然后我们分别在每个类里面加上一个dispose的方法,看看对象的清理以及清理的顺序。

代码:

 

package com.ray.ch05;

public class PlaceSetting extends Custom {
	private DinnerPlate dinnerPlate;
	private Spoon spoon;
	private Fork fork;
	private Knife knife;

	public PlaceSetting(int i) {
		super(i);
		dinnerPlate = new DinnerPlate(i + 1);
		spoon = new Spoon(i + 1);
		fork = new Fork(i + 1);
		knife = new Knife(i + 1);
		System.out.println(done);
	}

	@Override
	public void dispose() {
		dinnerPlate.dispose();
		spoon.dispose();
		fork.dispose();
		knife.dispose();
		System.out.println(PlaceSetting dispose);
		super.dispose();
	}

	public static void main(String[] args) {
		PlaceSetting placeSetting = null;
		try {
			placeSetting = new PlaceSetting(9);
		} catch (Exception e) {
		} finally {
			placeSetting.dispose();
		}
	}
}

class Plate {
	public Plate(int i) {
		System.out.println(create Plate);
	}

	public void dispose() {
		System.out.println(Plate dispose);
	}
}

class DinnerPlate extends Plate {
	public DinnerPlate(int i) {
		super(i);
		System.out.println(create DinnerPlate);
	}

	@Override
	public void dispose() {
		System.out.println(DinnerPlate dispose);
		super.dispose();
	}
}

class Utensil {
	public Utensil(int i) {
		System.out.println(create Utensil);
	}

	public void dispose() {
		System.out.println(Utensil dispose);
	}
}

class Spoon extends Utensil {
	public Spoon(int i) {
		super(i);
		System.out.println(create Spoon);
	}

	@Override
	public void dispose() {
		System.out.println(Spoon dispose);
		super.dispose();
	}
}

class Fork extends Utensil {
	public Fork(int i) {
		super(i);
		System.out.println(create Fork);
	}

	@Override
	public void dispose() {
		System.out.println(Fork dispose);
		super.dispose();
	}
}

class Knife extends Utensil {
	public Knife(int i) {
		super(i);
		System.out.println(create Knife);
	}

	@Override
	public void dispose() {
		System.out.println(Knife dispose);
		super.dispose();
	}
}

class Custom {
	public Custom(int i) {
		System.out.println(create Custom);
	}

	public void dispose() {
		System.out.println(Custom dispose);
	}
}

输出:

 

create Custom
create Plate
create DinnerPlate
create Utensil
create Spoon
create Utensil
create Fork
create Utensil
create Knife
done
DinnerPlate dispose
Plate dispose
Spoon dispose
Utensil dispose
Fork dispose
Utensil dispose
Knife dispose
Utensil dispose
PlaceSetting dispose
Custom dispose

从输出结果可以看见,生成对象依然是先父后子,但是清理确相反,先子后父。

 

当然,大部分的情况我们是不需要手动清理,只需要垃圾回收器自动清理即可。

但是有一点必须注意:当必须手动清理对象的时候,我们千万注意子类与子类、子类与父类等各种聚合和继承关系。

 

3.一个被多次重载的方法,在子类里面重载机制也是可以运行的。

 

package com.ray.ch05;

public class DinnerPlate extends Plate {
	public DinnerPlate(int i) {
		super(i);
		System.out.println(create DinnerPlate);
	}

	@Override
	public void dispose() {
	}

	public void dispose(double i) {
	}
}

class Plate {
	public Plate(int i) {
		System.out.println(create Plate);
	}

	public void dispose() {
		System.out.println(Plate dispose);
	}

	public int dispose(int i) {
		return i;
	}

	public float dispose(float i) {
		return i;
	}
}

从上面的代码可以看见,dispose被多次的重载,而且同时也通过不同的方式来重写。

 

 

总结:这一章节主要讲述了如何组合使用聚合和继承,以及描述在使用过程中会出现的一些问题。

 

 

 

更多相关文章
  • 声明:本文介绍的安全工具仅用于渗透测试及安全教学使用,禁止任何非法用途 QuasiBot是一款php编写的webshell管理工具,可以对webshell进行远程批量管理.这个工具超越于普通的webshell管理是因为其还拥有安全扫描.漏洞利用测试等功能,可以帮助渗透测试人员进行高效的测试工作. Q ...
  • 3年前,本田推出了电动座椅Uni-Cub,可以让你坐着倾斜身体就前进后退.只要你的体重没过100kg,它就能载着你在办公室自由移动.坐在Uni-Cub上操控很简单,无论你想前进.后退.还是平移,倾斜身体就行了,内置的平衡控制技术不会让你摔倒.本田的全向牵引驾驶系统(Honda Omni Tracti ...
  •  
  • 云计算这个火热的词我想大家一定不会陌生,自2009年云进入了中国市场,历经4年多的时间.这一项革命性的技术在改变着我们的生活,我想大家都用过百度云.QQ云,这些是我们身边的服务,在此为大家提一下,阿里云.EMC.品高云这3个公司所做的性质不同,大家根据兴趣可以去查阅相应资料.果粉们更了解的应该是苹果 ...
  • 1.请解释分布式事务管理? 解答:分布式事务是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上.为了实现分布式事务,需要使用下面将介绍的两阶段提交协议. 阶段一:开始向事务涉及到的全部资源发送提交前信息.此时,事务涉及到的资源还有最后一次机会来异常结束 ...
  • 从今天起,我就开始学习c++了,终于要面向对象编程了(对象啊,希望真的可以有个对象).我准备把每天的学习心得写成博文,分享给大家,都是新手,言语表达什么方面不合适的地方,欢迎指正(你猜我会不会改)     首先,c++是一门面向对象的语言,他和面向过程的语言是本质上的区别.     面向过程的语言, ...
一周排行
  • 民用无人机市场正不断升温,安全隐患正逐渐显现.澎湃新闻(www.thepaper.cn)记者日前查询发现,一家淘宝店铺某款无人机的月成交量已超过1200件.据网友反映,微信朋友圈也不断有人晒出无人机航拍视频.无人机即 ...
  • 1.获取当前操作系统版本信息 使用Environment.OSVersion 属性 获取包含当前平台标识符和版本号的 OperatingSystem 对象. 命名空间:  System程序集:  mscorlib(在 ...
  • 易网科技讯 4月28日消息,据国外媒体报道,苹果公司今日公布了截至3月末的第二财季财报.财报显示,苹果期内实现营收580.1亿美元,同比增长27%,净利润135.7亿美元,去年同期为102.2亿美元.财报公布后,CE ...
  • ItemIndex一般是列表的一个属性,比如TCombobox和TListBox都有,表示当前选中的项(Item)的下标(Index),如果没有选中,那它是-1,所以一般判断TCombox或TListBox等当前有没 ...
  • 要是在UNIX下,大多数人首选的编辑器恐怕是vi emacs,但是在windows下ultraedit是我的不二选择. 昨天看到网上的文章,用ultraedit打造自己的java ide.perl ide,看得我手痒 ...
  • 动态方法,在使用时需要先创建实例,才能调用实例方法,而静态方法则不需要,直接使用即可.   //定义静态方法 class SQLHelper        {         public static string ...
  • 上个星期天,我感觉应该整理一下我的书柜.于是,在书柜里,我发现了一本几乎完全忘记的书(我想不起来为什么要买它!):<PHP 6 – 快速简洁的Web开发> 这本书出版于2008年一月.而六年之后的今天,P ...
  • Oxce故障 故障表现:开机时不能正常地登录系统,而是直接弹出图2所示的Oxce故障提示. 原因分析:由于安装或卸载某些比较特殊的软件,往往会对Win7的引导程序造成非常严重的破坏,这样Win7在启动时就会出现Oxc ...
  • =====================================================SDL源代码分析系列文章列表:SDL2源代码分析1:初始化(SDL_Init())SDL2源代码分析2:窗口( ...
  • 木马是一种基于远程控制的病毒程序,该程序具有很强的隐蔽性和危害性,它可以在人不知鬼不觉的状态下控制你或者监视你.有人说,既然木马这么厉害,那我离它远一点不就可以了! 然而这个木马实在是"淘气",它 ...