一、一些不同的地方
在上一次成长中,我们已经可以运行一个简单“Hello, Groovy!”的程序了,但是不知道熟悉Java的你是否注意到了一些问题,例如:
没有程序类的声明
没有main函数
语句结束的时候没有分号
没有函数调用时括号中加参数的特征
没有调用System.out类就直接使用println
的确,不妨让我们好好分析下上一次的程序:
println "Hello, Groovy!"
这样的程序在Java中是不可能输出的,但是在Groovy中,就这样一句简简单单的语句确确实实输出了我们要的信息!别怀疑,这就是Groovy,这就是脚本语言。
但是这些不同是怎么回事?
如果脚本中使用了松散语句,那么.class文件中会有一个main函数,使得你可以使用类似与java scriptName的方法来执行一个脚本
虽然Groovy的目标是支持所有合法的Java语法,但是这个目标显然没有达到
每行语句结尾的分号可有可无
方法参数的圆括号可有可无,除非该方法没有参数或不加参数产生歧异或该方法是构造函数
在Groovy中,我们在静态方法中使用_this_关键字来指明当前类
return在某些情况下也是可有可无的,在没有return的情况下groovy会把函数结束时最后一个大括号前面的语句的值作为返回值
groovy默认的属性和方法的权限时公共的(public)而不同于java的私有的(pravite)
groovy中的protected权限等同于java中的包保户(package-protected)和保护(protected)。例如你在同一个包中有个友元类,它的子类依然可以访问protected的成员
在Groovy中,当前的版本并不支持内部类,你可以通过使用闭包(closures)来代替。
在方法头添加throws语句当前的版本并不支持,因为在检测到的异常和未检测到的异常之间没有什么区别。
java.lang, groovy.lang和groovy.util类会被自动导入。
还有一些特点是在Groovy中专有的,但是在java中部可用的那种:
lists和maps的本地
支持动态和静态类型 - 所以你可以在方法、字段和变量中省略类型声明
你可以在
在
无论是增添属性还是事件监听器,在编写beans时语法简单
因此我们明白了关于上述一些问题的答案,更多的不同将在以后的深入学习中发现。
二、Groovy脚本
Groovy的脚本是一些以“.groovy”作为文件扩展名文件,其中包含了若干的松散语句,与类无关的方法定义和类定义等等。例如:
// 下面是松散语句
println "Hello, World!"
printAge "Actaeon", 23
println new MyClass(a1:"charge", a2:26.2)
// 与类无关的方法定义
def printAge(p1, p2) {
println "my age: p1=${p1}, p2=${p2}"
}
// 某个类中的方法定义
class MyClass {
a1; a2
String toString() { "toString: a1=${a1}, a2=${a2}" }
}
方法和类的定义顺序随意,就是说不必把方法和类定义在使用他们语句的前面。而当一个与类有关的松散语句在被编译的时候,它会被编译为这个类的方法。例如在MyClass中有个path方法,则它会被编译成为叫做path的静态方法。而一些松散语句会被收集到run方法中
当groovyc被用来便宜一个脚本的时候,生成的类会有一个包含了所有的松散语句的run方法以及调用run方法的main方法。
目前脚本还不能引用其他脚本中的代码除非他们是编译好的并被引入了的。 这会在不久之后改进。