类中的域

 转自http://book.51cto.com/art/201207/350797.htm

类的对象也称为这个类的实例。当创建一个对象时,对象包含在类定义中包括的所有域。但是,类定义中的域并不总是一样——一共有两种。

有一种域与类关联并且由类的所有对象共享。不管创建多少类对象,对于这类域来说,每个对象都只有一份副本,而且即使没有创建类的对象,它们也存在。这类变量被称为类变量,因为之前虽然说过,它们由类的所有对象共享,但实际上它们属于类而不属于任何特定对象。这些域也被称为静态域,因为当声明它们时使用了static关键字。

 

类的另一种域与每个对象唯一关联——对于这些域来说,类的每个实例都拥有它自己的一份副本,而且每个都赋有自己的值。这些域将对象区别开来,给予每个对象独有的特性——例如对一个给定的Person对象赋予特定的名称、地址以及电话号码。它们被称为非静态域(non-static field)或实例变量(instance variable),因为设定这些变量时不使用static关键字,而且类类型的每个实例都有自己的独立变量集合。

 

因为理解这点非常重要,所以下面总结一下这两种能够包括到类中的域:

非静态域,也称为实例变量:对于在类定义中出现的每个非静态域或实例变量,类的每个对象都有它自己的一份副本。每个对象都对自己的每个实例变量赋有自己的值。之所以称为实例变量,是因为每个对象都是类的一个实例或实现,而存储在某对象实例变量中的值将这个对象与其他同类对象区别开来。在类定义中使用通常的方法声明一个实例变量,即通过一个类型名和一个变量名来声明,而且可以为它设定一个初始值。

 

静态域,也称为类变量:对于在一个给定类中出现的每个静态域或类变量来说,这个类只有它们的一份副本,而且它们被该类的所有对象共享。即使没有创建类的对象,其中的每个类变量也会存在。类变量属于类,而且它们能被任何对象或类方法引用,而不是只能被属于它们所在的类实例的方法引用。如果一个静态域的值被修改,那么新值会同步到类的所有对象中。这与非静态域不同,因为修改一个对象的某个非静态域的值不会影响到其他的对象。在声明静态域时,必须在类型名的前面使用关键字static。

 

图5-1 展示了类变量和实例变量之间的区别。

(点击查看大图)图 5-1

图5-1 展示了类Sphere 的定义,包含一个类变量PI 和4 个实例变量radius、xCenter、yCenter和zCenter。对象globe 和ball 都有属于自己的名为radius、xCenter、yCenter 和zCenter 的变量集合,但是这两者共享类变量PI。

为什么在类定义中需要这两种不同的变量呢?很明显需要实例变量,这是因为它们存储的值能将一个特定对象与其他对象区别开来。球的半径和中心坐标是决定一个特定Sphere 对象的大小和所处空间位置的基本条件。虽然变量PI 对计算每一个球体的体积来说也是一个基本参数,但是在每一个Sphere 对象中都存储一个PI 值非常浪费,因为它一直保持不变。之前已经介绍过,可以从标准类Math 中获得PI 的值,所以在这种情况下它有些多余,但是这里主要是为了介绍类变量。所以,类变量的一种用途就是保持对类的所有对象都有相同的常量值(比如. )。

类变量的另一种用途是:跟踪对某个类的所有对象而言都一样、而且即使没有定义类的对象也仍然需要使用的数据值。例如,如果想要统计程序中已创建的某个类的对象数目,可以定义一个类变量来存储。这里必须使用类变量,因为即使没有创建对象也仍然需要使用这个变量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值