Java基础06 组合

转载 2018年04月15日 00:00:00

点击上方“Java团长”,选择“置顶公众号”

干货文章第一时间送达!


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


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


组合与"has-a"



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

640?wxfrom=5&wx_lazy=1

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


640?wxfrom=5&wx_lazy=1

 

我们下面定义一个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对象。上述关系可以表示成:


640

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()的返回值)。


基本类型



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


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


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


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


总结



组合,has-a

基本类型


  • 原文:cnblogs.com/vamei/archive/2013/03/28/2987456.html

640?

Java团长

每日分享Java干货

微信号:javatuanzhang

640?

长按识别二维码

编程基础之二分查找 06:月度开销 (二分,使区间和最小)

评测链接:http://noi.openjudge.cn/ch0111/06/
  • yuyanggo
  • yuyanggo
  • 2015-12-02 12:08:19
  • 593

Java基础复习笔记06数据结构-队列

  • 2011年05月08日 21:54
  • 206KB
  • 下载

字符串1306

  • 2016年05月11日 02:46
  • 40.8MB
  • 下载

毕向东0706视频

  • 2016年05月09日 04:49
  • 27.07MB
  • 下载

电机与拖动基础06 电机与拖动基础06

  • 2011年04月27日 08:25
  • 40.9MB
  • 下载

java基础06面向对象

面向过程:动作的执行者 面向对象:1动作的指挥者。2是人们思考习惯的一种思想,3使复杂的事情简单化,                     不在强调过程,而是强调对象,找到了对象,其实就找到了这...
  • li1367356
  • li1367356
  • 2016-02-11 10:14:19
  • 127

java基础总结_06

面向对象(下)1:final关键字(掌握) (1)是最终的意思,可以修饰类,方法,变量。 (2)特点: A:它修饰的类,不能被继承。 B:它修饰的方法,不能被重写。 C:它修饰...
  • qq_27280457
  • qq_27280457
  • 2016-07-25 11:34:55
  • 134

java基础06 switch

1.根据名次获得奖励: package cn.kgc.swicth; import java.util.Scanner; /**  *   * @author Vip宅男  *  */ public ...
  • Vipwxs
  • Vipwxs
  • 2017-12-28 18:07:30
  • 37

java基础06

面向对象:   是相对与面向过程而言的一种编程思想。   面向过程:强调完成功能的过程。   面向对象:关注完成功能的结果。只管哪个对象完成这个功能             将功能封装进对象,...
  • u014565329
  • u014565329
  • 2014-04-06 11:11:29
  • 548

Java基础06——集合

Collections: sort方法: public static extends Comparable ? super T>> void sort(List list) T必须是Comparabl...
  • abookkeepper00
  • abookkeepper00
  • 2015-05-19 20:20:04
  • 217
收藏助手
不良信息举报
您举报文章:Java基础06 组合
举报原因:
原因补充:

(最多只允许输入30个字)