当前位置: 移动技术网 > IT编程>开发语言>Java > Java基础教程之组合(composition)

Java基础教程之组合(composition)

2019年07月22日  | 移动技术网IT编程  | 我要评论

protel教程,流行歌曲试听,都市极品风水师下载

我们已经尝试去定义类。定义类,就是新建了一种类型(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

基本类型

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网