﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-cAng^Er-随笔分类-|:好文转载:|</title><link>http://www.blogjava.net/xiaosao/category/24833.html</link><description>不懂我的人 , 离不了我 , 该了解了解我 !而懂我的人 , 更离不了我 , 因为他们爱我 。</description><language>zh-cn</language><lastBuildDate>Sat, 01 Mar 2008 12:36:47 GMT</lastBuildDate><pubDate>Sat, 01 Mar 2008 12:36:47 GMT</pubDate><ttl>60</ttl><item><title>Groovy轻松入门——通过与Java的比较，迅速掌握Groovy （更新于2007.09.23）</title><link>http://www.blogjava.net/xiaosao/archive/2008/02/29/182943.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Fri, 29 Feb 2008 07:30:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/archive/2008/02/29/182943.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/182943.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/archive/2008/02/29/182943.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/182943.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/182943.html</trackback:ping><description><![CDATA[<font color="#cc0000"><strong>原文：<font color="#990000"><a href="http://www.blogjava.net/BlueSUN/archive/2007/03/10/103014.html">http://www.blogjava.net/BlueSUN/archive/2007/03/10/103014.html</a></font> | <a id="AjaxHolder_Comments_CommentList_ctl01_NameLink" href="http://www.blogjava.net/BlueSUN/" target="_blank">山风小子</a><br />
注意：本教程是针对Groovy最新版本编写的</strong> </font><br />
<br />
Groovy和Java的相同点有：<br />
<font color="#0000cc">3+, </font><font color="#0000cc">4+, 6+, 8+, 10+, 12+, 13, 14, 15, 18+, 20+, 21, 22, 23, 28+, 29+, </font><font color="#0000cc">30+, 31+, 32+</font> <br />
<font color="#0000cc">+表示Groovy不但涵盖了Java的语法，而且还有增强部分<br />
<br />
Groovy和Java的不</font> <font color="#0000cc">同</font> <font color="#0000cc">点有：<br />
0, 1, 2, 5, 7, 9, 11, 16, 17, 19, 24, 25, 26, 27</font>&nbsp;<br />
<br />
<font color="#0000cc">下面所列序号不分先后顺序：</font><br />
<br />
<font color="#990000">0. 在Groovy可以用def定义无类型的变量(定义变量方面def与JavaScript中的var相似)，和返回值为无类型的方法，而在Java中没有def<br />
</font><font color="#009900">Groovy:<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;Man&nbsp;{<br />
&nbsp;&nbsp;def&nbsp;name&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;def&nbsp;introduce()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">I'm&nbsp;$name</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;return可以省略</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;}<br />
}</span></div>
<br />
</font><font color="#990000">1. Java中的equals方法对应Groovy中的== , 而Java中的==（判断是否引用同一对象）对应Groovy中的is方法</font><br />
eg.<br />
<font color="#009900">Test1.java :</font><br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;Test&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">static</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name1&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name2&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;String(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><span style="color: rgb(0,0,0)">山风小子</span></span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;Groovy中写为&nbsp;name1&nbsp;==&nbsp;name2</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">&nbsp;(name1.equals(name2))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">equal</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: rgb(0,0,255)">else</span><span style="color: rgb(0,0,0)">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">not&nbsp;equal</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;Groovy中写为&nbsp;name1.is(name2)</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">&nbsp;(name1&nbsp;</span><span style="color: rgb(0,0,0)">==</span><span style="color: rgb(0,0,0)">&nbsp;name2)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">identical</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: rgb(0,0,255)">else</span><span style="color: rgb(0,0,0)">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">not&nbsp;identical</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
}</span></div>
<br />
与Test1.java相对应的<br />
<font color="#009900">Test1.groovy :</font><br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,0)">String&nbsp;name1&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><span style="color: rgb(0,0,0)">山风小子</span></span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;你也可以这样写：&nbsp;def&nbsp;name1&nbsp;=&nbsp;"山风小子"&nbsp;&nbsp;其中的def可以理解为JavaScript中定义变量的var</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">String&nbsp;name2&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;String(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><span style="color: rgb(0,0,0)">山风小子</span></span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">)&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">请注意Groovy的句尾的分号时可选的，即可要可不要，前提是一行代码一条语句<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;Java中写为&nbsp;name1.equals(name2)</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">&nbsp;(name1&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">==</span><span style="color: rgb(0,0,0)">&nbsp;name2)&nbsp;{<br />
&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">equal</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);<br />
}&nbsp;</span><span style="color: rgb(0,0,255)">else</span><span style="color: rgb(0,0,0)">&nbsp;{<br />
&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">not&nbsp;equal</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);&nbsp;<br />
}<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;Java中写为&nbsp;name1&nbsp;&nbsp;==&nbsp;name2</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">&nbsp;(name1.is(name2))&nbsp;{<br />
&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">identical</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);<br />
}&nbsp;</span><span style="color: rgb(0,0,255)">else</span><span style="color: rgb(0,0,0)">&nbsp;{<br />
&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">not&nbsp;identical</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);&nbsp;<br />
}</span></div>
<br />
<font color="#990000">2. Java中的数组定义int[] a = {1, 2, 3}; 在Groovy写成int[] a = [1, 2, 3]<br />
3. Java中的for循环for (int i = 0; i &lt; len; i++) {...} 在Groovy中还可以写成for (i in 0..len-1) {...} 或者 for (i in 0..&lt;len) {...}<br />
<font color="#009900">Java:</font><br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">&nbsp;(</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;i&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">;&nbsp;i&nbsp;</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">&nbsp;len;&nbsp;i</span><span style="color: rgb(0,0,0)">++</span><span style="color: rgb(0,0,0)">)&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;do&nbsp;something</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">}<br />
</span></div>
<font color="#009900">Groovy:</font><br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><font size="+0"><font color="#990000"><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">&nbsp;(</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;i&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">;&nbsp;i&nbsp;</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">&nbsp;len;&nbsp;i</span><span style="color: rgb(0,0,0)">++</span><span style="color: rgb(0,0,0)">)&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;do&nbsp;something</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">}<br />
<br />
</span></font></font><font size="+0"><font color="#990000"><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;或者<br />
</span></font></font><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">&nbsp;(i&nbsp;in&nbsp;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">..len</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">)&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;do&nbsp;something</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">}<br />
<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;或者</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">&nbsp;(i&nbsp;in&nbsp;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">..</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">len)&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;do&nbsp;something</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">}<br />
</span></div>
<br />
4. Java中的方法返回写为return; 或者return obj; 在Groovy的方法中return是可选的<br />
<font color="#009900">Java:</font><br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;String&nbsp;sayHello()&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello,&nbsp;山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">;<br />
}</span></div>
<font color="#009900">Groovy:</font><br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;String&nbsp;sayHello()&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello,&nbsp;山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
}<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">或者</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;String&nbsp;sayHello()&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello,&nbsp;山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
}<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">或者</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">String&nbsp;sayHello()&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello,&nbsp;山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
}<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">或者</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;sayHello()&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello,&nbsp;山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
}<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;或者</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">def&nbsp;sayHello()&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello,&nbsp;山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
}</span></div>
<br />
5. Java中的inner class即内部类，在Groovy中用Closure实现（Closure是Java7正在考虑的一个特性，比inner class在语义方面更完善）<br />
6. Groovy中的注释比Java多了首行注释#!，其他与Java相同比如单行注释：//&nbsp;&nbsp;&nbsp; 多行注释：/*&nbsp; */&nbsp;&nbsp; 或者是&nbsp; 支持javadoc的/**&nbsp;&nbsp; */<br />
<font color="#009900">Java:</font><br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,128,0)">/*</span><span style="color: rgb(0,128,0)"><br />
&nbsp;*&nbsp;多行注释<br />
&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
<br />
</span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)"><br />
&nbsp;*&nbsp;javadoc&nbsp;注释<br />
&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;单行注释</span></div>
<br />
<font color="#009900">Groovy:<br />
</font>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><font size="+0"><font color="#990000"><span style="color: rgb(0,128,0)">#! 首行</span></font></font><font color="#990000"><font size="+0"><font color="#990000"><span style="color: rgb(0,128,0)">注释，使Unix shell能够定位Groovy启动程序以运行Groovy代码，例如</span></font></font></font><br />
<font size="+0"><font color="#990000"><span style="color: rgb(0,128,0)">#!/usr/bin/groovy<br />
</span></font></font><span style="color: rgb(0,128,0)"><br />
/*</span><span style="color: rgb(0,128,0)"><br />
&nbsp;*&nbsp;多行注释<br />
&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
<br />
</span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)"><br />
&nbsp;*&nbsp;javadoc&nbsp;注释<br />
&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;单行注释</span></div>
<br />
<br />
7. Java5中的for-each：for (Type t : iteratable) {...}&nbsp; 在Groovy中，for (t in iteratable) {...}<br />
<font color="#009900">Java:<br />
</font>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">&nbsp;(Type&nbsp;t&nbsp;:&nbsp;iterable)&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;do&nbsp;something</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">}</span></div>
<br />
<font color="#009900">Groovy:<br />
</font>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">&nbsp;(t&nbsp;in&nbsp;iterable)&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;do&nbsp;something</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">}</span></div>
<br />
8. Groovy中switch语句与Java中相同，不过支持更多类型了，比如String<br />
9. Groovy的while语句跟Java相同，但废弃了do-while （考虑到语义方面的问题，而且do-while可以用其他形式的循环语句代替，使用频率低）<br />
10. Java中的String常量表示为"Hello, 山风小子"，在Groovy中可如下表示<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;双引号</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello,&nbsp;山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;单引号也可以</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">'</span><span style="color: rgb(0,0,0)">Hello,&nbsp;山风小子</span><span style="color: rgb(0,0,0)">'</span><span style="color: rgb(0,0,0)"><br />
<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">多行字符串</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">"""</span><span style="color: rgb(0,0,0)">Hello,</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,0)">山风小子</span><span style="color: rgb(0,0,0)">"""<br />
</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">或者</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">'''</span><span style="color: rgb(0,0,0)">Hello,</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,0)">山风小子<br />
</span><span style="color: rgb(0,0,0)">'''<br />
</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;替代字符串</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">def&nbsp;name&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello,&nbsp;${name}</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">或者</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello,&nbsp;$name</span><span style="color: rgb(0,0,0)">"</span></div>
</font><font color="#990000">11.在Groovy中定义类，定义方法与Java中定义类相同，唯一区别在于Groovy中类，属性以及方法默认都是public的，而在Java中默认是package的，另外，在Groovy中可以用def来定义方法，请看注释。<br />
<font color="#009900">Java:<br />
</font>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;Hello&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">&nbsp;String&nbsp;name&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;sayHello()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello,&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">&nbsp;name);<br />
&nbsp;&nbsp;}<br />
}</span></div>
</font><font color="#009900">Groovy:</font><br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;Hello&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">&nbsp;String&nbsp;name&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;sayHello()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">println<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />与Java中System.out.println(<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />)相同</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;println&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello,&nbsp;$name</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">/*</span><span style="color: rgb(0,128,0)">&nbsp;sayHello也可以这样定义<br />
&nbsp;&nbsp;def&nbsp;sayHello()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;println&nbsp;"Hello,&nbsp;$name"<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
}</span></div>
<br />
<font color="#990000">12.对象创建在Java写为Thought t = new Thought(); 在Groovy也可以这样写，不过还多了种写法：def t = new Thought();<br />
13.静态方法调用在Java和Groovy中相同，即ClassName.staticMethodName();<br />
14.实现接口和继承父类方面Groovy也与Java完全相同，即实现接口class ClassName implements InterfaceName {...}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 继承父类：class ClassName extends SuperClass {...}<br />
15.定义接口方面Groovy与Java完全相同，即interface InterfaceName {...}&nbsp; //在Groovy中默认为public的<br />
16.正则表达式常量在Java中没有，在Groovy中表示为 /pattern/ <br />
17.Hash常量(类型为java.util.HashMap)在Java没有，在Groovy中表示为 def frequence = ["the": 5, "hello": 2, "world": 2]<br />
18.类变量即static变量，Groovy与Java相同，static String name = "山风小子"，在Groovy也可写为static name = "山风小子"<br />
19.在varargs方法方面，Groovy与Java稍有区别，如下所示：<br />
<font color="#009900">Java:</font><br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;Java:&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;varargsMethod(Type<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">do&nbsp;something</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">}</span></div>
<br />
<font color="#009900">Groovy:<br />
</font>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,0)">def&nbsp;varargsMethod(Type[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">do&nbsp;something</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">}</span></div>
<br />
20.引用当前对象，Groovy和Java相同，在Java中用this表示，在Groovy中也用this表示，而且在Groovy中，this可以出现在static范围中，指向所在类的类对象，本例中，this等同于</font><font color="#990000">ThisInStaticScope.class（Java写法</font><font color="#990000">）</font><font color="#990000">或</font><font color="#990000">ThisInStaticScope（Groovy写法）</font><font size="+0"><font color="#990000"></font></font><font color="#990000">
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;ThisInStaticScope&nbsp;{<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0,0,255)">static</span><span style="color: rgb(0,0,0)">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println&nbsp;</span><span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;请不要诧异，参数类型可以省略。如果方法声明中有</span><font size="+0"><font color="#990000"><font size="+0"><font color="#990000"><span style="color: rgb(0,128,0)">修饰</span></font></font><span style="color: rgb(0,128,0)">关键字比如</span></font></font><span style="color: rgb(0,128,0)">public，synchronized，static等</span><font size="+0"><font color="#990000"></font></font><span style="color: rgb(0,128,0)">，则返回值类型可以省略。</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">static</span><span style="color: rgb(0,0,0)">&nbsp;main(args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println&nbsp;</span><span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
21.子类中调用父类方法，Groovy和Java也相同，在Java中 super.methodName() ，在Groovy中 super.methodName()<br />
22.命名空间的定义，Groovy和Java相同，在Java中 package edu.ecust.bluesun;&nbsp;&nbsp; 在Groovy中 package edu.ecust.bluesun&nbsp;&nbsp;&nbsp;&nbsp; （分号可省略）<br />
23.在导入类方面，Groovy和Java相同，在Java中 import edu.ecust.bluesun.GroovyTest;&nbsp; 在Groovy中 import edu.ecust.bluesun.GroovyTest<br />
24.List常量(类型为java.util.ArrayList)在Java中没有， 在Groovy中表示为 def list = [3, 11, "Hello", "山风小子", "!"]<br />
25.在异常处理方面，Groovy与Java相同，除了不强制程序员捕获检查异常(checked exception)外 (这跟C#很像，如果我没记错的话 :) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 并且在方法声明时，也可以不写throws语句。<br />
26.方法的默认参数，Java中没有，Groovy中表示如下：<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;Hello&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">如果没有参数传入，默认打印出&nbsp;Hello,&nbsp;山风小子</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;def&nbsp;greet(name</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello,&nbsp;$name</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">)&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">也可省略括号()</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;}<br />
}</span></div>
27.在Groovy中，语句如果单独占一行的话，句尾的分号(;)可以省略，而在Java中每条语句后面必须跟有分号(;)<br />
28.在Groovy中，如果不是Boolean或boolean类型，非null或非空(空字符串，[]，[:])为true，null为false，而Java中对象不可以表示true或false；如果是Boolean或boolean类型，与Java中的一样。<br />
29.在Groovy中，万事万物都是对象！而Java中不是这样，基本类型(primitive type)就不是对象。<br />
30.在Java中，Class对象表示为ClassName.class，而在Groovy中，可以直接用ClassName表示Class对象<br />
31.Groovy会自动导入java.lang.*, java.util.*, java.net.*, java.io.*, java.math.BigInteger, java.math.BigDecimal,&nbsp;&nbsp; groovy.lang.*, groovy.util.*，而Java则只自动导入java.lang.*<br />
32.Groovy不仅有? :三元操作符，还有?:两元操作符，但Java只有? :三元操作符。<br />
</font><font color="#990000"><font color="#009900">Groovy:<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: rgb(0,0,0)">def&nbsp;a&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">null</span><span style="color: rgb(0,0,0)">;<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;如果a为&#8220;空&#8221;（null，空串""，[]，[:]），那么结果为?:之后的那个值;&nbsp;如果不为&#8220;空&#8221;，那么结果就是a</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">def&nbsp;result&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;a&nbsp;</span><span style="color: rgb(0,0,0)">?</span><span style="color: rgb(0,0,0)">:&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">default&nbsp;result</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
println&nbsp;result<br />
<br />
a&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
result&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;a&nbsp;</span><span style="color: rgb(0,0,0)">?</span><span style="color: rgb(0,0,0)">:&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">default&nbsp;result</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
println&nbsp;result</span></div>
<br />
<br />
<br />
</font></font><font color="#990000"><br />
<font color="#660000"><font color="#cc0000">由上可知，Groovy几乎完全兼容Java的语法，难怪&#8216;江南白衣&#8217;称Groovy是Java的&#8216;私生子&#8217;；但由于Groovy不仅借鉴了Java 95%以上的特性，而且还借鉴了许多卓越的动态语言，比如Python, Ruby等，使Groovy成为极其高效敏捷的编程语言，而不仅仅是Java的副本。所以其实Java++可以作为Groovy的别名，即具有动态特性的Java。<br />
</font></font><br />
最后，我想补充一句：Groovy的特性远不至所列的这些，比如还有Mixins，builder系列:MarkupBuilder,SwingBuilder等，很多都是Groovy中有而Java中没有，因此就不一一列举了，想继续深入学习Groovy，可访问Groovy官方网站：<a href="http://groovy.codehaus.org/">http://groovy.codehaus.org</a>&nbsp;，里面有很多例子和教程供大家参阅，也可以参考在下的Groovy高效编程系列（其中一些是在下的笔记）。网上也有《Groovy In Action》电子书下载，大家不妨搜一下。<br />
<br />
<br />
<font color="#000099"><strong>参考文献<br />
</strong></font><font color="#660000">Differences from Java:</font><a href="http://groovy.codehaus.org/Differences+from+Java">http://groovy.codehaus.org/Differences+from+Java</a></font>
<img src ="http://www.blogjava.net/xiaosao/aggbug/182943.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2008-02-29 15:30 <a href="http://www.blogjava.net/xiaosao/archive/2008/02/29/182943.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>&lt;转&gt;使用管理工具</title><link>http://www.blogjava.net/xiaosao/archive/2007/08/12/136161.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Sun, 12 Aug 2007 06:38:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/archive/2007/08/12/136161.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/136161.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/archive/2007/08/12/136161.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/136161.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/136161.html</trackback:ping><description><![CDATA[<p class=pbody align=left><a href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/3/3.3.htm">http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/3/3.3.htm</a><br>Java Web Services Developer Pack包括Tomcat Web 服务器管理工具，后文简称管理工具。管理工具 Web应用程序可用于操作Tomcat的运行。例如，可以添加和（或）配置上下文、主机、成员域和连接器，或者为容器管理安全性设置用户和角色。<br>为启动admintool，执行下列步骤。</p>
<p align=left>1．&nbsp;&nbsp; 按照启动Tomcat中的说明启动Tomcat。</p>
<p align=left>2．&nbsp;&nbsp; 启动Web浏览器。</p>
<p align=left>3．&nbsp;&nbsp; 在Web浏览器内，指向下列URL：</p>
<p class=pbodyrelative align=left><code><a href="http://localhost:8080/admin">http://localhost:8080/admin</a></code> </p>
<p class=pbodyrelative align=left><code>&lt;user name="adeveloper" password="secret" </code><br><code>&nbsp;&nbsp;roles="admin, manager" /&gt;</code> </p>
<p class=pbodyrelative align=left>该命令调用了admin Web应用程序。在使用该应用程序前必须添加用户名/密码组合并将其与角色名admin关联。访问这个工具所需的的初始用户名和密码必须在Java WSDP安装期间设置。如果忘记了用户名和密码，可以用任意的文本编辑器参阅&lt;JWSDP_HOME&gt;/conf/tomcat-users.xml。该文件包含各个用户的元素&lt;user&gt;，该元素可能如下所示：<code>&lt;user name="adeveloper" password="secret" </code><br><code>&nbsp;&nbsp;roles="admin, manager" /&gt;</code> </p>
<p align=left>4．&nbsp;&nbsp; 使用分配了admin角色的用户名和密码组合登录到admintool。该用户名和密码必须与build.properties文件中的用户名和密码匹配。</p>
<p align=left>5．&nbsp;&nbsp; 结束时，通过选择上窗格中的Logout来退出管理工具。</p>
<p class=pbody align=left>本节介绍了如何利用管理工具设置角色、组和用户。比如关于利用管理工具创建、删除、和（或）配置的信息：</p>
<p align=left>&#183;&nbsp;&nbsp; Tomcat服务器。</p>
<p align=left>&#183;&nbsp;&nbsp; 运行在Tomcat服务器上的服务，以及嵌套在这些服务里的各种元素，例如主机、上下文、成员域、连接器、日志记录器以及过滤阀。</p>
<p align=left>&#183;&nbsp;&nbsp; 各种资源例如数据源、环境条目，以及用户数据库。</p>
<h3 align=left>理解角色、组以及用户</h3>
<p class=pbody align=left>Tomcat服务器验证服务包括下列组件：</p>
<p align=left>&#183;&nbsp;&nbsp; <em>角色</em>——用于设置具体的资源访问权限的抽象名。角色可比作能开锁的钥匙。许多人可能都配有同样的钥匙，而锁不会考虑你是谁，只要有正确的钥匙就行了。</p>
<p align=left>&#183;&nbsp;&nbsp; <em>用户</em>——经过验证（关于验证前面章节已讨论过）的个人（或者应用程序）身份。一个用户可以有一系列与他身份相关联的角色，这样他就可以访问所有被保护的资源。</p>
<p align=left>&#183;&nbsp;&nbsp; <em>组</em>——按照像工种或客户资料这样的普通特性分类的一组验证用户。组还与一组角色关联，并且属于该组的用户继承了所有分配给该组的角色。</p>
<p align=left>&#183;&nbsp;&nbsp; <em>成员域</em>——角色、用户和组的完整数据库，用于识别Web应用程序的合法用户。</p>
<p class=pbody align=left>我们将在管理角色和用户一节中详细讨论了这些概念，关于管理工具的更多信息也可以找到。</p>
<h3 align=left>利用管理工具添加角色</h3>
<p class=pbody align=left>为设置容器管理安全的全新角色，遵循下列说明。管理工具中的添加、删除和改变写在tocamt-users.xml文件中。</p>
<p align=left>1．&nbsp;&nbsp; 向下滚动管理工具的左窗格到User and Group Administration（用户和组管理）节点。</p>
<p align=left>2．&nbsp;&nbsp; 选择Role Administration（角色管理）。</p>
<p align=left>3．&nbsp;&nbsp; 从Roles List（角色列表）中选择Create New Role（创建新角色）。</p>
<p align=left>4．&nbsp;&nbsp; 输入角色名和描述，例如<code>Customer</code>或<code>User</code>。</p>
<p align=left>5．&nbsp;&nbsp; 选择Save（保存）。</p>
<p align=left>利用管理工具添加用户</p>
<p align=left>要想为容器管理安全设置新用户，遵循下列说明。管理工具中的添加、删除和改变写在tocamt-users.xml文件中。</p>
<p align=left>1．&nbsp; 向下滚动管理工具的左窗格到User and Group Administration（用户和组管理）节点。</p>
<p align=left>2．&nbsp; 选择User Administration（用户管理）。</p>
<p align=left>3．&nbsp; 从Users List（用户列表）中选择Create New User（创建新用户）。</p>
<p align=left>4．&nbsp; 输入用户名和密码，并为新用户选择一个角色。如果为新用户选择admin角色，该用户将能访问管理工具.</p>
<p align=left>5．&nbsp; 选择Save（保存）。</p>
<h2 align=left>修改应用程序</h2>
<p class=pbody align=left>由于Java Web Services Developer Pack用于实验目的，它支持重复开发。只要改动了应用程序，就必须重新部署和加载该应用程序。在build.xml文件中定义的任务使得将这些改动部署到ConverterBean和JSP页面变得更简单。</p>
<p class=pbody align=left>在build.xml文件里，我们设置了一个在运行Tomcat服务器上安装应用程序的目标，和一个在运行Tomcat服务器内重载该应</p>
<p class=pbody align=left>用程序的目标。这些任务是用Tomcat服务器管理程序工具完成的，该工具是一个manager Web应用程序。可以使用在Java WSDP安装期间设置的用户名/密码组合，因为它能使管理程序的角色名与它关联。如果忘记了在安装期间设置的用户名/密码组合，可以利用任何文本编辑器查阅&lt;JWSDP_HOME&gt;/conf/tomcat/-user.xml。</p>
<h3 align=left>修改类文件</h3>
<p align=left>为了修改Java组件内的类文件，更改源代码，重编译它，然后重新部署应用程序。使用Tomcat manager Web应用程序时，不需要停止并重新启动Tomcat以便重新部署这个更改过的应用程序。例如，假定你想改变ConverterBean组件的yenRate属性中的汇率：</p>
<p align=left>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在源目录中编辑ConverterBean.java。</p>
<p align=left>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过输入ant build重新编译ConverterBean.java。</p>
<p align=left>3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过输入ant reload重新部署ConverterBean.java。</p>
<p align=left>4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Web浏览器中重新加载JSP页面。</p>
<h3 align=left>修改Web客户端</h3>
<p align=left>为了修改JSP页面，更改源代码并重新部署应用程序。使用Tomcat manager Web应用程序时，不需要停止并重新启动Tomcat以便重新部署更改过的Web客户端程序。例如，假定你想修改字体或者在JSP页面中添加另外的描述文本。为了修改Web客户端程序：</p>
<p align=left>1．&nbsp;&nbsp; 在源目录中编辑index.jsp。</p>
<p align=left>2．&nbsp;&nbsp; 通过输入ant reload重新加载Web应用程序。</p>
<p align=left>3．&nbsp;&nbsp; 在Web浏览器里重新加载JSP页面。</p>
<h2 align=left>常见问题及其解决方案</h2>
<p class=pbody align=left>使用下列指南来解决创建、编译、安装、部署和运行示例应用程序时遇到的问题。</p>
<h3 align=left>启动Tomcat时的错误</h3>
<h5 align=left>"Out of Environment Space"错误</h5>
<p class=pbody align=left>症状：在基于Microsoft Windows 9x/ME操作系统上，运行启动和关闭批处理文件时候出现&#8220;out of environment Space&#8220;错误。</p>
<p class=pbody align=left>解决方案：在Microsoft Windows 资源管理器中，右键单击startup.bat和shutdown.bat文件。选择&#8220;属性&#8221;，接着选择&#8220;内存&#8221;选项卡。 将&#8220;初始环境&#8221;域中的值增加到4096。选择&#8220;应用&#8221;。</p>
<p class=pbody align=left>选中&#8220;应用&#8221;后，在用来启动和停止容器的目录内将生成快捷方式。</p>
<h5 align=left>"Unable to Locate the Server localhost:8080"错误</h5>
<p class=pbody align=left>症状：试图在浏览器里加载Web应用程序时出现的"unable to locate server"错误。</p>
<p class=pbody align=left>解决方案：Tomcat的完全加载要花费一些时间，所以在继续疑难解决前首先要保证给Tomcat至少5分钟的加载时间。为了检验Tomcat是否正在运行，将浏览器指向<a href="http://localhost:8080/"><u><font color=#0000ff>http://localhost:8080</font></u></a>。在Tomcat索引屏幕出现时，便可以继续了。如果索引屏幕没有立即加载，等几分钟然后再重试。如果Tomact还没有加载，就像下面描述的那样，点击日志文件以获取更多的疑难解答信息。</p>
<p class=pbody align=left>Tomcat启动时将初始化自身，然后加载&lt;JWSDP_HOME&gt;/webapps中的所有Web应用程序。当通过调用startup.sh运行Tomcat时，服务器消息被登入到&lt;JWSDP_HOME&gt;/logs/launcher.server.log中。加载Web应用程序的过程可在<code>&lt;<em>JWSDP_HOME</em>&gt;/logs/jwsdp_log.&lt;<em>date</em>&gt;.txt文件中看到。</code></p>
<h3 align=left>编译错误</h3>
<h5 align=left>Ant 不能定位生成文件</h5>
<p class=pbody align=left>症状：在输入ant build时，出现如下消息：</p>
<div align=left>
<pre>Buildfile: build.xml does not exist!</pre>
</div>
<div align=left>
<pre>Build failed.<a name=wp68414> </a></pre>
</div>
<p class=pbody align=left>解决方案：从&lt;JWSDP_HOME&gt;/docs/tutorial/sxample/gs/目录启动Ant，或者从创建应用程序的目录。如果希望从当前目录启</p>
<p class=pbody align=left>动Ant，那么必须在命令行指定生成文件。例如，输入如下命令：</p>
<div align=left>
<pre>ant -buildfile </pre>
</div>
<div align=left>
<pre>&lt;<code><em>JWSDP_HOME</em></code>&gt;/docs/tutorial/examples/gs/build.xml</pre>
</div>
<div align=left>
<pre>build<a name=wp64536> </a></pre>
</div>
<h5 align=left>编译器不能解析符号</h5>
<p class=pbody align=left>症状：输入ant build时，编译器会报告许多错误，包括：</p>
<div align=left>
<pre>cannot resolve symbol</pre>
</div>
<div align=left>
<pre>. . .</pre>
</div>
<div align=left>
<pre>BUILD FAILED</pre>
</div>
<div align=left>
<pre>. . .</pre>
</div>
<div align=left>
<pre>Compile failed, messages should have been provided<a name=wp64539> </a></pre>
</div>
<div align=left>
<pre>&nbsp;</pre>
</div>
<p class=pbody align=left>解决方案：确定所使用的Ant版本是与该Java WSDP版本一起发布的。确保这一要求的最好方法是使用Ant文件的完整PATH来构建应用程序，&lt;JWSDP_HOME&gt;/jakarta-ant-1.5.1/bin/ant build。其他版本可能不包括示例应用程序生成文件所期望的所有功能。</p>
<h5 align=left>&nbsp;&#8220;连接拒绝&#8220;错误</h5>
<p class=pbody align=left>症状：在终端提示窗口中输入ant install时，收到下列消息：</p>
<div align=left>
<pre>&lt;<code><em>JWSDP_HOME&gt;</em></code>/docs/tutorial/examples/gs/build.xml:82: </pre>
</div>
<div align=left>
<pre>java.net.ConnectException: Connection refused<a name=wp75632> </a></pre>
</div>
<p class=pbody align=left>解决方案：Tomcat没有完全启动。等待几分钟，然后尝试再次安装应用程序。关于Tomcat启动疑难解答的更多信息，参阅<a href="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/3/3.3.htm#wp75383"><u><font color=#800080>无效的本地服务器localhost:8080</font></u></a> 。</p>
<h5 align=left>试图运行安装任务时，系统出现中止</h5>
<p class=pbody align=left>症状：输入ant install时，系统出现了中止。</p>
<p class=pbody align=left>解决方案：Tomcat启动脚本在后台启动了Tomcat，然后立即将用户返回命令提示行。尽管返回了命令行，但启动脚本可能还没有完全启动Tomcat。如果这个安装任务没有立即运行，等待几分钟后重试安装任务。为了检验Tomact是否在运行，将浏览器指向http://localhost:8080。若出现Tomcat索引屏幕，就可以继续。如果这个闪屏没有立即加载，等待几分钟后重试。如果Tomcat一直没有加载，检查日志文件以获得更多疑难解答信息：</p>
<p class=pbody align=left>Tomcat启动时先初始化自己，然后加载&lt;JWSDP_HOME&gt;/webapps中的所有Web应用程序。通过调用startup.sh运行Tomcat时，服务器消息已经登入&lt;JWSDP_HOME&gt;/logs/launcher.server.log。加载Web应用程序的过程可在<code>&lt;<em>JWSDP_HOME</em>&gt;/logs/jwsdp_log.&lt;<em>date</em>&gt;.txt文件中看到。</code></p>
<h3 align=left>部署错误</h3>
<h5 align=left><em>Server returned HTTP response code: 401 for URL ... </em></h5>
<p class=pbody align=left>症状：输入ant install时，出现如下消息：</p>
<div align=left>
<pre>BUILD FAILED</pre>
</div>
<div align=left>
<pre>/home/you/gs/build.xml:44:</pre>
</div>
<div align=left>
<pre>java.io.IOException: Server returned HTTP response code: 401</pre>
</div>
<div align=left>
<pre>for URL: http://localhost:8080/manager/install?path= ...<a name=wp77033> </a></pre>
</div>
<p class=pbody align=left>解决方案：确定build.properties文件中的用户名和密码与具有tomcat-users.xml文件里manager角色的用户名和密码相匹配。</p>
<h5 align=left>不能运行客户端应用程序</h5>
<p class=pbody align=left>症状：浏览器报告找不到该页面（HTTP404）。</p>
<p class=pbody align=left>解决方案：启动脚本在后台启动任务，然后立即将用户返回命令行提示窗口。尽管已经返回命令行，但启动脚本可能还没有</p>
<p class=pbody align=left>完全启动Tomcat。如果Web客户端没有立即运行，等待几分钟再重试加载Web客户端。</p>
<h5 align=left>找不到localhost机器</h5>
<p class=pbody align=left>症状：浏览器报告找不到该页面（HTTP404）。</p>
<p class=pbody align=left>解决方案：有时候，若位于代理服务器和防火墙的后面将不能访问localhost机器。为了解决这个问题，更改代理设置以便不再通过代理访问localhost。</p>
<p class=pbody align=left>为了在Netscape Navigator <img height=16 alt=Trademarked src="http://gceclub.sun.com.cn/staticcontent/html/webservices/web_services_tutorial/3/3.3.files/image001.gif" width=16 border=0 v:shapes="_x0000_i1025"> 浏览器中实现这一目的，选择Edit -&gt; Preferences -&gt; Advanced -&gt; Proxies ，然后选择 <code>No Proxy for: localhost</code>。 在 Internet Explorer中，选择 Tools -&gt; Internet Options -&gt; Connections -&gt; LAN Settings。</p>
<h5 align=left>应用程序没有部署</h5>
<p class=pbody align=left>症状：浏览器报告找不到该页面（HTTP404）。</p>
<p class=pbody align=left>解决方案：部署应用程序。想了解更多的细节，参阅部署应用程序一节。</p>
<h5 align=left><em>"Build Failed: Application Already Exists at Path" </em>错误</h5>
<p class=pbody align=left>症状：在终端提示窗口输入ant install时，收到如下消息：</p>
<div align=left>
<pre>[install] FAIL - Application already exists at path /GSApp </pre>
</div>
<div align=left>
<pre>BUILD FAILED </pre>
</div>
<div align=left>
<pre><code><em>&lt;JWSDP_HOME</em></code>&gt;/docs/tutorial/examples/gs/build.xml:82: FAIL - </pre>
</div>
<div align=left>
<pre>Application already exists at path /GSApp </pre>
</div>
<p class=pbody align=left>该应用程序已经安装。如果由于应用程序的安装而对它作出了改动，利用<code>ant</code> <code>reload</code>更新Tomcat中的应用程序。</p>
<h5 align=left><em>HTTP 500: No Context Error </em></h5>
<p class=pbody align=left>症状：在试图运行部署应用程序时候收到一个No Context Error错误。</p>
<p class=pbody align=left>解决方案：这个错误意味Tomcat被加载，但是它不知道应用程序。如果还没有通过运行ant remove、ant build、ant install和ant reload部署应用程序，现在做吧。</p>
<p class=pbody align=left>解决方案：如果Tomacat正在加载，但是还没有加载所有已存在的上下文，将收到该错误。不断点击浏览器中的重载或者刷新按钮，直到应用程序被加载或者收到另一种错误消息。</p>
<p style="TEXT-ALIGN: left" align=left><strong>更多信息</strong></p>
<p align=left>&#183;&nbsp;&nbsp; <em>Tomcat 管理工具</em>。阅读Tomcat管理工具以获得利用admintool，无需停止并重新启动Tomcat来配置它的行为的更多信息。</p>
<p align=left>&#183;&nbsp;&nbsp; <em>Tomcat 配置参考。</em>想了解更多关于能用来配置Tomacat行为的元素的信息，阅读&lt;<em>JWSDP_HOME</em>&gt;/docs/tomcat/config/index.html中的Tomcat配置参考。</p>
<p align=left>&#183;&nbsp;&nbsp; <em>类加载器入门。</em>该文档讨论了应用开发者和部署者应该把类和资源文件放在哪里，以便让Web应用能找到它们。该文档位于&lt;<em>JWSDP_HOME</em>&gt;/docs/tomcat/class-loader-howto.html中。</p>
<p align=left>&#183;&nbsp;&nbsp; <em>JNDI 资源入门。</em>该文档讨论了JNDI资源配置、Tomcat标准资源工厂、JDBC数据源，和定制资源工厂。该文档位于 &lt;<em>JWSDP_HOME</em>&gt;/docs/tomcat/jndi-resources-howto.html中。</p>
<p align=left>&#183;&nbsp;&nbsp; <em>Manager Application入门</em>。该文档描述了如何利用Manager Application，无需关闭和重新启动Tomcat，来部署新的Web应用程序，解除部署现有的应用程序，或者重载现有的应用程序。该文档位于&lt;<em>JWSDP_HOME</em>&gt;/docs/tomcat/manager-howto.html中。</p>
<p align=left>&#183;&nbsp;&nbsp; <em>代理支持入门。</em>该文档讨论了如何在代理服务器（或者配置来行使代理服务器功能的Web服务器）后面运行。特别地，该文档讨论了如何管理来自Web应用的调用返回值。其中该Web应用请求服务器名和请求将被发往的端口号。该文档位于&lt;<em>JWSDP_HOME</em>&gt;/docs/tomcat/proxy-howto.html中。</p>
<p align=left>&#183;&nbsp;&nbsp; <em>成员域配置入门。</em>该文档讨论了如何通过连接到用户名、密码、和用户角色的现有数据库，配置Tomcat以支持容器管理安全。该文档位于&lt;<em>JWSDP_HOME</em>&gt;/docs/tomcat/realm-howto.html</p>
<p align=left>&#183;&nbsp;&nbsp; <em>安全管理程序入门。</em>该文档讨论了运行Tomcat以保护服务器免受未经验证的serlvets、JSP、JSP bean、和标签库侵扰时，Security Manager的用法。该文档位于&lt;<em>JWSDP_HOME</em>&gt;/docs/tomcat/security-manager-howto.html中。</p>
<p align=left><em>SSL 配置入门</em>。该文档讨论了如何在Tomcat上安装和配置SSL支持。安装和配置SSL支持中讨论了如何利用Java WSDP在Tomcat上安装和配置SSL支持。&lt;<em>JWSDP_HOME</em>&gt;/docs/tomcat/ssl-howto.html 中的Tomcat文档也讨论了这个主题，然而，本教程中的信息对于这个与Java WSDP一起发布的Tomcat版本来说是最新的。</p>
<img src ="http://www.blogjava.net/xiaosao/aggbug/136161.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2007-08-12 14:38 <a href="http://www.blogjava.net/xiaosao/archive/2007/08/12/136161.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>