一个类的成员变量可以是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;}elsereturn 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);//在没有执行之前,nullcircular.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】类与对象 - 对象的组合相关推荐

  1. Java 类锁、对象锁、私有锁

    3.6 Java类锁.对象锁.私有锁.隐式锁 类锁和对象锁是否会冲突?对象锁和私有锁是否会冲突?通过实例来进行说明. 一.相关约定 为了明确后文的描述,先对本文涉及到的锁的相关定义作如下约定: 1. ...

  2. java类怎么删除对象_java中对象的生成使用和删除

    请教大神,在java里,对象生成后,如何删除对象呢?请教大神,在java里,对象生成后,如何删除对象呢? 对象状态由JVM自动管理,GC线程自动回收无用对象,无需也不能自己删除对象. 请问在JAVA中 ...

  3. java类怎么删除对象_在java中删除一个对象?

    在java中删除一个对象? 我想删除一个我创build的对象(跟随着你的一个椭圆),但是我怎么做呢? delete follower1; 没有工作. 编辑: 好吧,我会给更多的上下文. 我正在制作一个 ...

  4. java 类的子类对象_使用超类初始化子类对象Java

    本问题已经有最佳答案,请猛点这里访问. SuperClass object = new SubClass(); 为什么要使用一个超类来像上面那样实例化一个子类对象?因为我学会实例化对象的唯一方法是: ...

  5. 解析 Java 类和对象的初始化过程 由一个单态模式引出的问题谈起

    在 IBM Bluemix 云平台上开发并部署您的下一个应用. 开始您的试用 问题引入 近日我在调试一个枚举类型的解析器程序,该解析器是将数据库内一万多条枚举代码装载到缓存中,为了实现快速定位枚举代码 ...

  6. 解析 Java 类和对象的初始化过程

    跳转到主要内容 中国 [ 选择 ] dW 全部内容--------------  AIX and UNIX  Info Mgmt  Lotus  Rational  WebSphere-------- ...

  7. 深入浅出Java复用类【从字节码角度看toString调用机制、对象代理、组合与继承、转型、final、初始化】

    这个世界上有10种人:一种是懂二进制的,一种是不懂二进制的 你觉得类是在什么时候被加载的?[访问static域时,为什么?看完9就明白了] 文章目录 1.深入理解Java中toString方法的调用机 ...

  8. Educoder - Java类和对象之对象组合之求圆锥体表面积

    蒙了,快把我传疯了 还一个小问题,我想不通为啥我的主类Cone不能写public 掌握是知识点 类的引用 对象组合 通关源码 class Circle{static final double PI = ...

  9. java.io包对象读写_java.io 包中的____________和____________类主要用于对对象(Object)的读写_学小易找答案...

    [多选题]连铸钢水成分控制的要求有( ). [单选题]起动机用直流电动机将电能转化为 [单选题]下列关于我国少数民族传统禁忌的说法中,错误的是( ). [多选题]下列选项中 , 属于表单控件的是 ( ...

最新文章

  1. 重写selenium 的 click()操作,使得脚本更稳定
  2. Silverlight+WCF 实战-网络象棋最终篇之对战视频-上篇[客户端开启视频/注册编号/接收视频](五)...
  3. 启明云端分享|ESP32-S3开发环境搭建,这里我们会介绍两个比较常用的开发环境搭建:WINDOWS\LINUX
  4. keras从入门到放弃(二)多项回归
  5. 云计算从“仰望星空”到“脚踏实地”
  6. eclipse 直接去手机中拖文件
  7. java class 结构_Java class文件的结构
  8. 如何使用RichEdit
  9. C语言数字3转变字符 3 程序,大学c语言知识点总结
  10. 【CodeForces - 569C】Primes or Palindromes? (思维,分析范围,暴力枚举判断)
  11. laravel 模块化管理 插件 caffeinated
  12. 配置SCCM 2012 SP1(七)操作系统部署
  13. 推荐系统实战第二部分 评价指标
  14. 服务器系统是指什么,服务器操作系统指的是什么
  15. 如何告别脂肪肝?要注意什么?
  16. 使用Oracle数据库进行企业开发(三)
  17. 小学生c语言入门教程,小学生都看得懂的C语言入门(5): 指针
  18. [jzoj 4226] 【五校联考3day2】A {简单题}
  19. 寒冬已过,2023抓住IT复苏新机会
  20. 购物网站排名 - 全球电子商务或购物企业网站一览 -2010

热门文章

  1. mysql数据库基本介绍及常见使用
  2. oracle mysql事物隔离级别_Oracle数据库事物隔离级别
  3. 常用MySQL的命令集锦
  4. oracle 11g wm_concat 、 listagg 函数的使用(合并数据)
  5. Ubuntu下搭建postgresql主从服务器(方法1)
  6. Redis集群两种配置方式
  7. 类似ngnix的多进程监听用例
  8. HTSRealistic missions 10:Holy Word High School
  9. 离线部署 CDH 5.12.1 及使用 CDH 部署 Hadoop 大数据平台集群服务
  10. C++关键字decltype