从头认识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++是一门面向对象的语言,他和面向过程的语言是本质上的区别.     面向过程的语言, ...
一周排行
  • kvm中虚拟机的硬盘扩容   KVM中linux虚拟机的硬盘添加方法 最近虚拟机中运行的东西比较多,很多.而刚启动的时候虚拟机分配的磁盘比较少,随着日志还有平时的上传文件的积累,磁盘空间报警了.网上查了下资料,自己也 ...
  • 当你需要以命令行的方式,来运行手中的工具时,可能会有这样一个体会.那就是工具处于多级目录下,要想运行其里面的程序文件,每次还得输入一大串相对应的路径,才能将其工具启动,这样操作下来实在是麻烦.而后经过笔者仔细研究,发 ...
  • 前言:在SharePoint2013中,提供Search REST service搜索服务,你可以在自己的客户端搜索方法或者移动应用程序中使用,该服务支持REST web request.你可以使用KeyWord Q ...
  • www.2cto.com:看来应该是fsockopen禁用后的解决办法 通用解决方法:   找到程序里的fsockopen 函数,替换为:pfsockopen,即可解决所有问题,两个函数的区别在于pfsockopen ...
  • Graph's Cycle Component Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) ...
  •   需要先下载sudo 然后进系如下操作   [[email protected] ~]$ su root   密码:   [[email protected] linus]# vim /etc/sudoers 在root 下面添加lin ...
  •   
  •  圆通快递 速度奇慢 服务恶劣     本人经常网上购物,因此接受过很多快递公司的服务,虽然很难评出哪种快递是最好的,但是我可以负责任的说圆通快递绝对是里面最差的.以下是我近两次使用圆通快递的经历:    第一次是从 ...
  • 1 前言 PHP被大量的应用于Web的后台CGI开发,通常是在用户数据数据之后得出某种结果,但是如果用户输入的数据不正确,就会出现问题,比如说某人的生日是"2月30日"!那应该怎么样来检验暑假是否 ...
  • 1 引言 去年6月,“弦哥”在博客园搞了一个架构分享评奖讨论——<.Net项目分层与文件夹结构大全(最佳架子奖,吐槽奖,阴沟翻船奖揭晓)>,并在评奖完了之后,发表了一个总结——<弦哥杯.Net搭架子 ...