【Java】类与对象 -> 对象的组合

本文探讨了Java中对象的组合和复用概念。通过组合,一个对象可以包含其他对象作为成员变量,从而复用其方法。这种复用被称为“黑盒”复用,对象之间呈现弱耦合关系。举例说明了Circle类如何创建圆对象,而Circular类如何创建圆锥对象并组合Circle。同时,展示了手机与SIM卡的组合关系,通过MobileTelephone类和SIM类模拟这一过程。

一个类的成员变量可以是Java允许的任何数据类型,因此,一个类可以把某个对象作为自己的成员变量,也就是说,该对象将其他对象作为自己的组成部分。

组合和复用

如果一个对象a组合了对象b,那么对象a就可以委托对象b调用其方法,即对象a以组合的方式来复用对象b的方法。

通过组合对象来复用方法有以下特点:
(1)通过组合对象来复用方法也称“黑盒”复用,因为当前对象只能委托所包含的对象调用其方法,这样一来,当前对象所包含的对象的方法和细节(算法的细节)是一无所知的。

(2)当前对象随时可以更新所包含的对象,即对象与所包含的对象属于弱耦合关系。

 


Circle类创建圆对象

Circular类创建圆锥对象,Circular类将Circle类声明的对象作为自己的一个成员。

圆锥通过调用方法将某个圆的引用传递给圆锥的Circle类型的成员变量

 

Circle.java

package 圆锥和圆;

public class Circle {
	double radius,area;
	void setRadius(double r) {
		radius = r;
	}
	double getRadius() {
		return radius;
	}
	double getArea() {
		area = 3.14*radius*radius;
		return area;
	}
}

Circular.java

package 圆锥和圆;

public class Circular {
	Circle bottom;
	double height;
	void setBottom(Circle c) { //设置圆锥的底是Circle对象
		bottom = c;
	}
	
	void setHeight(double h) {
		height = h;
	}
	
	double getVolme() {
		if(bottom==null) {
			return -1;
		}
		else
			return bottom.getArea()*height/3.0;
	}
	
	double getBottomRadius() {
		return bottom.getRadius();
	}
	
	public void setBottomRadius(double r) {
		bottom.setRadius(r);
	}
}

Example4_8.java

package 圆锥和圆;

public class Example4_8 {

	public static void main(String[] args) {
		//一个半径为10的圆
		Circle circle = new Circle();
		circle.setRadius(10);
		Circular circular = new Circular();
		System.out.println("circle 的引用:" + circle);
		System.out.println("圆锥的bottom的引用:" + circular.bottom);
		//在没有执行之前,null
		circular.setHeight(5);
		circular.setBottom(circle);
		System.out.println("circle 的引用:" + circle);
		System.out.println("圆锥的bottom的引用:" + circular.bottom);
		System.out.println("圆锥的体积:" + circular.getVolme());
		System.out.println("修改circle的半径,bottom的半径同样变化");
		circle.setRadius(20);
		System.out.println("bottom的半径:" + circular.getBottomRadius());
		System.out.println("重新创建circle,circle的引用将发生变化");
		circle = new Circle();
		System.out.println("circle 的引用:" + circle);
		System.out.println("但不影响circular的bottom的引用");
		System.out.println("圆锥的bottom的引用:" + circular.bottom);
		System.out.println("圆锥的体积:" + circular.getVolme());
		
	}

}
/*
circle 的引用:圆锥和圆.Circle@15db9742
圆锥的bottom的引用:null
circle 的引用:圆锥和圆.Circle@15db9742
圆锥的bottom的引用:圆锥和圆.Circle@15db9742
圆锥的体积:523.3333333333334
修改circle的半径,bottom的半径同样变化
bottom的半径:20.0
重新创建circle,circle的引用将发生变化
circle 的引用:圆锥和圆.Circle@6d06d69c
但不影响circular的bottom的引用
圆锥的bottom的引用:圆锥和圆.Circle@15db9742
圆锥的体积:2093.3333333333335
*/

(1)

Circle circle = new Circle();
circle.setRadius(10);

在这之后,内存中诞生了一个circle对象,并且circle的半径radius是10。

(2)

Circular circular = new Circular();

在这之后,内存中诞生了一个circular对象,注意,此时circular的buttom成员还是一个空对象

(3)

circular.setBottom(circle);

将circle对象的引用以“传值”方式传递给circular对象的bottom,因此,bottom对象和circle对象就有同样的实体(radius)

对于同一个类的两个对象,如果二者有相同的引用,就会用同样的实体,因此,改变一个对象的实体,就会导致另一个对象的实体发生同样的变化。

(4)

circle.setRadius(20);

使得bottom对象的实体(radius)和circle对象的实体(radius)发生了同样的变化。

(5)

circle = new Circle();

使得circle对象的引用发生变化,即重新创建了circle对象,使得circle对象获得了新的实体(此时circle对象的radius的值是0),但是circle对象先前的实体(radius)不被释放,因为该实体还被circular(圆锥)的bottom(底)所拥有(引用)。最初circle对象的引用是以“传值”方式传递给circular对象的bottom的,所以,circle的引用发生变化不影响circular的bottom的引用。

 



 

一个手机可以组合任何的SIM卡,下面模拟手机和SIM卡的组合关系。涉及的类如下:

SIM类负责创建SIM卡。

MobileTelephone类负责创建手机,手机可以组合一个SIM卡,并且可以调用setSIM的更改其中的SIM卡

SIM.java

package SIM_and_telephone;

public class SIM {
	long number;
	SIM(long number){
		this.number = number;
	}
	long getNumber() {
		return number;
	}
}

 

MobleTelephone.java

package SIM_and_telephone;

public class MobileTelephone {
	SIM sim;
	void steSIM(SIM card) {
		sim = card;
	}
	long lookNumber() {
		return sim.getNumber();
	}
}

 

Example4_9.java

package SIM_and_telephone;

public class Example4_9 {

	public static void main(String[] args) {
		SIM simOne = new SIM(13889776509L);
		MobileTelephone mobile = new MobileTelephone();
		mobile.steSIM(simOne);
		System.out.println("手机号码:" + mobile.lookNumber());
		SIM simTwo = new SIM(15967563567L);
		mobile.steSIM(simTwo); //更换SIM卡
		System.out.println("手机号码:" + mobile.lookNumber());
	}

}
/*
手机号码:13889776509
手机号码:15967563567
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值