Java基础06 组合

news/2024/7/20 14:10:39 标签: java, 内存管理, c/c++

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

 

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

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

 

组合与"has-a"

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

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

 

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

class Battery 
{
    public void chargeBattery(double p)
    {
        if (this.power < 1.) {
            this.power = this.power + p;
        }
    }

    public boolean useBattery(double p)
    {
        if (this.power >= 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快速教程”系列文章

 


http://www.niftyadmin.cn/n/851586.html

相关文章

《windows程序设计》获取文本尺寸(04)

代码如下&#xff1a; program Project2;{$APPTYPE CONSOLE}{$R *.res}usesSystem.SysUtils,windows,Winapi.Messages,Vcl.Dialogs;varswndClass: tagWNDCLASS;message: MSG;mHwnd: hwnd;cxChar, cyChar: Integer;function WindowProc(hwnd: hwnd; uMsg: UINT; wParam: wParam;…

TIMAC 学习笔记(二)

昨天大体上熟悉了TIMAC自带的CC2530的示范例程&#xff0c;今天先从演示抓包入手&#xff0c;分析四种不同的配置工程在空中传输的差异。随后&#xff0c;会按照扫描、组网、入网等MAC层接口函数入手&#xff0c;结合IEEE 802.15.4标准规范和能够看到的函数接口代码&#xff0c…

c++ 把文件的信息全部取出重新存入新信息_第13章 基于SD卡的FatFs文件系统

第13章 基于SD卡的FatFs文件系统文件作为信息的集合被存储在硬盘&#xff0c;SD卡、Flash等存储设备上&#xff0c;为了读写更加高效方便&#xff0c;通常使用文件系统来管理文件&#xff0c;常见的文件系统有FAT&#xff0c;NTFS&#xff0c;EXT&#xff0c;UFS&#xff0c;HF…

《windows程序设计》获取窗口尺寸(05)

代码如下&#xff1a; program Project2;{$APPTYPE CONSOLE}{$R *.res}usesSystem.SysUtils,windows,Winapi.Messages,Vcl.Dialogs;varswndClass: tagWNDCLASS;message: MSG;mHwnd: hwnd;cxClient, cyClient: Integer;function WindowProc(hwnd: hwnd; uMsg: UINT; wParam: wPa…

dubbo web工程示例_Dubbo高级特性应用之服务限流

概述服务限流是指当系统资源不够&#xff0c;不足以应对大量请求&#xff0c;即系统资源与访问量出现矛盾的时候&#xff0c;我们为了保证有限的资源能够正常服务&#xff0c;因此对系统按照预设的规则进行流量限制或功能限制的一种策略。在Dubbo框架中&#xff0c;提供了很多用…

给力开源,.Net开源地址大收集

一、基础类库&#xff1a; 1&#xff0c;项目名&#xff1a;Npoi 资源星级:★★★ &#xff08;个人评的&#xff09; 介绍&#xff1a;NPOI - 一个能帮助你直接读写office文件流的库 系统教程&#xff1a;http://www.cnblogs.com/tonyqus/archive/2009/04/12/1434209.html …

oracle开启/关闭归档模式

1.改变非归档模式到归档模式:    1)SQL> conn / as sysdba (以DBA身份连接数据库)    2)SQL> shutdown immediate;(立即关闭数据库)    3)SQL> startup mount (启动实例并加载数据库&#xff0c;但不打开)    4)SQL> alter database archivelog; (更改数据…

C# 调用 C++ DLL 函数和类

2019独角兽企业重金招聘Python工程师标准>>> 参看讲解和源码&#xff1a; 在VS2010上使用C#调用非托管C生成的DLL文件&#xff08;图文讲解&#xff09; http://www.cnblogs.com/liping13599168/archive/2011/03/31/2000320.html 转载于:https://my.oschina.net/…