Java基础教程之组合(composition)

我们已经尝试去定义类。定义类,就是新建了一种类型(type)。有了类,我们接着构造相应类型的对象。更进一步,每个类型还应该有一个清晰的接口(interface),供用户使用。

我们可以在一个新类的定义中使用其他对象。这就是组合(composition)。组合是在Java中实现程序复用(reusibility)的基本手段之一。

组合与"has-a"

一个对象是另一个对象的数据成员。比如我们看之前提到的充电电筒的例子:

一个充电电筒中的电池、LED灯、按钮……

都可以是一个对象。我们可以定义一个Battery类来定义和产生电池对象。而在充电电筒的类定义中,可以用一个电池对象作为其数据成员,来代表电池部分的状态。

我们下面定义一个Battery类,并用power来表示其电量。一个Battery的可以充电(chargeBattery)和使用(useBattery)。我们在随后的Torch类定义中使用Battery类型的对象作为数据成员:

JAVA工程师介绍,代码如下:

class Battery

{

public void chargeBattery(double p)

{

if (this.power lt; 1.) {

this.power = this.power + p;

}

}

public boolean useBattery(double p)

{

if (this.power gt;= p) {

this.power = this.power - p;

return true;

}

else {

this.power = 0.0;

return false;

}

}

private double power = 0.0;

}

class Torch

{

/**

* 10% power per hour use

* warning when out of power

*/

public void turnOn(int hours)

{

boolean usable;

usable = this.theBattery.useBattery( hours*0.1 );

if (usable != true) {

System.out.println("No more usable, must charge!");

}

}

/**

* 20% power per hour charge

*/

public void charge(int hours)

{

this.theBattery.chargeBattery( hours*0.2 );

}

/**

* composition

*/

private Battery theBattery = new Battery();

}

上面的new为theBattery对象分配内存,不可或缺。

我们定义Battery类。Torch类使用了一个Battery类型的对象(theBattery)来作为数据成员。在Torch的方法中,我们通过操纵theBattery对象的接口,来实现Battery类所提供的功能(functionality)。

我们说,一个Torch对象拥有(has-a)一个Battery对象。上述关系可以表示成:

has-a: 手电有电池 (注意上面的菱形连线)

通过组合,我们可以复用Battery相关的代码。假如我们还有其他使用Battery的类,比如手机,计算器,我们都可以将Battery对象组合进去。这样就不用为每个类单独编写相关功能了。

我们可以增加一个Test类,看看实际效果:

代码如下:

public class Test

{

public static void main(String[] args)

{

Torch aTorch = new Torch();

System.out.println("Charge: 2 hours");

aTorch.charge(2);

System.out.println("First Turn On: 3 hours");

aTorch.turnOn(3);

System.out.println("Second Turn On: 3 hours");

aTorch.turnOn(3);

}

}

上面程序的运行结果:

Charge: 2 hours

First Turn On: 3 hours

Second Turn On: 3 hours

No more usable, must charge!

我们通过组合来使用了电池对象所提供的功能,比如探测电量是否用尽(根据useBattery()的返回值)。

基本类型

在从HelloWorld到面向对象中,我们将int, float, double, boolean等称为基本类型(primitive

type),也就是特殊的类。我们可以将一个整数理解称为一个int类型的对象。int类型可以有赋值、加法、减法等操作接口。普通类型可以视作对基本类型的拓展。我们已经见过了基本类型作为数据成员、方法的参数、方法的返回值和方法内部的自动变量。自然的,普通类型的对象,比如Battery和Torch类的对象,也都可以用于这些地方。

C语言中,可用的数据类型(基本上)已经预设好,比如int,

float。在Java中,我们除了可以用这些预设的数据类型外,还可以通过类来定制自己想要的数据类型,然后通过组合来使用。但基本类型和普通类型还是有所区别的。基本类型经常被使用,且所占据内存空间不大,所以在Java中,为了效率起见,这些基本类型与普通的类型(也就是自定义的类)的内存管理方式不同。比如,基本类型一旦声明就会被分配内存空间,而普通类型需要使用new关键字来分配内存空间。

Java为每个基本类型提供了相应的普通类型。比如int基本类型对应Integer类型。如果将基本类型的对象转成相应的普通类型变量,所谓的基本类型也就成为了一般意义上的类型(不再有内存管理上的不同)。

这样,我们对Java“一切皆对象”的理念有了更深一步的理解。

总结

组合,has-a

基本类型

java中composition_Java基础教程之组合(composition)相关推荐

  1. Java Media Framework 基础教程

    Java Media Framework 基础教程 作者:Eric Olson     来源:ibm 摘要: 很少发现有关于jmf方面的中文资料,这是在IBM上面找的一本书,可作为jmf的入门学习,业 ...

  2. 第76节:Java中的基础知识

    第76节:Java中的基础知识 设置环境,安装操作系统,安装备份,就是镜像,jdk配置环境,eclipse下载解压即可使用,下载tomcat 折佣动态代理解决网站的字符集编码问题 使用request. ...

  3. java integer最大值_五分钟学会java中的基础类型封装类

    在刚刚学习java的时候,老师不止一次的说过java是一种面向对象的语言,万物皆对象.对于java中的基础数据类型,由于为了符合java中面向对象的特点,同样也有其封装类.这篇文章对其有一个认识. 一 ...

  4. Java中的JDBC教程

    Java中的JDBC教程 欢迎使用JDBC教程.Java DataBase Connectivity(JDBC)是企业应用程序中使用最广泛的API之一.这是因为大多数应用程序使用某种数据库连接.我最近 ...

  5. idea java 单元测试_Java基础教程:IDEA单元测试

    Java基础教程:IDEA单元测试 环境配置 使用idea IDE 进行单元测试,首先需要安装JUnit 插件. 安装JUnit插件步骤 File-->settings-->Plguins ...

  6. java中的jpa_JPA教程–在Java SE环境中设置JPA

    java中的jpa JPA代表Java Persistence API,它基本上是一个规范,描述了一种将数据持久存储到持久存储(通常是数据库)中的方法. 我们可以将其视为类似于Hibernate之类的 ...

  7. Java中整数基础知识

    最近做了一道题,非常有意思,题本身很简单,但涉及到整数的最大值以及最小值,当写测试用例的时候,却犯了一个错误,发现最小整数并不是0xFFFFFFFF,我们来仔细看一下. 整数基础 Java中,整数都是 ...

  8. java中stream基础方法的使用

    1.java中的stream流,实际上是方便于我们对集合中的元素进行筛选操作,流可包含两个操作,一为中间操作intermediate operation,主要用于筛选,过滤数据,二为终端操作termi ...

  9. Java lamdba表达式基础教程

    一.lamdba表达式基础知识 1.lamdba基本知识 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递 ...

  10. JAVA中多线程基础知识

    程序(软件):数据和指令的集合.软件架构:B/S  C/S  软件分类:系统软件,应用软件. 进程:正在运行的程序,会在内存中分配空间. 线程:进程中的多条路径. 多线程是指有多条线程并发的执行. 并 ...

最新文章

  1. php 运维系统开发,PHP开发运维管理系统笔记
  2. 八十八、从斐波那契数列和零一背包问题探究动态规划
  3. 使用StringRedisTemplate和RedisTemplate
  4. 计算机技术朝着那个方面发展,目前,信息系统在朝着哪个方面发展?
  5. 在MySQL数据库上使用Quartz Scheduler入门
  6. python装饰器的顺序_python中多个装饰器的执行顺序详解
  7. 做简单的android 软件推荐,Android_适用于Android开发的简单聊天软件,适用于android 开发。是一个简 - phpStudy...
  8. 15条常用的视频音频编辑脚本命令(mencoder/ffmpeg等)
  9. 每年一波FPGA系列新品,这次Achronix专为AI/ML应用打造……
  10. arcgis出界址点成果表_界址点成果表打印
  11. 小b和回文数(51Nod-2483)
  12. 【ElasticSearch】Es 源码之 MonitorService 源码解读
  13. python glob用法_python glob的安装和使用
  14. linux 汇编语言ldreq,请教一个中断句柄的问题 - ARM技术论坛-ARM嵌入式论坛-人气最火爆ARM学习论坛 - 21ic电子技术开发论坛...
  15. Paypal 在线支付接口应用从零开始,第1节,[建立沙盒测试环境]
  16. ASP.NET 服务端GZIP压缩
  17. JS特效代码大全(三)
  18. PS 如何简单的更换图片的背景色
  19. 02_函数定义及使用函数
  20. 图像处理 理想低通滤波器_如何为您的文章选择理想的图像

热门文章

  1. 网络安全专家郭盛华:无线传感器网络的传输安全性
  2. sfp寄存器_查看光模块信息 - E600 V200R011C10 配置指南-设备管理 - 华为
  3. 宝塔面板申请带有www的二级域名SSL证书失败的处理方法
  4. 设计模式之装饰器模式
  5. 前端开发hr面试试题
  6. 软件开发阶段及其文档简述
  7. manjaro设置字体_Manjaro 20.03字体美化的2.5个级别
  8. MySQL 查询题型总结
  9. 软件测试之逻辑思维题
  10. python str转换成float