在groovy中定義類和java中是同樣的。類的方法能夠是static,也能夠是非static的。java
groovy中的方法能夠是public, protected, private,同時也支持java中的修飾符,好比synchronized。函數
在groovy中導入包或者導入類,語法和java是同樣的。只不過在groovy中默認已經導入了下面的package:spa
1 |
java.lang |
2 |
java.io |
3 |
java.math |
4 |
java.net |
5 |
java.util |
6 |
groovy.lang |
7 |
groovy.util |
在groovy和java中不一樣的一點就是,groovy默認是public的。.net
每個groovy類,在JVM層級,都是字節碼形式的java code,因此在java代碼中能夠調用groovy中申明的方法,反之亦然。命令行
你能夠指定方法的參數和返回值,以便他們可以更好的和java代碼相互調用。固然你也能夠實現接口或者重載方法。可是須要你沒有指定方法後者屬性的類型的話,那麼在JVM層級的字節碼中,他們將會是 java.lang.Object 類型。code
好比:接口
1 |
//Callee.groovy |
2 |
class Callee { |
3 |
void hello() { |
4 |
println "hello, world" |
5 |
} |
6 |
} |
1 |
//Caller.groovy |
2 |
c = new Callee() |
3 |
c.hello() |
下面給出了一個最簡單的groovy腳本:ip
1 |
println "Nice cheese Gromit!" |
若是你是要groovyc來編譯上面的代碼的話,假設你這個腳本的名字爲Foo.script,那麼你就會得到 Foo.class文件。string
你能夠在命令行運行下面的代碼,假設你的classpath中包含:groovy.jar and asm.jar.it
1 |
java Foo |
這將執行自動生成的實例化Foo class的 main(String[] args)方法,而後調用run()方法。固然你能夠能夠直接在java中使用這個類,
1 |
import groovy.lang.Binding; |
2 |
import groovy.lang.Script; |
3 |
4 |
public class UseFoo { |
5 |
public static void main(String[] args) { |
6 |
// lets pass in some variables |
7 |
Binding binding = new Binding(); |
8 |
binding.setVariable( "cheese" , "Cheddar" ) |
9 |
binding.setVariable( "args" , args) |
10 |
11 |
Script foo = new Foo(binding); |
12 |
foo.run(); |
13 |
} |
14 |
} |
其實在上面這裏不必使用Binding,由於Foo 有一個無參的構造函數,儘管使用Binding 咱們可以更加容易的傳遞參數。
相比起類來講,在groovy腳本中,變量不須要申明(def),在腳本中變量的引用將自動建立並放入Binding中。
在groovy腳本中,爲了編寫一個方法,不必像java同樣必須先定義一個類,
可是和傳統的基於class的groovy而言,在類外定義函數須要使用def關鍵字。可是若是你須要一些好比static或者實例變量等等的東西的時候,最好寫一個類。
下面給出了一個例子:
1 |
def foo(list, value) { |
2 |
println "Calling function foo() with param ${value}" |
3 |
list << value |
4 |
} |
5 |
6 |
x = [] |
7 |
foo(x, 1 ) |
8 |
foo(x, 2 ) |
9 |
assert x == [ 1 , 2 ] |
10 |
11 |
println "Creating list ${x}" |