<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    First they ignore you
    then they ridicule you
    then they fight you
    then you win
        -- Mahatma Gandhi
    Chinese => English     英文 => 中文             
    隨筆-221  評(píng)論-1047  文章-0  trackbacks-0
    在前幾篇文章中,我已經(jīng)向大家介紹了Groovy是什么,學(xué)習(xí)Groovy的重要性等內(nèi)容,還不了解Groovy的朋友不妨去看看我Blog中的 Groovy分類 。下面我將通過Groovy與Java的比較,解開Groovy的神秘面紗。Ready? Start!

    注意:本教程是針對(duì)Groovy最新版本編寫的

    Groovy和Java的相同點(diǎn)有:
    0+, 3+, 4+, 6+, 8+, 10+, 12+, 13, 14, 15, 18+, 19+, 20+, 21, 22, 23, 28+, 29+, 30+, 31+, 32+
    +表示Groovy不但涵蓋了Java的語法,而且還有增強(qiáng)部分

    Groovy和Java的不
    點(diǎn)有:
    1, 2, 5, 7, 9, 11, 16, 17, 24, 25, 26, 27,33


    下面所列序號(hào)不分先后順序:

    0. 在Groovy可以用def定義無類型的變量(定義變量方面def與JavaScript中的var相似),和返回值為無類型的方法,而在Java中沒有def
    Groovy:
    class?Man?{
    ??def?name?
    =?"山風(fēng)小子"
    ??def?introduce()?{
    ????
    return?"I'm?$name"?//?return可以省略
    ??}
    }

    1. Java中的equals方法對(duì)應(yīng)Groovy中的== , 而Java中的==(判斷是否引用同一對(duì)象)對(duì)應(yīng)Groovy中的is方法
    eg.
    Test1.java :
    public?class?Test?{
    ??
    public?static?void?main(String[]?args)?{
    ????String?name1?
    =?"山風(fēng)小子";
    ????String?name2?
    =?new?String("山風(fēng)小子");
    ????
    //?Groovy中寫為?name1?==?name2
    ????if?(name1.equals(name2))?{
    ??????System.out.println(
    "equal");
    ????}?
    else?{
    ??????System.out.println(
    "not?equal");?
    ????}
    ????
    //?Groovy中寫為?name1.is(name2)
    ????if?(name1?==?name2)?{
    ??????System.out.println(
    "identical");
    ????}?
    else?{
    ??????System.out.println(
    "not?identical");?
    ????}?
    }

    與Test1.java相對(duì)應(yīng)的
    Test1.groovy :
    String?name1?=?"山風(fēng)小子"?//?你也可以這樣寫:?def?name1?=?"山風(fēng)小子"??其中的def可以理解為JavaScript中定義變量的var
    String?name2?=?new?String("山風(fēng)小子")?//請(qǐng)注意Groovy的句尾的分號(hào)時(shí)可選的,即可要可不要,前提是一行代碼一條語句
    //?Java中寫為?name1.equals(name2)
    if?(name1??==?name2)?{
    ??System.out.println(
    "equal");
    }?
    else?{
    ??System.out.println(
    "not?equal");?
    }
    //?Java中寫為?name1??==?name2
    if?(name1.is(name2))?{
    ??System.out.println(
    "identical");
    }?
    else?{
    ??System.out.println(
    "not?identical");?
    }

    2. Java中的數(shù)組定義int[] a = {1, 2, 3}; 在Groovy寫成int[] a = [1, 2, 3]
    3. Java中的for循環(huán)for (int i = 0; i < len; i++) {...} 在Groovy中還可以寫成for (i in 0..len-1) {...} 或者 for (i in 0..<len) {...}
    Java:
    for?(int?i?=0;?i?<?len;?i++)?{
    ??
    //?do?something
    }
    Groovy:
    for?(int?i?=0;?i?<?len;?i++)?{
    ??
    //?do?something
    }

    //?或者
    for?(i?in?0..len-1)?{
    ??
    //?do?something
    }

    //?或者
    for?(i?in?0..<len)?{
    ??
    //?do?something
    }

    4. Java中的方法返回寫為return; 或者return obj; 在Groovy的方法中return是可選的
    Java:
    public?String?sayHello()?{
    ??
    return?"Hello,?山風(fēng)小子";
    }
    Groovy:
    public?String?sayHello()?{
    ??
    return?"Hello,?山風(fēng)小子"
    }
    //或者
    public?String?sayHello()?{
    ??
    "Hello,?山風(fēng)小子"
    }
    //或者
    String?sayHello()?{
    ??
    "Hello,?山風(fēng)小子"
    }
    //或者
    public?sayHello()?{
    ??
    "Hello,?山風(fēng)小子"
    }
    //?或者
    def?sayHello()?{
    ??
    "Hello,?山風(fēng)小子"
    }

    5. Java中的inner class即內(nèi)部類,在Groovy中用Closure實(shí)現(xiàn)(Closure是Java7正在考慮的一個(gè)特性,比inner class在語義方面更完善)
    6. Groovy中的注釋比Java多了首行注釋#!,其他與Java相同比如單行注釋://??? 多行注釋:/*? */?? 或者是? 支持javadoc的/**?? */
    Java:
    /*
    ?*?多行注釋
    ?
    */

    /**
    ?*?javadoc?注釋
    ?
    */

    //?單行注釋

    Groovy:
    #! 首行注釋,使Unix shell能夠定位Groovy啟動(dòng)程序以運(yùn)行Groovy代碼,例如
    #!/usr/bin/groovy

    /*

    ?*?多行注釋
    ?
    */

    /**
    ?*?javadoc?注釋
    ?
    */

    //?單行注釋


    7. Java5中的for-each:for (Type t : iteratable) {...}? 在Groovy中,for (t in iteratable) {...}
    Java:
    for?(Type?t?:?iterable)?{
    ??
    //?do?something
    }

    Groovy:
    for?(t?in?iterable)?{
    ??
    //?do?something
    }

    8. Groovy中switch語句與Java中相同,不過支持更多類型了,比如String
    9. Groovy的while語句跟Java相同,但廢棄了do-while (考慮到語義方面的問題,而且do-while可以用其他形式的循環(huán)語句代替,使用頻率低)
    10. Java中的String常量表示為"Hello, 山風(fēng)小子",在Groovy中可如下表示
    //?雙引號(hào)
    "Hello,?山風(fēng)小子"

    //?單引號(hào)也可以
    'Hello,?山風(fēng)小子'

    //多行字符串
    """Hello,
    山風(fēng)小子"""

    //或者
    '''Hello,
    山風(fēng)小子
    '''

    //?替代字符串
    def?name?=?"山風(fēng)小子"
    "Hello,?${name}"
    //或者
    "Hello,?$name"
    11.在Groovy中定義類,定義方法與Java中定義類相同,唯一區(qū)別在于Groovy中類,屬性以及方法默認(rèn)都是public的,而在Java中默認(rèn)是package的,另外,在Groovy中可以用def來定義方法,請(qǐng)看注釋。
    Java:
    public?class?Hello?{
    ??
    private?String?name?=?"山風(fēng)小子";
    ??
    public?void?sayHello()?{
    ????System.out.println(
    "Hello,?"?+?name);
    ??}
    }
    Groovy:
    class?Hello?{
    ??
    private?String?name?=?"山風(fēng)小子"
    ??
    public?void?sayHello()?{
    ????
    //println與Java中System.out.println()相同
    ????println?"Hello,?$name"
    ??}
    ??
    /*?sayHello也可以這樣定義
    ??def?sayHello()?{
    ????println?"Hello,?$name"
    ??}
    ???
    */
    }

    12.對(duì)象創(chuàng)建在Java寫為Thought t = new Thought(); 在Groovy也可以這樣寫,不過還多了種寫法:def t = new Thought();
    13.靜態(tài)方法調(diào)用在Java和Groovy中相同,即ClassName.staticMethodName();
    14.實(shí)現(xiàn)接口和繼承父類方面Groovy也與Java完全相同,即實(shí)現(xiàn)接口class ClassName implements InterfaceName {...}
    ????? 繼承父類:class ClassName extends SuperClass {...}
    15.定義接口方面Groovy與Java完全相同,即interface InterfaceName {...}? //在Groovy中默認(rèn)為public的
    16.正則表達(dá)式常量在Java中沒有,在Groovy中表示為 /pattern/
    17.Hash常量(類型為java.util.HashMap)在Java沒有,在Groovy中表示為 def frequence = ["the": 5, "hello": 2, "world": 2]
    18.類變量即static變量,Groovy與Java相同,static String name = "山風(fēng)小子",在Groovy也可寫為static name = "山風(fēng)小子"
    19.在varargs方法方面,Groovy比Java多一種表達(dá)方式,如下所示:
    Java:
    //?Java:?
    public?void?varargsMethod(Type?args)?{
    ??
    //do?something
    }

    Groovy:
    // 與Java中的寫法相同
    def varargsMethod(Type... args) {
    ?
    //do?something
    }

    // Groovy還可以用[]代替...,反應(yīng)出varargs的本質(zhì)
    def?varargsMethod(Type[]?args)?{
    ??
    //do?something
    }

    20.引用當(dāng)前對(duì)象,Groovy和Java相同,在Java中用this表示,在Groovy中也用this表示,而且在Groovy中,this可以出現(xiàn)在static范圍中,指向所在類的類對(duì)象,本例中,this等同于
    ThisInStaticScope.class(Java寫法ThisInStaticScope(Groovy寫法)
    class?ThisInStaticScope?{
    ???
    static?{
    ????????println?
    this
    ????}
    ???
    //?請(qǐng)不要詫異,參數(shù)類型可以省略。如果方法聲明中有修飾關(guān)鍵字比如public,synchronized,static等,則返回值類型可以省略。
    ????static?main(args)?{
    ????????println?
    this
    ????}
    }

    21.子類中調(diào)用父類方法,Groovy和Java也相同,在Java中 super.methodName() ,在Groovy中 super.methodName()
    22.命名空間的定義,Groovy和Java相同,在Java中 package edu.ecust.bluesun;?? 在Groovy中 package edu.ecust.bluesun???? (分號(hào)可省略)
    23.在導(dǎo)入類方面,Groovy和Java相同,在Java中 import edu.ecust.bluesun.GroovyTest;? 在Groovy中 import edu.ecust.bluesun.GroovyTest
    24.List常量(類型為java.util.ArrayList)在Java中沒有, 在Groovy中表示為 def list = [3, 11, "Hello", "山風(fēng)小子", "!"]
    25.在異常處理方面,Groovy與Java相同,除了不強(qiáng)制程序員捕獲檢查異常(checked exception)外 (這跟C#很像,如果我沒記錯(cuò)的話 :)
    ??????? 并且在方法聲明時(shí),也可以不寫throws語句。
    26.方法的默認(rèn)參數(shù),Java中沒有,Groovy中表示如下:
    class?Hello?{
    ??
    //如果沒有參數(shù)傳入,默認(rèn)打印出?Hello,?山風(fēng)小子
    ??def?greet(name="山風(fēng)小子")?{
    ????println(
    "Hello,?$name")?//也可省略括號(hào)()
    ??}
    }
    27.在Groovy中,語句如果單獨(dú)占一行的話,句尾的分號(hào)(;)可以省略,而在Java中每條語句后面必須跟有分號(hào)(;)
    28.在Groovy中,如果不是Boolean或boolean類型,非null或非空(空字符串,[],[:])為true,null為false,而Java中對(duì)象不可以表示true或false;如果是Boolean或boolean類型,與Java中的一樣。
    29.在Groovy中,萬事萬物都是對(duì)象!而Java中不是這樣,基本類型(primitive type)就不是對(duì)象。
    30.在Java中,Class對(duì)象表示為ClassName.class,而在Groovy中,可以直接用ClassName表示Class對(duì)象
    31.Groovy會(huì)自動(dòng)導(dǎo)入java.lang.*, java.util.*, java.net.*, java.io.*, java.math.BigInteger, java.math.BigDecimal,?? groovy.lang.*, groovy.util.*,而Java則只自動(dòng)導(dǎo)入java.lang.*
    32.Groovy不僅有? :三元操作符,還有?:兩元操作符,但Java只有? :三元操作符。
    Groovy:
    def?a?=?null;
    //?如果a為“空”(null,空串"",[],[:]),那么結(jié)果為?:之后的那個(gè)值;?如果不為“空”,那么結(jié)果就是a
    def?result?=?a??:?"default?result"
    println?result

    a?
    =?"山風(fēng)小子"
    result?
    =?a??:?"default?result"
    println?result
    33.Groovy能進(jìn)行多重賦值,但Java不能
    Groovy:
    def?a,?b

    (a,?b)
    =?[1,?2]? // 給a和b賦值

    println([a,?b])

    (a,?b)
    =?[b,?a]? // 交換a和b的值

    println([a,?b])

    def (c, d) =?[1,?2] // 聲明的同時(shí)進(jìn)行初始化

    println([c, d])




    由上可知,Groovy幾乎完全兼容Java的語法,難怪‘江南白衣’稱Groovy是Java的‘私生子’;但由于Groovy不僅借鑒了Java 95%以上的特性,而且還借鑒了許多卓越的動(dòng)態(tài)語言,比如Python, Ruby等,使Groovy成為極其高效敏捷的編程語言,而不僅僅是Java的副本。所以其實(shí)Java++可以作為Groovy的別名,即具有動(dòng)態(tài)特性的Java。

    最后,我想補(bǔ)充一句:Groovy的特性遠(yuǎn)不至所列的這些,比如還有Mixins,builder系列:MarkupBuilder,SwingBuilder等,很多都是Groovy中有而Java中沒有,因此就不一一列舉了,想繼續(xù)深入學(xué)習(xí)Groovy,可訪問Groovy官方網(wǎng)站:http://groovy.codehaus.org?,里面有很多例子和教程供大家參閱,也可以參考在下的Groovy高效編程系列(其中一些是在下的筆記)。網(wǎng)上也有《Groovy In Action》電子書下載,大家不妨搜一下。


    參考文獻(xiàn)
    Differences from Java:http://groovy.codehaus.org/Differences+from+Java

    附: Groovy輕松入門--搭建Groovy開發(fā)環(huán)境
    posted on 2007-03-10 18:00 山風(fēng)小子 閱讀(19275) 評(píng)論(32)  編輯  收藏 所屬分類: Groovy & Grails
    主站蜘蛛池模板: 亚洲AV无一区二区三区久久| 亚洲中文字幕无码爆乳| 亚洲综合自拍成人| 91嫩草国产在线观看免费| 国产亚洲蜜芽精品久久| 亚洲Av无码精品色午夜| 国内自产少妇自拍区免费| 亚洲一区二区三区在线网站| 四虎AV永久在线精品免费观看| 怡红院亚洲红怡院在线观看| 免费A级毛片无码A| ssswww日本免费网站片| 91精品国产亚洲爽啪在线观看| 免费观看无遮挡www的小视频| 妇女自拍偷自拍亚洲精品| 91亚洲导航深夜福利| 亚洲A∨精品一区二区三区| 久久久久久国产a免费观看不卡| 激情综合色五月丁香六月亚洲| a级黄色毛片免费播放视频| 久久亚洲精品成人av无码网站| 国产午夜免费秋霞影院| 59pao成国产成视频永久免费 | 亚洲国产精品日韩| 91热成人精品国产免费| 免费无码VA一区二区三区| 亚洲高清不卡视频| 巨波霸乳在线永久免费视频 | 亚洲欧洲另类春色校园小说| 亚洲区日韩区无码区| 在线免费观看a级片| 一区二区三区福利视频免费观看| 美女免费视频一区二区| 67194在线午夜亚洲| 亚洲国产成人久久精品动漫| 亚洲性久久久影院| 一区二区三区观看免费中文视频在线播放| 久久亚洲AV成人无码国产电影 | 亚洲人成网站在线播放vr| 中文字幕免费在线| 精品久久久久久国产免费了|