从头认识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++是一门面向对象的语言,他和面向过程的语言是本质上的区别.     面向过程的语言, ...
一周排行
  • 原题 Find the contiguous subarray within an array (containing at least one number) which has the largest sum. ...
  • java语言: 第一种: [java]   public static int[][] xuanzhuan(int a[][],int N){           int[][] b = new int[N][N]; ...
  • sql server 2008用户登录出现18456错误的解决   关于sql server 2008的18456错误的问题在网上大家也问了很多! 我今天也遇到过了这样的问题,去网上找了许多方法试了N次,现在解决了! ...
  • 首个专门JailBreak的黑客大会MyGreatFest开始了!打头阵的是著名JB界黑客P0sixninja的演说,他表示已在iPad的2甚至 iPhone 5的找到5个漏洞!是5个!不是1个!这是破纪录的漏洞数目 ...
  • 易网科技讯 8月16日消息,瑞士信贷今天发布对腾讯2012年第二季度业绩的研究报告,维持该公司"跑赢大盘"的股票评级,并将其目标股价从275港元上调至282港元. 以下为报告的主要内容: 腾讯20 ...
  • 生理周期 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 117999 Accepted: 37040 Description 人生来就有三个生理 ...
  • 我的助理辞职了!--给不听话的下属看看 喜欢收藏下,以后给新人看. 是本人转载的,与诸位分享.交流. 1,当时公司招了大批应届本科和研究生毕业的新新人类.平均年龄25岁.那个新的助理,是经过多次面试后,我亲自招回来的 ...
  • C解析之十三对象的定义       前言:类-集万千宠爱于一身中认识了一个"特殊的数据类型"-类,对象是类的实例.类是生成对象的"模板",类本质上是抽象的概念,系统并不会为类分 ...
  • 这里使用的是广州斯道的icool2416开发板 u-boot版本1.3.4 主要增加LCD驱动 同时增加LCD与串口同步输出 修改如下: 在drivers/video(以u-boot源码为要目录)目录下增加以下文件g ...
  • 作为一名测试人员,提交缺陷是我们必须做的功课.不知各 位是否考虑过,缺陷描述也是一门“艺术”,它影射了一个人的测试经验,测试深度.缺陷描述能否做好,直接影响了我们的测试效率,更确切的说是影响了开发人 员修改缺陷的效率 ...