1、类
(1)类
l Groovy的类定义和Java类似
Ø 方法可以基于类(static)或实例
Ø 可以为public、protected或private
Ø 支持常用的Java修饰符,如synchronized
l Groovy的不同地方:缺省是public
l Groovy支持JavaBean机制:GroovyBean
l 每个Groovy类都是字节码/JVM级的Java类,任何方法对Java都是有效的,反之亦然
l 你可以指定方法的参数类型和返回类型,这样可以在通常的Java代码中更好的工作
l 你可以用上面的方式来实现接口或重载方法
l 如果省略方法的类型,就会使用缺省的java.lang.Object
(2)脚本
l Groovy支持纯脚本,而不需要声明类,如Foo.groovy包含下面的脚本:
println "Nice cheese Gromit!"
l 运行脚本的过程:
Ø 编译成Foo.class(还会有一些内类),该类扩展groovy.lang.Script
Ø 执行自动生成的main方法
Ø 实例化Foo类
Ø 调用run方法执行脚本内容
l 可以在Java代码中执行脚本,同时还可以传递变量值到脚本中
l Foo.groovy内容修改如下
println "Nice ${cheese} Gromit!"
l 下面是执行脚本的UseFoo类
import groovy.lang.Binding;
import groovy.lang.Script;
public class UseFoo {
public static void main(String[] args) {
Binding binding = new Binding();
binding.setVariable("cheese", "Cheddar");
Script foo = new Foo(binding);
foo.run();
}
}
l UseFoo运行的结果是:Nice Cheddar Gromit!
l 执行脚本的方法是创建Foo类实例,调用其run方法
l Foo类有一个带Binding参数的构造函数,可以通过Binding类的setVariable方法设置值给脚本中的属性变量
l Foo类有一个不带参数的构造函数,在不传递属性变量值时使用
l 在脚本结束后,脚本中创建的任何变量都会在Binding中,以供在Java中访问
l 再将Foo.groovy内容修改如下
println "Nice ${cheese} Gromit!"
cheese = "changed"
l UseFoo类修改为:
import groovy.lang.Binding;
import groovy.lang.Script;
public class UseFoo {
public static void main(String[] args) {
Binding binding = new Binding();
binding.setVariable("cheese", "Cheddar");
Script foo = new Foo(binding);
foo.run();
println binding.getVariable("cheese");
}
}
l UseFoo运行的结果是:
Nice Cheddar Gromit!
changed
(3)脚本中的函数
l 不同于基于Class的Groovy,纯脚本中的函数用def关键字声明
def foo(list, value) {
println "Calling function foo() with param ${value}"
list << value
}
x = []
foo(x, 1)
foo(x, 2)
assert x == [1, 2]
println "Creating list ${x}"