从头认识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++是一门面向对象的语言,他和面向过程的语言是本质上的区别.     面向过程的语言, ...
一周排行
  • 本文转载自:http://shiyanjun.cn/archives/742.html 我们首先提出这样一个简单的需求:现在要分析某网站的访问日志信息,统计来自不同IP的用户访问的次数,从而通过Geo信息来获得来访用 ...
  • 路由器和交换机的综合实验⑵   ⑵ R2配置策略路由 int l0 ip add 100.0.0.1 255.255.255.0 int l1 ip add 200.0.0.1 255.255.255.0 exit ...
  • 内存的静态分配和动态分配  要弄懂这个问题,首先你得知道静态和动态指的是什么.个人觉得卡耐基上的解释很经典:      “The word static refers to things that happen at ...
  • 其实早在腾讯入股京东商城的时候,在合作条款中就有明确的规定,腾讯承诺将在手机QQ.微信等战略级移动产品上,为京东提供一级入口支持,帮助京东发展移动电商业务. 如今几个月的时间过去了,当初的承诺终于得以兑现,微信正在内 ...
  • 解释器(英语:Interpreter),又译为直译器,是一种电脑程序,能够把高级编程语言一行一行直接转译运行.解释器不会一次把整个程序转译出来,只像一位“中间人”,每次运行程序时都要先转成另一种语言再作运行,因此解释 ...
  • 指数型母函数   G(x) = ( 1 + x / 1!  + (x^2)/(2!) + .....+ (x ^ n1 ) / (n1!)  ) * (( 1 + x / 1!  + (x^2)/(2!) + ... ...
  • MySQL配置文件my.cnf中文版   一直放在笔记里面,拿出来分享了,但是没记录作者是谁,,,罪过,版权归他!   #BEGIN CONFIG INFO #DESCR: 4GB RAM, 只使用InnoDB, A ...
  • Windows服务器中,DHCP角色存在与DNS协同工作的功能: 1.DHCP启用DNS动态更新(默认仅在DHCP客户端请求时动态更新DNS记录,本文为实现DNS老化清理功能选择"始终动态跟DNS记录&qu ...
  • 爱是空气,每个人都庆祝这种伴侣在身边的感觉.但是正如我们所说,程序员除外,程序员参加开发者大会把自己脑袋装的满满的,而不过多思考自己的单身生活.当他所有朋友疯狂地计划他们的情人节约会时,程序员或许会去研究程序而不让自 ...
  • 之前的手动校是在Action中编写validate犯法或validateXXX形式的方法来完成校验的,如果要给予验证框架来完成输入校验,只需在于Action同一目录下创建一个xml格式的验证文件即可.而之前Actio ...