变量是指存储变量值的内存地址(A variable is a name that refers to a location in memory that can store a value.)。就像Java一样,变量分为局部变量,它是在函数内部定义的变量;和全局变量,在程序执行的过程中一直有效,通常被称为字段(fields)。
在Groovy中,变量可分为强制类型的,或非强制类型的。非强制类型变量(untyped variables)由def关键字定义,并被给定其Object静态类型,和一个由变量值决定的动态类型。变量必须先声明才能在类中使用,而脚本中则不需声明便可直接使用,因为这种情况下变量与该脚本的绑定对象相关联(绑定是一种数据存储,能完成从脚本获取数据或传给脚本数据等数据转移;a binding is a data store that enables transfer of data from and to the script)。声明变量意味着给定变量其一个类型(无论显式还是隐式的)或一个修饰符(如public, private, protected, static, final, transient等等),再或者两者结合。
清单4.21 展示了如何在Groovy中定义字段和变量。
清单4.21 Groovy中的字段和局部变量
class A {
String typedField1, typedFiled2, typedFiled3
public publicField1, publicFiled2, publicField3
def untypedFiled
static staticField
final E = 'final field'
def method(){
def untypedLocal
int typedLocal
}
}
boundVar = 'hi'
def methodInScript(){
boundVar = 1
}
Groovy允许在同一行声明多个变量,且只需使用一个修饰符或类型。
下面代码在Groovy中是不正确的,您知道为什么吗?
class A{
x = 1
}
是的,在A类中x只有被声明后才可使用。但是,下面脚本却是完全正确的:
//x.groovy
x = 1
assert x ==1
Groovy是一种类型安全语言,也就是说您不可以给变量赋予一个,否则就会抛出ClassCastException异常,如:
int x =1
new GroovyTestCase().shouldFail(ClassCastException.class){
x = 'hi'
}
运行结果是这样的:
Result: "Cannot cast object 'hi' with class 'java.lang.String'
to class 'java.lang.Integer'
译者注:如果直接复制上述代码到脚本中,运行失败,这是因为GroovyTestCase会用到JUnit框架。如果要运行该例子,可参考第8章Groovy代码测试。
Groovy提供了多种调用字段的方法。看下面的类A:
class A {
def count = 0
}
您可使用下面任一方法访问字段:
l 使用字段名
A a = new A()
a.count = 1
assert a.count == 1
l 使用下标操作符
A a = new A()
a['count'] = 1
assert a['count'] == 1