面向对象之组合,聚合的理解
组合(part):可以理解为某某东西的组成部分。
举例:飞机和发动机,人和头。通常是组合情况,他们拥有相同的生命周期。
聚合(has a):可以理解为某某东西的附加部分。
举例:人和衣服,战斗机和携带的到导弹。他们的生命周期可以是不同的。
说明:比如人还没出生衣服就被创建了,人去世了但是衣服没有被销毁。战斗机可以不携带导弹,导弹可以是在战斗机之前或者之后创建。导弹被发射出去爆炸,但是战斗机并没有销毁,可以看出他们的生命周期可以不同(可以不同,意思就是可以相同咯。。。也是可以的)
具体实现:
目录结构:
Engine类:(发动机类)
package innerClass7_29.AggregationAndComposition;
//战斗机发动机
public class Engine {
private int power;
public Engine(int power) {
this.power = power;
System.out.println("引擎被创建");
}
public int getPower() {
return power;
}
public void setPower(int power) {
this.power = power;
}
public void start(){
System.out.println("发动机启动");
}
}
Frighter类:(战斗机类)
package innerClass7_29.AggregationAndComposition;
//战斗机
public class Frighter {
private int frighterPower;
private Missile mis;
public Frighter(int frighterPower){
this.frighterPower = frighterPower;
Engine eng = new Engine(100);
System.out.println("战斗机被创建");
}
public Frighter(int frighterPower,Missile mis) {
//聚合
this.mis = mis;
this.frighterPower = frighterPower;
//组合
Engine eng = new Engine(100);
System.out.println("引擎被创建");
}
public int getFrighterPower() {
return frighterPower;
}
public void setFrighterPower(int frighterPower) {
this.frighterPower = frighterPower;
}
public void launchMissile() {
//聚合导弹
Missile mis = new Missile(100);
System.out.println("导弹长度为:" + mis.getMissileLength() + " 的导弹已经发射");
if (null == mis.tipping(mis)) {
System.gc();//提醒虚拟机回收资源(虚拟机可能不会立即回收,而是等待调度)。
System.out.println("导弹已经引爆" + mis);//此时输出的mis可能还是有地址是因为JVM还没来得及回收垃圾
}
}
public void bomm(Frighter f){
// f = null;
System.out.println("战斗机摧毁:"+f);
if (null == f.mis){
System.out.println("导弹被销毁");
}else {
System.out.println("导弹未被销毁");
}
}
}
Missile类:(导弹类)
package innerClass7_29.AggregationAndComposition;
//导弹
public class Missile {
private double missileLength;
public Missile(double missileLength) {
this.missileLength = missileLength;
System.out.println("导弹被创建");
}
public double getMissileLength() {
return missileLength;
}
public void setMissileLength(double missileLength) {
this.missileLength = missileLength;
}
public Object tipping(Missile mis){
mis=null;
System.out.println("引爆导弹");
return mis;
}
}
测试代码:
package innerClass7_29.AggregationAndComposition;
public class Test {
public static void main(String[] args) {
Frighter f1 = new Frighter(3);
f1.launchMissile();
}
}
运行结果