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

被折叠的 条评论
为什么被折叠?



