对象引用

来源:互联网 发布:cadcam编程视频教程 编辑:程序博客网 时间:2024/04/29 11:45

在赋值语句age=25中,使用Groovy的动态类型(dynamic typing)功能。age变量所引用值的类型是在其运行过程中,而不是在编译时确定的。动态类型通常会使程序变得更为简洁,这也是Groovy之所以简洁与灵活的的主要原因。执行此赋值语句时会创建一个Integer对象,并将25赋值给它,变量age的引用关系如图2-1所示。

图2-1 变量与对象引用

原文

译文

varible

变量

object

对象


变量与对象之间的关联关系被称为引用。变量引用了该对象所使用的内存部分。任何使用该变量的情况,如在表达式age+22中,将使用引用来获得与该对象相关的对象值。

请考虑下面的表达式:

def age = 25
def number = age

在groovy中,变量通常都和对象相关联。因此,第二个赋值语句的作用是,让number变量引用age变量所引用的同一个对象。图2-2是一个用来描述共享(或者别名)的范例。在这个范例中,两个变量均引用相同的对象。

图2-2 共享

原文

译文

varible

变量

object

对象

在后续的代码中,如果给age变量赋一个新值,其效果如图2-3所示。在这里,可以发现age变量现在引用了一个不同的对象,而number变量却仍然引用被age赋值首次创建的对象。

图2-3 重新赋值

原文

译文

varible

变量

object

对象


图2-4 内存垃圾

原文

译文

varible

变量

object

对象

最后,设想一下给number变量赋新值的效果。图2-4说明表示值25的那个对象现在不再被任何变量引用。因此,在后面的代码中将不能再次使用它。这是一个内存垃圾(garbage)范例,也就是一个没法被引用的对象。在Groovy中,垃圾收集器最终将收回这些对象所占用的内存空间,并将其内存空间分配给其他对象循环使用。

上述这些图说明说明了,在程序代码的任何地方,可以非常自由地给变量赋新值。更进一步来说,这些新值可以通过已经存在的值而拥有不同的数据类型。这既是Groovy的优点,同时也是它的弱点。举例来说,用户可以自由地将一个String值赋给前面引用Integer的变量,其危险在于:在程序代码中可能不会意识到此问题,并导致其他难以预测的后果。

原创粉丝点击