2、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[];
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次方;