Java基础06 组合

作者: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快速教程”系列文章

时间: 2024-11-05 12:17:16

Java基础06 组合的相关文章

Java基础06 组合(转载)

在一个新类的定义中使用其他对象.这就是组合(composition).组合是在Java中实现程序复用(reusibility)的基本手段之一. 组合与"has-a" 一个对象是另一个对象的数据成员.比如我们看之前提到的充电电筒的例子: 一个充电电筒中的电池.LED灯.按钮…… 都可以是一个对象.我们可以定义一个Battery类来定义和产生电池对象.而在充电电筒的类定义中,可以用一个电池对象作为其数据成员,来代表电池部分的状态. 我们下面定义一个Battery类,并用power来表示其电

Java基础教程 - 组合

1. 什么是组合? 如果一个类的对象和另一个类满足"has-a"关系的话,我们就可以在一个类中,把另一个类的对象作为其对象成员. 什么是"has-a"关系,举个例子:现在有一个类LapTop.class,还有一个是Moniter.class.好显然,Laptop "has-a" Moniter,也就是说,他们是满足"has-a"关系的.这时候,我们就可以把Moniter作为Laptop的一个数据成员. class Laptop

【Java基础06】包装类、toString、equals、final、import、static

1 包装类 1.1 包装类(Java8) Wrapper Class Java为8个基本类型提供了对应的包装类,通过这些包装类可以把8个基本类型的值包装成对象来使用.JDK1.5提供了自动装箱和自动拆箱功能,允许把基本类型值直接赋给对应的包装类引用变量,也允许把包装类对象直接赋给对应的基本类型变量. 1.2 自动装箱(Autoboxing)和自动拆箱(AutoUnboxing) 1.自动装箱:可以把一个基本类型变量直接赋给对应的包装类变量,或赋给Object变量:(低->高) 2.自动拆箱:可以

java基础06 IO流

IO用于在设备间进行数据传输的操作. Java IO流类图结构:   IO流分类 字节流: InputStream FileInputStream BufferedInputStream OutputStream FileOutputStream BufferedOutputStream 字符流: Reader FileReader BufferedReader Writer FileWriter BufferedWriter 一.FileInputStream/FileOutputStream

java基础06

之前我们写过很多循环,因为要做重复动作所以用循环使我们代码变少,更易书写,但是循环不易维护,不易阅读,逻辑一旦出错,使用循环会导致易错. 现在我们引入函数的概念:一段有名称的代码,可以通过该名称使用这段代码. 注意事项:A:必须先声明,后调用.B:声明语法public static 返回类型 函数名(形参列表){函数体} C:当返回类型为空的时候不需要返回值,当返回类型不为空的时候需要使用关键词return来返回一个与声明函数返回类型?相同的类型. D:函数定义必须写在类中. 函数优点是:避免重

2.35 Java基础总结①抽象②接口③设计抽象类和接口的原则④接口和抽象类的区别

java基础总结①抽象②接口③设计抽象类和接口的原则④接口和抽象类的区别 一.抽象 abstract作用:不能产生对象,充当父类,强制子类正确实现重写方法和类相比仅有的改变是不能产生对象,其他的都有,包括构造.属性等等任何一个类只要有一个抽象的方法就成了抽象类 抽象方法 public abstract A();①方法是抽象的,这个类也是抽象的:②子类必须重写抽象方法,除非子类也是抽象类 抽象类可以没有抽象方法,但一般不这么设计 二.接口 interface 接口也是Java的一种引用数据类型(J

第2篇-JAVA基础

第2篇-JAVA基础 每篇一句 :无论处在任何领域中,即使是在小的事情,都要让每一天有所价值 初学心得: 在学习的过程中,错误是很宝贵的,它一笔"财富",更是一种"价值" (笔者:JEEP/711)[JAVA笔记 | 时间:2017-03-24 | JAVA基础] JAVA基础 回顾 在上一篇文章中,最后提到两个问题, 相信读者们已经提前超额完成了"任务" 下面跟着笔者的思路,深入掌握JAVA底层的运行机制 JAVA运行机制 (重中之重) JAV

java基础--JDK安装、环境变量配置、工具开发第一个程序、数据类型、运算符

**-----Java基础大纲-----**   **-----本章节-----** 1.Java语言的历史.特点及工作原理 2.JRE和JDK的介绍 3.Java运行环境和开发工具 4.Java基础语法 **-----下一章节-----** 5.条件语句 6.循环 7.数组 ============================================== 一:历史及开发准备 1.Java发展历程及来源 (1)发展历程 1996年1月,Sun公司发布了Java的第一个开发工具包(JD

java 基础(二)

java 基础(二)java 基础(二) 2016-2-1 by Damon 61. 编写多线程程序有几种实现方式 Java 5以前实现多线程有两种实现方法:一种是继承Thread类:另一种是实现Runnable接口.两种方式都要通过重写run()方法来定义线程的行为,推荐使用后者,因为Java中的继承是单继承,一个类有一个父类,如果继承了Thread类就无法再继承其他类了,显然使用Runnable接口更为灵活. 补充:Java 5以后创建线程还有第三种方式:实现Callable接口,该接口中的