1. 程式人生 > >Groovy與Java的區別

Groovy與Java的區別

1. 在Groovy可以用def定義無型別的變數(定義變數方面def與JavaScript中的var相似),和返回值為無型別的方法,而在Java中沒有def

2. Java中的equals方法對應Groovy中的== , 而Java中的==(判斷是否引用同一物件)對應Groovy中的is方法

3. Java中的陣列定義int[] a = {1, 2, 3}; 在Groovy寫成int[] a = [1, 2, 3]

4. Java中的for迴圈for (int i = 0; i < len; i++) {...} 在Groovy中還可以寫成for (i in 0..len-1) {...} 或者 for (i in 0..<len) {...}

5. Java中的方法返回寫為return; 或者return obj; 在Groovy的方法中return是可選的

6.Java中的inner class即內部類,在Groovy中用Closure實現(Closure是Java7正在考慮的一個特性,比inner class在語義方面更完善)

7.Groovy中的註釋比Java多了首行註釋#!,其他與Java相同比如單行註釋://    多行註釋:/*  */   或者是  支援javadoc的/**   */

8.Java5中的for-each:for (Type t : iteratable) {...}  在Groovy中,for (t in iteratable) {...}

9.Groovy中switch語句與Java中相同,不過支援更多型別了,比如String

10.Groovy的while語句跟Java相同,但廢棄了do-while (考慮到語義方面的問題,而且do-while可以用其他形式的迴圈語句代替,使用頻率低)

11.Java中的String常量表示為"Hello, 山風小子",在Groovy中可如下表示“Hello, 山風小子”,‘Hello, 山風小子’,“”“Hello, 山風小子”“”(多行),‘’‘Hello, 山風小子’‘’(多行),def name="山風小子"    "Hello, ${name}" or  "Hello, $name"

12.在Groovy中定義類,定義方法與Java中定義類相同,唯一區別在於Groovy中類,屬性預設是private但會自動生成get/set方法供外部使用,方法預設是public的,而在Java中預設是package的,另外,在Groovy中可以用def來定義方法,請看註釋。

13.物件建立在Java寫為Thought t = new Thought(); 在Groovy也可以這樣寫,不過還多了種寫法:def t = new Thought()

14.靜態方法呼叫在Java和Groovy中相同,即ClassName.staticMethodName();

15.實現介面和繼承父類方面Groovy也與Java完全相同,即實現介面class ClassName implements InterfaceName {...}
      繼承父類:class ClassName extends SuperClass {...}

16.定義介面方面Groovy與Java完全相同,即interface InterfaceName {...}  //在Groovy中預設為public的

17.正則表示式常量在Java中沒有,在Groovy中表示為 /pattern/ 

18.Hash常量(型別為java.util.HashMap)在Java沒有,在Groovy中表示為 def frequence = ["the": 5, "hello": 2, "world": 2]

19.類變數即static變數,Groovy與Java相同,static String name = "山風小子",在Groovy也可寫為static name = "山風小子"

20.在varargs方法方面,Groovy比Java多一種表達方式,java/groovy:varargsMethod(Type... args),groovy:varargsMethod(Type[] args)

21.引用當前物件,Groovy和Java相同,在Java中用this表示,在Groovy中也用this表示,而且在Groovy中,this可以出現在static範圍中,指向所在類的類物件,本例中,this等同於ThisInStaticScope.class(Java寫法)或ThisInStaticScope(Groovy寫法)

22.子類中呼叫父類方法,Groovy和Java也相同,在Java中 super.methodName() ,在Groovy中 super.methodName()

23.名稱空間的定義,Groovy和Java相同,在Java中 package edu.ecust.bluesun;   在Groovy中 package edu.ecust.bluesun     (分號可省略)

24.在匯入類方面,Groovy和Java相同,在Java中 import edu.ecust.bluesun.GroovyTest;  在Groovy中 import edu.ecust.bluesun.GroovyTest

25.List常量(型別為java.util.ArrayList)在Java中沒有, 在Groovy中表示為 def list = [3, 11, "Hello", "山風小子", "!"]

26.在異常處理方面,Groovy與Java相同,除了不強制程式設計師捕獲檢查異常(checked exception)外 (這跟C#很像,如果我沒記錯的話 :)
        並且在方法宣告時,也可以不寫throws語句。

27.方法的預設引數,Java中沒有,Groovy中表示如下:def greet(name="andy"){...}

28.在Groovy中,語句如果單獨佔一行的話,句尾的分號(;)可以省略,而在Java中每條語句後面必須跟有分號(;)

29.在Groovy中,如果不是Boolean或boolean型別,非null或非空(空字串,[],[:])為true,null為false,而Java中物件不可以表示true或false;如果是Boolean或boolean型別,與Java中的一樣。

30.在Groovy中,萬事萬物都是物件!而Java中不是這樣,基本型別(primitive type)就不是物件。

31.在Java中,Class物件表示為ClassName.class,而在Groovy中,可以直接用ClassName表示Class物件

32.Groovy會自動匯入java.lang.*, java.util.*, java.net.*, java.io.*, java.math.BigInteger, java.math.BigDecimal,   groovy.lang.*, groovy.util.*,而Java則只自動匯入java.lang.*

33.Groovy不僅有? :三元操作符,還有?:兩元操作符,但Java只有? :三元操作符。def result ?: "default result",如果result不為空則是result,否則值為default result

34.Groovy能進行多重賦值,但Java不能。def a,b   (a,b) = [a,b]    println([a,b])

35.closure的owner引用的是該closure的‘擁有者’,隱式變數delegate的預設值為owner,如果closure沒有‘巢狀’在其他closure中,那麼該closure的owner的值為this;否則該closure的owner引用的是‘直接包含’該closure的closure

36.集合主要遍歷方法,each{...}逐個遍歷,collect{...}遍歷集合處理後的結果返回給對應的項,find{...}根據條件返回找到的第一個項,findAll{...}根據條件返回找到的所有項,min/max{...}返回集合中最小最大的項,join{'-'}用'-'連線集合中所有的項,any/every等等

37.Mixins,builder系列:MarkupBuilder,SwingBuilder等 ......