从头认识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++是一门面向对象的语言,他和面向过程的语言是本质上的区别.     面向过程的语言, ...
一周排行
  •   win7无法访问windows 2003共享文件,但windows2003可以访问该win7系统,   win7之间也可以相互访问,查来查去原来是本地策略问题.   解决方法:  www.2cto.com     ...
  • 作为美的家电低价运动的第一"杀手",宣称退出300元以下微波炉市场的美的看似在价格战中收手了,但这并不是全部.美的不卖低价微波炉的真正原因或许是因为其和格兰仕各占全球微波炉市场几乎半壁江山,这个时 ...
  • 为了实现一个自动更新的功能,但是在实现的过程中遇到了一些奇怪的问题,暂时性还没有解决,请大家帮忙看看.问题是这样的,我自定义了两个类,用于实现ap的版本与管理控制,以及下载.<update>     &l ...
  • 简介 与其它开放源码语言(比如 Perl 和 Python)相比,PHP 社区缺少强有力的工作来开发数学库. 造成这种状况的一个原因可能是由于已经存在大量成熟的数学工具,这可能阻碍了社区自行开发 PHP 工具的工作. ...
  • 本文转自wawlian 捕获到异常时,往往需要进行一些处理.比较简单直接的方式就是打印异常栈轨迹Stack Trace.说起栈轨迹,可能很多人和我一样,第一反应就是printStackTrace()方法.其实除了这个 ...
  • 易网科技讯 4月24日消息,据国外媒体报道,中兴通讯已与微软签署一份专利授权协议,同意因生产搭载谷歌Android和Chrome操作系统的设备向微软支付专利许可费.中兴通讯是最新一家与微软达成专利授权协议的硬件生产商 ...
  • 很多人在做开发的时候并没有注意到SQL的查询是可以被改掉的,其实SQL却是最不安全的因素之一,通过SQL,更有可能去直接执行系统命令,在服务器上新建用户,修改密码等操作也不是不可能.    直接 SQL 命令注入就是 ...
  • 1.图形界面 如果从vnc view登录时,提示connection refused(10061),则是因为linux防火墙的问题,登录centos系统,选择System–>Preferences–>Re ...
  • 25.2.3.26. mysql_get_character_set_info() void mysql_get_character_set_info(MYSQL *mysql, MY_CHARSET_INFO *c ...
  • JSP开发模式 jsp开发模式的发展 1.模式1:(适合小型项目的技术的开发) a.第一版本,纯jsp(封装数据,处理数据,显示数据) b.第二版本,Jsp+JavaBean. jsp:收集数据,显示数据 JavaB ...