<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  評論-1047  文章-0  trackbacks-0
    在前幾篇文章中,我已經(jīng)向大家介紹了Groovy是什么,學習Groovy的重要性等內(nèi)容,還不了解Groovy的朋友不妨去看看我Blog中的 Groovy分類 。下面我將通過Groovy與Java的比較,解開Groovy的神秘面紗。Ready? Start!

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

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

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


    下面所列序號不分先后順序:

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

    1. Java中的equals方法對應Groovy中的== , 而Java中的==(判斷是否引用同一對象)對應Groovy中的is方法
    eg.
    Test1.java :
    public?class?Test?{
    ??
    public?static?void?main(String[]?args)?{
    ????String?name1?
    =?"山風小子";
    ????String?name2?
    =?new?String("山風小子");
    ????
    //?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相對應的
    Test1.groovy :
    String?name1?=?"山風小子"?//?你也可以這樣寫:?def?name1?=?"山風小子"??其中的def可以理解為JavaScript中定義變量的var
    String?name2?=?new?String("山風小子")?//請注意Groovy的句尾的分號時可選的,即可要可不要,前提是一行代碼一條語句
    //?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,?山風小子";
    }
    Groovy:
    public?String?sayHello()?{
    ??
    return?"Hello,?山風小子"
    }
    //或者
    public?String?sayHello()?{
    ??
    "Hello,?山風小子"
    }
    //或者
    String?sayHello()?{
    ??
    "Hello,?山風小子"
    }
    //或者
    public?sayHello()?{
    ??
    "Hello,?山風小子"
    }
    //?或者
    def?sayHello()?{
    ??
    "Hello,?山風小子"
    }

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

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

    //?單行注釋

    Groovy:
    #! 首行注釋,使Unix shell能夠定位Groovy啟動程序以運行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, 山風小子",在Groovy中可如下表示
    //?雙引號
    "Hello,?山風小子"

    //?單引號也可以
    'Hello,?山風小子'

    //多行字符串
    """Hello,
    山風小子"""

    //或者
    '''Hello,
    山風小子
    '''

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

    12.對象創(chuàng)建在Java寫為Thought t = new Thought(); 在Groovy也可以這樣寫,不過還多了種寫法:def t = new Thought();
    13.靜態(tài)方法調(diào)用在Java和Groovy中相同,即ClassName.staticMethodName();
    14.實現(xiàn)接口和繼承父類方面Groovy也與Java完全相同,即實現(xiàn)接口class ClassName implements InterfaceName {...}
    ????? 繼承父類:class ClassName extends SuperClass {...}
    15.定義接口方面Groovy與Java完全相同,即interface InterfaceName {...}? //在Groovy中默認為public的
    16.正則表達式常量在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 = "山風小子",在Groovy也可寫為static name = "山風小子"
    19.在varargs方法方面,Groovy比Java多一種表達方式,如下所示:
    Java:
    //?Java:?
    public?void?varargsMethod(Type?args)?{
    ??
    //do?something
    }

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

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

    20.引用當前對象,Groovy和Java相同,在Java中用this表示,在Groovy中也用this表示,而且在Groovy中,this可以出現(xiàn)在static范圍中,指向所在類的類對象,本例中,this等同于
    ThisInStaticScope.class(Java寫法ThisInStaticScope(Groovy寫法)
    class?ThisInStaticScope?{
    ???
    static?{
    ????????println?
    this
    ????}
    ???
    //?請不要詫異,參數(shù)類型可以省略。如果方法聲明中有修飾關鍵字比如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???? (分號可省略)
    23.在導入類方面,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", "山風小子", "!"]
    25.在異常處理方面,Groovy與Java相同,除了不強制程序員捕獲檢查異常(checked exception)外 (這跟C#很像,如果我沒記錯的話 :)
    ??????? 并且在方法聲明時,也可以不寫throws語句。
    26.方法的默認參數(shù),Java中沒有,Groovy中表示如下:
    class?Hello?{
    ??
    //如果沒有參數(shù)傳入,默認打印出?Hello,?山風小子
    ??def?greet(name="山風小子")?{
    ????println(
    "Hello,?$name")?//也可省略括號()
    ??}
    }
    27.在Groovy中,語句如果單獨占一行的話,句尾的分號(;)可以省略,而在Java中每條語句后面必須跟有分號(;)
    28.在Groovy中,如果不是Boolean或boolean類型,非null或非空(空字符串,[],[:])為true,null為false,而Java中對象不可以表示true或false;如果是Boolean或boolean類型,與Java中的一樣。
    29.在Groovy中,萬事萬物都是對象!而Java中不是這樣,基本類型(primitive type)就不是對象。
    30.在Java中,Class對象表示為ClassName.class,而在Groovy中,可以直接用ClassName表示Class對象
    31.Groovy會自動導入java.lang.*, java.util.*, java.net.*, java.io.*, java.math.BigInteger, java.math.BigDecimal,?? groovy.lang.*, groovy.util.*,而Java則只自動導入java.lang.*
    32.Groovy不僅有? :三元操作符,還有?:兩元操作符,但Java只有? :三元操作符。
    Groovy:
    def?a?=?null;
    //?如果a為“空”(null,空串"",[],[:]),那么結(jié)果為?:之后的那個值;?如果不為“空”,那么結(jié)果就是a
    def?result?=?a??:?"default?result"
    println?result

    a?
    =?"山風小子"
    result?
    =?a??:?"default?result"
    println?result
    33.Groovy能進行多重賦值,但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] // 聲明的同時進行初始化

    println([c, d])




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

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


    參考文獻
    Differences from Java:http://groovy.codehaus.org/Differences+from+Java

    附: Groovy輕松入門--搭建Groovy開發(fā)環(huán)境
    posted on 2007-03-10 18:00 山風小子 閱讀(19278) 評論(32)  編輯  收藏 所屬分類: Groovy & Grails
    主站蜘蛛池模板: 亚洲视频在线免费| 亚洲人成色7777在线观看不卡| 一区二区三区免费视频观看 | 国产偷国产偷亚洲高清在线| 老司机亚洲精品影院无码| 亚洲国产成人影院播放| 四虎国产精品免费久久| 玖玖在线免费视频| 一级做a爰片久久免费| 亚洲av无码专区在线电影天堂| 亚洲综合在线成人一区| 国产成A人亚洲精V品无码性色 | 亚洲成a∧人片在线观看无码 | 9277手机在线视频观看免费| 成在线人视频免费视频| 无人视频在线观看免费播放影院| ASS亚洲熟妇毛茸茸PICS| 亚洲精品在线免费观看视频| 亚洲A∨无码无在线观看| 日本红怡院亚洲红怡院最新| 亚洲人成网站在线观看青青| 亚洲AV伊人久久青青草原| 免费国产不卡午夜福在线| 国产一级做a爱免费视频| 午夜小视频免费观看| 歪歪漫画在线观看官网免费阅读| 日韩免费一区二区三区在线| 1000部禁片黄的免费看| 最近中文字幕完整免费视频ww| 免费黄网站在线观看| 国产成人免费ā片在线观看老同学 | 欧洲亚洲国产清在高| 九月丁香婷婷亚洲综合色| 91麻豆精品国产自产在线观看亚洲| 亚洲成a人片在线播放| 亚洲第一成人影院| 亚洲日本中文字幕天堂网| 国产精品亚洲二区在线观看 | 亚洲中文字幕精品久久| 亚洲欧美成人综合久久久| 亚洲精品无码久久久久YW|