Starting Groovy

相比于一个传统的Java类,一个包含main方法的Groovy类可以如下书写:

代码1:具有main函数的Groovy类
package plswg.edu.groovy.basic

// 利用class关键字创建一个groovy类
class G01_HelloWorldClass {

// 静态的main方法作为程序入口
static main(args) {

// 使用println命令输出
println “HelloWorld in class”
}

}
和Java一样,程序会从这个类的main方法开始执行,和Java的区别是:

class前省略public修饰;
main方法前省略public修饰;
main方法省略返回值类型void;
main方法形参列表省略类型String[];
当然,这只是Groovy代码的一种写法,实际上执行Groovy代码完全可以不必需要一个类或main方法,所以更简单的写法如下:
package plswg.edu.groovy.basic

// 对于groovy程序来说,可以没有类和main方法,直接书写的代码就可以作为脚本运行
println “HelloWorld in script”
这段代码仍可以直接运行。

实际上,*终编译器仍会为这段代码生成一个类,类名和文件名相同,只不过从源码的角度上,确实不用写类或者main方法了,这一点很像Javascript等其它脚本语言。

可以注意到,Groovy将Java中繁琐的System.out.println简化为了println,甚至可以不为形参列表加括号,这都是允许的,Groovy非常简洁,甚至不要求语句末尾的分号(当然,写上分号也无伤大雅)

3、Groovy变量

既然是脚本语言,Groovy的变量也被设计成为了类似的弱类型,实际上Groovy同时支持强类型变量和“弱”类型变量,强类型变量拥有自己的类型,而“弱”类型变量则全部会被编译为Object类型,从代码的角度上,Groovy的变量无需声明类型了:

package plswg.edu.groovy.basic

// groovy可以使用类型确定的变量或常量

String s1 = “Hello ”
print s1

final String s2 = “World”
println s2

// 利用def关键字可以定义可变类型的变量或常量

def s3 = “Welcome ”
print s3

// 对于可变类型,即随时可以改变其类型,赋予不同的量

s3 = 123 // 此时str3被赋予了整型量,所以其类型变为Integer类型
println s3

s3 += 100 // 整型的str3和整型相加,结果是整型223
println s3

s3 = true // str3目前是boolean类型
println (“Ok ” + s3)

// 对于局部变量,甚至可以不使用def关键字来定义
s4 = “Good job”
println s4

// 对于数值类型,有如下规则

int n1 = 10
n2 = n1 / 3
println n2 // 对于n1为整数时, 10 / 3的结果并不是整数,这说明常量n2并不是整数

int n3 = n1 / 3 // 明确定义n3为整数后,相除的结果为整数
println n3

n2 = n1.intdiv(3)
println n2 // intdiv用于进行整除

n2 = n1.power(2) // 求平方 groovy方法
println n2

n2 = n1 ** 2 // 求平方的groovy语法
println n2

n1 = Math.sqrt(n2) // 求开方 java方法
println n1
从上面的代码可以看到,Groovy支持有类型的变量,例如 String s;也支持无类型的变量,例如 def s,相当于Java中的Object s;对于无类型的变量,甚至可以不写 def关键字。
final关键字依然作为常量标识,这一点和Java相同。

*后注意一点,Groovy中没有Java中的值类型简单对象,所有的对象都是引用类型对象,例如定义def n = 10,n的类型应该是Integer类型而不是int类型;即便定义了int n = 100,n的类型依然是Integer类型;如果定义了def n = 12.34,则注意,n的类型是BigDecimal类型而不是Double类型,只有显式定义double n = 12.34,n的类型才明确为Double类型(依旧不是double类型)

对于基本算术运算符,Groovy增加了**运算符,表示求幂,x ** y表示求x的y次方