﻿<?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-lsbwahaha-随笔分类-java基础</title><link>http://www.blogjava.net/lsbwahaha/category/38813.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 30 Oct 2011 07:53:47 GMT</lastBuildDate><pubDate>Sun, 30 Oct 2011 07:53:47 GMT</pubDate><ttl>60</ttl><item><title>java的4种Reference探讨</title><link>http://www.blogjava.net/lsbwahaha/archive/2011/10/30/362314.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Sun, 30 Oct 2011 03:59:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2011/10/30/362314.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/362314.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2011/10/30/362314.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/362314.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/362314.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: java中的引用分为4种：String Reference， WeakReference， softReference，PhantomReference   &nbsp;Strong Reference:  我们平常用的最多的就是强引用了 如：String&nbsp;s = new String("opps");这种形式的引用称为强引用，这种引用有以下几个特点   1.强引用可以直接访问目标对象&...&nbsp;&nbsp;<a href='http://www.blogjava.net/lsbwahaha/archive/2011/10/30/362314.html'>阅读全文</a><img src ="http://www.blogjava.net/lsbwahaha/aggbug/362314.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2011-10-30 11:59 <a href="http://www.blogjava.net/lsbwahaha/archive/2011/10/30/362314.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>理解java中的ThreadLocal</title><link>http://www.blogjava.net/lsbwahaha/archive/2011/10/29/362282.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Sat, 29 Oct 2011 09:39:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2011/10/29/362282.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/362282.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2011/10/29/362282.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/362282.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/362282.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;一、对ThreadLocal概术&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JDK API 写道：该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物，因为访问某个变量（通过其 get 或 set 方法）的每个线程都有自己的局部变量，它独立于变量的初始...&nbsp;&nbsp;<a href='http://www.blogjava.net/lsbwahaha/archive/2011/10/29/362282.html'>阅读全文</a><img src ="http://www.blogjava.net/lsbwahaha/aggbug/362282.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2011-10-29 17:39 <a href="http://www.blogjava.net/lsbwahaha/archive/2011/10/29/362282.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Concurrent学习—Executor框架</title><link>http://www.blogjava.net/lsbwahaha/archive/2011/10/12/361073.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Wed, 12 Oct 2011 09:25:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2011/10/12/361073.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/361073.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2011/10/12/361073.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/361073.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/361073.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;java.util.concurrent包分成了三个部分，分别是：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp...&nbsp;&nbsp;<a href='http://www.blogjava.net/lsbwahaha/archive/2011/10/12/361073.html'>阅读全文</a><img src ="http://www.blogjava.net/lsbwahaha/aggbug/361073.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2011-10-12 17:25 <a href="http://www.blogjava.net/lsbwahaha/archive/2011/10/12/361073.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TrueZIP使用过程中遇到的问题记录</title><link>http://www.blogjava.net/lsbwahaha/archive/2011/01/11/342800.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Tue, 11 Jan 2011 14:30:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2011/01/11/342800.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/342800.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2011/01/11/342800.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/342800.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/342800.html</trackback:ping><description><![CDATA[&nbsp;
<p>最近有Java解压缩的需求，java.util.zip实在不好用，对中文支持也不行。所以选择了强大的TrueZIP，使用时遇到了一个问题，做个记录。<br />
解压缩代码如下：</p>
<pre><span style="font-family: 'Courier New'">ArchiveDetector detector <span style="color: #339933">=</span> <strong><span style="color: black">new</span></strong> DefaultArchiveDetector<span style="color: #009900">(</span>ArchiveDetector.<span style="color: #006633">ALL</span>,</span></pre>
<pre><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><span style="color: black">new</span></strong> <span style="color: #003399">Object</span><span style="color: #009900">[]</span> <span style="color: #009900">{</span> <span style="color: blue">"zip"</span>, <strong><span style="color: black">new</span></strong> CheckedZip32Driver<span style="color: #009900">(</span><span style="color: blue">"GBK"</span><span style="color: #009900">)</span> <span style="color: #009900">}</span> <span style="color: #009900">)</span><span style="color: #339933">;</span></span></pre>
<pre><span style="font-family: 'Courier New'; color: #003399">File</span><span style="font-family: 'Courier New'"> zipFile <span style="color: #339933">=</span> <strong><span style="color: black">new</span></strong> <span style="color: #003399">File</span><span style="color: #009900">(</span><span style="color: blue">"zipFile"</span>, detector<span style="color: #009900">)</span><span style="color: #339933">;</span></span></pre>
<pre><span style="font-family: 'Courier New'; color: #003399">File</span><span style="font-family: 'Courier New'"> dst <span style="color: #339933">=</span> <strong><span style="color: black">new</span></strong> <span style="color: #003399">File</span><span style="color: #009900">(</span><span style="color: blue">"dst"</span><span style="color: #009900">)</span><span style="color: #339933">;</span></span></pre>
<pre><em><span style="font-family: 'Courier New'; color: #666666">// </span></em><em><span style="color: #666666">解压缩</span></em></pre>
<pre><span style="font-family: 'Courier New'">zipFile.<span style="color: #006633">copyAllTo</span><span style="color: #009900">(</span>dst<span style="color: #009900">)</span><span style="color: #339933">;</span></span></pre>
<p>代码十分简洁，注意这个File是</p>
<pre><span style="font-family: 'Courier New'">de.<span style="color: #006633">schlichtherle</span>.<span style="color: #006633">io</span>.<span style="color: #003399">File</span></span></pre>
<p>不是</p>
<pre><span style="font-family: 'Courier New'">java.<span style="color: #006633">io</span>.<span style="color: #003399">File</span></span></pre>
<p>当处理完业务要删除这个Zip File时，问题出现了：<br />
这个文件删不掉！！！<br />
把自己的代码检查了好久，确认没问题后，开始从TrueZIP下手，发现它有特殊的地方的，是提示过的：</p>
<p>File file = new File(&#8220;archive.zip&#8221;); // de.schlichtherle.io.File!<br />
Please do not do this instead:<br />
de.schlichtherle.io.File file = new de.schlichtherle.io.File(&#8220;archive.zip&#8221;);</p>
<p><br />
This is for the following reasons:<br />
1.Accidentally using java.io.File and de.schlichtherle.io.File instances referring to the same path concurrently will result in erroneous behaviour and may even cause loss of data! Please refer to the section &#8220;Third Party Access&#8221; in the package Javadoc of de.schlichtherle.io for for full details and workarounds.<br />
2.A de.schlichtherle.io.File subclasses java.io.File and thanks to polymorphism can be used everywhere a java.io.File could be used. </p>
<p>原来两个File不能交叉使用，搞清楚原因了，加这么一句代码搞定。</p>
<pre><span style="font-family: 'Courier New'">zipFile.<span style="color: #006633">deleteAll</span><span style="color: #009900">()</span><span style="color: #339933">;<br />
<br />
</span></span></pre>
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/342800.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2011-01-11 22:30 <a href="http://www.blogjava.net/lsbwahaha/archive/2011/01/11/342800.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>antlr简介</title><link>http://www.blogjava.net/lsbwahaha/archive/2010/12/17/341019.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Fri, 17 Dec 2010 11:20:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2010/12/17/341019.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/341019.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2010/12/17/341019.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/341019.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/341019.html</trackback:ping><description><![CDATA[<a href="/Files/lsbwahaha/ANTLR_info.pdf" target="_blank">http://www.blogjava.net/Files/lsbwahaha/ANTLR_info.pdf</a><br />
antlr简介<br />
<br />
<br />
<!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:RelyOnVML/>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
<w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
<w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>ZH-CN</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:SpaceForUL/>
<w:BalanceSingleByteDoubleByteWidth/>
<w:DoNotLeaveBackslashAlone/>
<w:ULTrailSpace/>
<w:DoNotExpandShiftReturn/>
<w:AdjustLineHeightInTable/>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:DontVertAlignCellWithSp/>
<w:DontBreakConstrainedForcedTables/>
<w:DontVertAlignInTxbx/>
<w:Word11KerningPairs/>
<w:CachedColBalance/>
<w:UseFELayout/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math" />
<m:brkBin m:val="before" />
<m:brkBinSub m:val="&#45;-" />
<m:smallFrac m:val="off" />
<m:dispDef/>
<m:lMargin m:val="0" />
<m:rMargin m:val="0" />
<m:defJc m:val="centerGroup" />
<m:wrapIndent m:val="1440" />
<m:intLim m:val="subSup" />
<m:naryLim m:val="undOvr" />
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267">
<w:LsdException locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal" />
<w:LsdException locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 2" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 3" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 4" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 5" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 6" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 7" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 8" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 9" />
<w:LsdException locked="false" priority="39" name="toc 1" />
<w:LsdException locked="false" priority="39" name="toc 2" />
<w:LsdException locked="false" priority="39" name="toc 3" />
<w:LsdException locked="false" priority="39" name="toc 4" />
<w:LsdException locked="false" priority="39" name="toc 5" />
<w:LsdException locked="false" priority="39" name="toc 6" />
<w:LsdException locked="false" priority="39" name="toc 7" />
<w:LsdException locked="false" priority="39" name="toc 8" />
<w:LsdException locked="false" priority="39" name="toc 9" />
<w:LsdException locked="false" priority="35" qformat="true" name="caption" />
<w:LsdException locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title" />
<w:LsdException locked="false" priority="1" name="Default Paragraph Font" />
<w:LsdException locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle" />
<w:LsdException locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong" />
<w:LsdException locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis" />
<w:LsdException locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid" />
<w:LsdException locked="false" unhidewhenused="false" name="Placeholder Text" />
<w:LsdException locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1" />
<w:LsdException locked="false" unhidewhenused="false" name="Revision" />
<w:LsdException locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph" />
<w:LsdException locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote" />
<w:LsdException locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6" />
<w:LsdException locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis" />
<w:LsdException locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis" />
<w:LsdException locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference" />
<w:LsdException locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference" />
<w:LsdException locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title" />
<w:LsdException locked="false" priority="37" name="Bibliography" />
<w:LsdException locked="false" priority="39" qformat="true" name="TOC Heading" />
</w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}
</style>
<![endif]-->
<p class="MsoNormal"><span style="font-family: 宋体;">目前的</span><span lang="EN-US">ANTLR</span><span style="font-family: 宋体;">支持的语法层的选项主要包括：</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">语言选项（</span><span lang="EN-US">Language</span><span style="font-family: 宋体;">）、</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">输出选项（</span><span lang="EN-US">output</span><span style="font-family: 宋体;">）、</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">回溯选项（</span><span lang="EN-US">backtrack</span><span style="font-family: 宋体;">）、</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">记忆选项</span> <span style="font-family: 宋体;">（</span><span lang="EN-US">memorize</span><span style="font-family: 宋体;">）、</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">记号词库（</span><span lang="EN-US">tokenVocab</span><span style="font-family: 宋体;">）、</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">重写选项（</span><span lang="EN-US">rewrite</span><span style="font-family: 宋体;">）、</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">超类选项（</span><span lang="EN-US">superClass</span><span style="font-family: 宋体;">）、</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">过滤选项（</span><span lang="EN-US">Filter</span><span style="font-family: 宋体;">）、</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">AST</span><span style="font-family: 宋体;">标签类型（</span><span lang="EN-US">ASTLabelType</span><span style="font-family: 宋体;">）</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">K</span><span style="font-family: 宋体;">选项</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<pre style="margin-left: 48pt; text-indent: -48pt;"><span lang="EN-US">/**</span></pre>
<pre style="margin-left: 48pt; text-indent: -48pt;"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//</span>一些写法<span lang="EN-US"><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
k=2;</span></pre>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>backtrack=true;</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>memoize=true;</span></p>
<p class="MsoNormal"><span lang="EN-US">*/</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoListParagraph" style="margin-left: 18pt; text-indent: -18pt;"><strong><span style="font-size: 18pt; color: red;" lang="EN-US"><span>1.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp; </span></span></span></strong><strong><span style="font-size: 18pt; font-family: 宋体; color: red;">语言选项</span></strong><strong><span style="font-size: 18pt; color: red;" lang="EN-US"> language</span></strong></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">语言选项指定了</span><span lang="EN-US">ANTLR</span><span style="font-family: 宋体;">将要产生的代码的目标语言，默认情况下该选项设置为了</span><span lang="EN-US">Java</span><span style="font-family: 宋体;">。需要注意的是，</span><span lang="EN-US">ANTLR</span><span style="font-family: 宋体;">中的嵌入的动作必须要使用目标语言来写。</span></p>
<p class="MsoNormal" style="margin-left: 10.5pt; text-indent: -10.5pt;"><span lang="EN-US">grammar T;<br />
options {<br />
&nbsp;&nbsp; &nbsp;language=Java;<br />
}</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">ANTLR</span><span style="font-family: 宋体;">使用了特有的基于字串模板（</span><span lang="EN-US">StringTemplate-based</span><span style="font-family: 宋体;">）代码生成器，构建一个新的目标语言显得较为简单，因此我们可以构建多种</span>
<span style="font-family: 宋体;">语言，诸如</span><span lang="EN-US">Java</span><span style="font-family: 宋体;">，</span><span lang="EN-US">C</span><span style="font-family: 宋体;">，</span><span lang="EN-US">C++</span><span style="font-family: 宋体;">，</span><span lang="EN-US">C#</span><span style="font-family: 宋体;">，</span><span lang="EN-US">Python</span><span style="font-family: 宋体;">，</span><span lang="EN-US">Objective-C</span><span style="font-family: 宋体;">，</span><span lang="EN-US">Ruby</span><span style="font-family: 宋体;">等等。语言选项让</span><span lang="EN-US">ANNTLR</span><span style="font-family: 宋体;">去模板目录（例如</span><span lang="EN-US"> org/antlr/codegen/templates/Java or org/antlr/codegen/templates/C</span><span style="font-family: 宋体;">）下寻找合适的模板</span><span lang="EN-US">,</span><span style="font-family: 宋体;">并使用模板来构建语言。该目录下包含大量的模板，我们可以向其中加入其</span>
<span style="font-family: 宋体;">他的模板以满足我们的需求。</span></p>
<p class="MsoListParagraph" style="margin-left: 18pt; text-indent: -18pt;"><strong><span style="font-size: 18pt; color: red;" lang="EN-US"><span>2.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp; </span></span></span></strong><strong><span style="font-size: 18pt; font-family: 宋体; color: red;">输出选项</span></strong><strong><span style="font-size: 18pt; color: red;" lang="EN-US"> output</span></strong></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">输出选项控制了</span><span lang="EN-US">ANTLR</span><span style="font-family: 宋体;">输出的数据结构，目前支持两种输出：抽象语法树</span><span lang="EN-US">——AST</span><span style="font-family: 宋体;">（</span><span lang="EN-US">Abstract Syntax Trees</span><span style="font-family: 宋体;">）和字串模板（</span><span lang="EN-US">StringTemplates</span><span style="font-family: 宋体;">）</span><span lang="EN-US">——template</span><span style="font-family: 宋体;">。当</span><span lang="EN-US">output</span><span style="font-family: 宋体;">这个选项被设置后，所有的规则都被输出成了</span><span lang="EN-US">AST</span><span style="font-family: 宋体;">或者</span><span lang="EN-US"> template</span><span style="font-family: 宋体;">。</span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: 2.95pt;"><span lang="EN-US">grammar T;<br />
options {<br />
&nbsp;&nbsp; &nbsp;output=AST;<br />
}</span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: 2.95pt;"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoListParagraph" style="margin-left: 18pt; text-indent: -18pt;"><strong><span style="font-size: 18pt; color: red;" lang="EN-US"><span>3.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp; </span></span></span></strong><strong><span style="font-size: 18pt; font-family: 宋体; color: red;">回溯选项</span></strong><strong><span style="font-size: 18pt; color: red;" lang="EN-US">backtrack</span></strong></p>
<p class="MsoNormal" style="text-indent: 15.75pt;"><span style="font-family: 宋体;">当回溯选项打开的时候，在执行一个</span><span lang="EN-US">LL(K)</span><span style="font-family: 宋体;">失败的时候，</span><span lang="EN-US">ANTLR</span><span style="font-family: 宋体;">会返回至</span><span lang="EN-US">LL(K)</span><span style="font-family: 宋体;">开始而尝试其他的规则。</span></p>
<p class="MsoNormal" style="text-indent: 27.1pt;"><strong><span style="font-size: 18pt; color: red;" lang="EN-US">&nbsp;</span></strong></p>
<p class="MsoListParagraph" style="margin-left: 18pt; text-indent: -18pt;"><strong><span style="font-size: 18pt; color: red;" lang="EN-US"><span>4.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp; </span></span></span></strong><strong><span style="font-size: 18pt; font-family: 宋体; color: red;">记忆选项</span></strong><strong><span style="font-size: 18pt; color: red;"> </span></strong><strong><span style="font-size: 18pt; font-family: 宋体; color: red;">（</span></strong><strong><span style="font-size: 18pt; color: red;" lang="EN-US">memorize</span></strong><strong><span style="font-size: 18pt; font-family: 宋体; color: red;">）</span></strong><strong></strong></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">memoize</span><span style="font-family: 宋体;">选项打开以后，每条解析方法（</span><span lang="EN-US">Paser Method</span><span style="font-family: 宋体;">）开始之前，</span><span lang="EN-US">ANTLR</span><span style="font-family: 宋体;">会首先检测以前的尝试结果，并在该方法执行完成之后记录该规则是否执行成功。但是注意，对于单条的规则打开此选项经常比在全局上打开该规则效率更高。</span></p>
<p class="MsoNormal" style="text-indent: 36.15pt;"><strong><span style="font-size: 18pt; color: red;" lang="EN-US">&nbsp;</span></strong></p>
<p class="MsoListParagraph" style="margin-left: 18pt; text-indent: -18pt;"><strong><span style="font-size: 18pt; color: red;" lang="EN-US"><span>5.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp; </span></span></span></strong><strong><span style="font-size: 18pt; font-family: 宋体; color: red;">记号词库（</span></strong><strong><span style="font-size: 18pt; color: red;" lang="EN-US">tokenVocab</span></strong><strong><span style="font-size: 18pt; font-family: 宋体; color: red;">）</span></strong><strong></strong></p>
<p class="MsoNormal" style="text-indent: 15.75pt;"><span style="font-family: 宋体;">说白了就是</span><span lang="EN-US">output</span><span style="font-family: 宋体;">输出目录中的</span><span lang="EN-US">XX.tokens</span><span style="font-family: 宋体;">文件中的定义可以方便的给</span> <span style="font-family: 宋体;">大型工程中多个</span><span lang="EN-US">.g</span><span style="font-family: 宋体;">中的符号同步更新。</span></p>
<p class="MsoNormal" style="text-indent: 15.75pt;"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="text-indent: 15.75pt;"><span style="font-family: 宋体;">大型的工程中常常利用</span><span lang="EN-US">AST</span><span style="font-family: 宋体;">作为中间产物对输入进行多次分析并最终生成代码。对</span><span lang="EN-US">AST</span><span style="font-family: 宋体;">的遍历时需要经常使用树语法（</span><span lang="EN-US">tree grammar</span><span style="font-family: 宋体;">），而</span><span lang="EN-US">tree grammar</span><span style="font-family: 宋体;">中经常需要将符号与其他的文件中的符号进行同步或者更新。</span><span lang="EN-US">tokenVocab</span><span style="font-family: 宋体;">实现了这个功能。</span><span lang="EN-US"><br />
</span><span style="font-family: 宋体;">例如我们定义了下面的一个语法文件：</span><span lang="EN-US"><br />
<br />
grammar P;<br />
options {<br />
&nbsp;&nbsp; &nbsp;output=AST;<br />
}<br />
expr: INT ('+' ^ INT)* ;<br />
INT : '0'..'9' +;<br />
WS : ' ' | '\r' | '\n' ;<br />
</span><span style="font-family: 宋体;">利用该文件生成了一个标记：</span><span lang="EN-US">P.token</span><span style="font-family: 宋体;">，并生成了语法树（</span><span lang="EN-US">AST</span><span style="font-family: 宋体;">）。这时我们需要一个用于遍历该</span><span lang="EN-US">AST</span><span style="font-family: 宋体;">的</span><span lang="EN-US">tree grammar</span><span style="font-family: 宋体;">，并通过</span><span lang="EN-US">tree grammar </span><span style="font-family: 宋体;">中的</span><span lang="EN-US">tokenVocab</span><span style="font-family: 宋体;">选项来向其中更新</span><span lang="EN-US">tokens:<br />
<br />
tree grammar Dump;<br />
options {<br />
&nbsp;&nbsp; &nbsp;tokenVocab=P;<br />
&nbsp;&nbsp; &nbsp;ASTLabelType=CommonTree;<br />
}<br />
expr: ^( '+' expr {System.out.print('+' );} expr )<br />
&nbsp;&nbsp; &nbsp;| INT {System.out.print($INT.text);}<br />
&nbsp;&nbsp; &nbsp;;<br />
<br />
</span><span style="font-family: 宋体;">编译</span><span lang="EN-US">tree grammar</span><span style="font-family: 宋体;">的时候</span><span lang="EN-US">ANTLR</span><span style="font-family: 宋体;">默认会在当前目录下寻找</span><span lang="EN-US">.token</span><span style="font-family: 宋体;">文件，我们可以通过</span><span lang="EN-US">-lib</span><span style="font-family: 宋体;">选项来设置用于寻找</span><span lang="EN-US">.token</span><span style="font-family: 宋体;">文件的目录，例如：</span><span lang="EN-US"><br />
java org.antlr.Tool -lib . Dump.g</span><strong></strong></p>
<p class="MsoListParagraph" style="margin-left: 18pt; text-indent: -18pt;"><strong><span style="font-size: 18pt; color: red;" lang="EN-US"><span>6.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp; </span></span></span></strong><strong><span style="font-size: 18pt; font-family: 宋体; color: red;">重写选项（</span></strong><strong><span style="font-size: 18pt; color: red;" lang="EN-US">rewrite</span></strong><strong><span style="font-size: 18pt; font-family: 宋体; color: red;">）</span></strong><strong></strong></p>
<p class="MsoNormal" style="text-indent: 15.75pt;"><span style="font-family: 宋体;">通过重写选项可以改变</span><span lang="EN-US">ANTLR</span><span style="font-family: 宋体;">对输入的默认处理规则，一般用在输出为</span><span lang="EN-US">template</span><span style="font-family: 宋体;">的情况下。将该选项使能之后，</span><span lang="EN-US">ANTLR</span><span style="font-family: 宋体;">将一般的输入直接拷贝至输出，而将适于模板重写规则的输入做其他的处理。</span><strong></strong></p>
<p class="MsoListParagraph" style="margin-left: 18pt; text-indent: -18pt;"><strong><span style="font-size: 18pt; color: red;" lang="EN-US"><span>7.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp; </span></span></span></strong><strong><span style="font-size: 18pt; font-family: 宋体; color: red;">超类选项（</span></strong><strong><span style="font-size: 18pt; color: red;" lang="EN-US">superClass</span></strong><strong><span style="font-size: 18pt; font-family: 宋体; color: red;">）</span></strong><strong></strong></p>
<p class="MsoNormal" style="text-indent: 15.75pt;"><span style="font-family: 宋体;">用于指定一个超类。</span><strong></strong></p>
<p class="MsoListParagraph" style="margin-left: 18pt; text-indent: -18pt;"><strong><span style="font-size: 18pt; color: red;" lang="EN-US"><span>8.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp; </span></span></span></strong><strong><span style="font-size: 18pt; font-family: 宋体; color: red;">过滤选项（</span></strong><strong><span style="font-size: 18pt; color: red;" lang="EN-US">Filter</span></strong><strong><span style="font-size: 18pt; font-family: 宋体; color: red;">）</span></strong><strong></strong></p>
<p class="MsoListParagraph" style="margin-left: 18pt; text-indent: -18pt;"><strong><span style="font-size: 18pt; color: red;" lang="EN-US"><span>9.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp; </span></span></span></strong><strong><span style="font-size: 18pt; color: red;" lang="EN-US">AST</span></strong><strong><span style="font-size: 18pt; font-family: 宋体; color: red;">标签类型（</span></strong><strong><span style="font-size: 18pt; color: red;" lang="EN-US">ASTLabelType</span></strong><strong><span style="font-size: 18pt; font-family: 宋体; color: red;">）</span></strong><strong></strong></p>
<p class="MsoListParagraph" style="margin-left: 18pt; text-indent: -18pt;"><strong><span style="font-size: 18pt; color: red;" lang="EN-US"><span>10.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span></strong><strong><span style="font-size: 18pt; color: red;" lang="EN-US">K</span></strong><strong><span style="font-size: 18pt; font-family: 宋体; color: red;">选项</span></strong><strong></strong></p>
<p class="MsoListParagraph" style="text-indent: 0cm;"><span lang="EN-US"><span>&nbsp;&nbsp; </span>K</span><span style="font-family: 宋体;">选项用于限制对</span><span lang="EN-US">LL(K)</span><span style="font-family: 宋体;">进行语法分析的次数，从而提高了</span><span lang="EN-US">ANTLR</span><span style="font-family: 宋体;">的解析速度。</span><span lang="EN-US">K</span><span style="font-family: 宋体;">只能为</span><span lang="EN-US">*</span><span style="font-family: 宋体;">或者数字，默认为</span><span lang="EN-US">*</span><span style="font-family: 宋体;">。</span></p>
<p class="MsoListParagraph" style="text-indent: 0cm;"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoListParagraph" style="text-indent: 0cm;"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoListParagraph" style="text-indent: 0cm;"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoListParagraph" style="text-indent: 0cm;"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-size: 18pt; font-family: 宋体;">属性和动作</span></strong></p>
<p class="MsoListParagraph" style="text-indent: 0cm;"><span style="font-size: 12pt; font-family: 宋体;">动作（<span lang="EN-US">Actions</span>）实际上是用目标语言写成的、嵌入到规则中的代码（以花括号包裹）。它们通常直接操作输入的标号，但是他们也可以用来调用相应的外部代码。属性，到目前为止我的理解还不多，感觉像是<span lang="EN-US">C++</span>中类里面的成员，一会看完应该会更清楚一些。<span lang="EN-US"><br />
<br />
1. </span>语法动作（<span lang="EN-US">Grammar Actions</span>）<span lang="EN-US"><br />
</span>动作（<span lang="EN-US">Actions</span>）是指嵌在语法中的、用目标语言写成的代码片段。<span lang="EN-US">ANTLR</span>则把这些代码（除了用<span lang="EN-US">$</span>或<span lang="EN-US">%</span>标记的以外）逐字地插入到生成的识别器中。<span lang="EN-US"><br />
</span>动作可以放到规则的外边，也可以嵌入到某条规则当中。当动作位于规则之外时候，这些动作同城定义了一些全局的或者是类的成员（变量或者成员函数）；而当其嵌入规则之中时，则用于执行某些特定的命令，这些命令在识别器识别了其预订的字符的时候就会开始执行。例如下面的例子：<span lang="EN-US"><br />
<br />
parser grammar T;<br />
@header {<br />
&nbsp;&nbsp; &nbsp;package p;<br />
}<br />
@members {<br />
&nbsp;&nbsp; &nbsp;int i;<br />
&nbsp;&nbsp; &nbsp;public TParser(TokenStream input, int foo) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;this(input);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;i = foo;<br />
&nbsp;&nbsp; &nbsp;}<br />
}<br />
a[int x] returns [int y]<br />
@init {int z=0;}<br />
@after {System.out.println("after matching rule; before finally");}<br />
: {</span>《<span lang="EN-US">action1</span>》<span lang="EN-US">} A {</span>《<span lang="EN-US">action2 </span>》<span lang="EN-US">}<br />
;<br />
catch[RecognitionException re] {<br />
&nbsp;&nbsp; &nbsp;System.err.println("error");<br />
}<br />
finally { </span>《<span lang="EN-US">do-this-no-matter-what </span>》<span lang="EN-US"> }<br />
<br />
</span>从中可以看出，前面的两个动作，<span lang="EN-US">@head and @members</span>是两个处于规则之外的全局的动作，定义了一些变量和类；而后两个则分别在<span lang="EN-US">a</span>这个规则的前后执行（<span lang="EN-US">@init</span>在前，<span lang="EN-US">@after</span>在后，这个在前面提到过）。
这里针对两种类型详细叙述。<span lang="EN-US"><br />
</span></span></p>
<br />
<a href="/Files/lsbwahaha/ANTLR_info.pdf" title="antlr简介">antlr简介</a><br />
<a href="../../Files/lsbwahaha/ANTLR_info.pdf"></a>
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/341019.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2010-12-17 19:20 <a href="http://www.blogjava.net/lsbwahaha/archive/2010/12/17/341019.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>责任链中：但个中的处理</title><link>http://www.blogjava.net/lsbwahaha/archive/2010/08/15/328920.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Sun, 15 Aug 2010 12:52:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2010/08/15/328920.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/328920.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2010/08/15/328920.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/328920.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/328920.html</trackback:ping><description><![CDATA[<p>public class CheckQueryParams {</p>
<p>&nbsp;&nbsp;&nbsp; private static interface Validation{<br />
&nbsp;void check(QueryInfo query);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; private static List&lt;Validation&gt; validations = new ArrayList&lt;Validation&gt;();<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; static {<br />
&nbsp;validations.add(new Validation() {<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void check(QueryInfo query) {<br />
&nbsp;&nbsp;if(StringUtils.isEmpty(query.getStartKey()) &amp;&amp; StringUtils.isEmpty(query.getEndKey()))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new RuntimeException("Both keys can not be null or empty at the same time");<br />
&nbsp;&nbsp;&nbsp;&nbsp; }});<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public static void check(QueryInfo query) {<br />
&nbsp;for(Validation validation : validations) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; validation.check(query);<br />
&nbsp;}<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/328920.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2010-08-15 20:52 <a href="http://www.blogjava.net/lsbwahaha/archive/2010/08/15/328920.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用linkList实现LRU算法</title><link>http://www.blogjava.net/lsbwahaha/archive/2010/08/15/328918.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Sun, 15 Aug 2010 12:33:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2010/08/15/328918.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/328918.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2010/08/15/328918.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/328918.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/328918.html</trackback:ping><description><![CDATA[<p>public class LRUCache&lt;K,V&gt; {</p>
<p>&nbsp;&nbsp;&nbsp; final private int capacity;<br />
&nbsp;&nbsp;&nbsp; final private Map&lt;K,Reference&lt;V&gt;&gt; map;<br />
&nbsp;&nbsp;&nbsp; final private ReentrantLock lock = new ReentrantLock();<br />
&nbsp;&nbsp;&nbsp; final private ReferenceQueue&lt;Reference&lt;V&gt;&gt; queue = new ReferenceQueue&lt;Reference&lt;V&gt;&gt;();<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public LRUCache(int capacity) {<br />
&nbsp;this.capacity = capacity;<br />
&nbsp;map = new LinkedHashMap&lt;K,Reference&lt;V&gt;&gt;(capacity,1f,true){<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Override<br />
&nbsp;&nbsp;&nbsp;&nbsp; protected boolean removeEldestEntry(Map.Entry&lt;K,Reference&lt;V&gt;&gt; eldest) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.size() &gt; LRUCache.this.capacity;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;};<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public V put(K key,V value) {<br />
&nbsp;lock.lock();<br />
&nbsp;try {<br />
&nbsp; map.put(key, new SoftReference(value,queue));<br />
&nbsp; return value;<br />
&nbsp;}finally {<br />
&nbsp;&nbsp;&nbsp;&nbsp; lock.unlock();<br />
&nbsp;}<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public V get(K key) {<br />
&nbsp;lock.lock();<br />
&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp; queue.poll();<br />
&nbsp;&nbsp;&nbsp;&nbsp; return map.get(key).get();<br />
&nbsp;}finally {<br />
&nbsp;&nbsp;&nbsp;&nbsp; lock.unlock();<br />
&nbsp;}<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; public void remove(K key) {<br />
&nbsp;lock.lock();<br />
&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp; map.remove(key);<br />
&nbsp;}finally {<br />
&nbsp;&nbsp;&nbsp;&nbsp; lock.unlock();<br />
&nbsp;}<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/328918.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2010-08-15 20:33 <a href="http://www.blogjava.net/lsbwahaha/archive/2010/08/15/328918.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java collection framework 的一些比较使用的记录</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/12/18/306596.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Fri, 18 Dec 2009 09:13:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/12/18/306596.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/306596.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/12/18/306596.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/306596.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/306596.html</trackback:ping><description><![CDATA[<img src="http://www.blogjava.net/images/blogjava_net/lsbwahaha/123.JPG" alt="" border="0" /><br />
Collection接口 由&nbsp; Set接口 和 List接口 继承。<br />
<br />
&nbsp; &nbsp; &nbsp; Set 被 Vector . ArrayList LinkedList 实现。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List 被 HashSet&nbsp; TreeSet 实现。<br />
<br />
Map接口 由 HashTable HashMap&nbsp; TreeMap 实现。<br />
<br />
<br />
下面看下每个实现类的特征；；；--》(转的。)<br />
<br />
1. List&nbsp; (有重复、有序)<br />
<br />
&nbsp;Vector基于Array的List，性能也就不可能超越Array，并且Vector是&#8220;sychronized&#8221;的，这个也是Vector和ArrayList的唯一的区别。<br />
<br />
ArrayList：同Vector一样是一个基于Array的，但是不同的是ArrayList不是同步的。所以在性能上要比Vector优越一些，但是当运行到多线程环境中时，可需要自己在管理线程的同步问题。从其命名中可以看出它是一种类似数组的形式进行存储，因此它的随机访问速度极快。<br />
<br />
数据增长:当需要增长时,Vector默认增长为原来一培，而ArrayList却是原来的一半<br />
<br />
LinkedList：LinkedList不同于前面两种List，它不是基于Array的，所以不受Array性能的限制。它每一个节点（Node）都包含两方面的内容：1.节点本身的数据（data）；2.下一个节点的信息（nextNode）。所以当对LinkedList做添加，删除动作的时候就不用像基于Array的List一样，必须进行大量的数据移动。只要更改nextNode的相关信息就可以实现了所以它适合于进行频繁进行插入和删除操作。这就是LinkedList的优势。Iterator只能对容器进行向前遍历，而 ListIterator则继承了Iterator的思想，并提供了对List进行双向遍历的方法。<br />
用在FIFO，用addList()加入元素 removeFirst()删除元素<br />
用在FILO,用addFirst()/removeLast()<br />
ListIterator 提供双向遍历next() previous()，可删除、替换、增加元素<br />
<br />
List总结： 1. 所有的List中只能容纳单个不同类型的对象组成的表，而不是Key－Value键值对。例如：[ tom,1,c ]； 2. 所有的List中可以有相同的元素，例如Vector中可以有 [ tom,koo,too,koo ]； 3. 所有的List中可以有null元素，例如[ tom,null,1 ]； 4. 基于Array的List（Vector，ArrayList）适合查询，而LinkedList（链表）适合添加，删除操作。<br />
<br />
<br />
2. Set<br />
<br />
HashSet：虽然Set同List都实现了Collection接口，但是他们的实现方式却大不一样。List基本上都是以Array为基础。但是Set则是在HashMap的基础上来实现的，这个就是Set和List的根本区别。HashSet的存储方式是把HashMap中的Key作为Set的对应存储项，这也是为什么在Set中不能像在List中一样有重复的项的根本原因，因为HashMap的key是不能有重复的。HashSet能快速定位一个元素，但是放到HashSet中的对象需要实现hashCode()方法0。<br />
<br />
TreeSet则将放入其中的元素按序存放，这就要求你放入其中的对象是可排序的，这就用到了集合框架提供的另外两个实用类Comparable和Comparator。一个类是可排序的，它就应该实现Comparable接口。有时多个类具有相同的排序算法，那就不需要重复定义相同的排序算法，只要实现Comparator接口即可。TreeSet是SortedSet的子类，它不同于HashSet的根本就是TreeSet是有序的。它是通过SortedMap来实现的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set总结： 1. Set实现的基础是Map（HashMap）； 2. Set中的元素是不能重复的，如果使用add(Object obj)方法添加已经存在的对象，则会覆盖前面的对象； Set里的元素是不能重复的，那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? Set里的元素是不能重复的，即不能包含两个元素e1、e2（e1.equals（e2））。那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。==方法决定引用值(句柄)是否指向同一对象。<br />
<br />
<br />
3. Map<br />
<br />
&nbsp;Map是一种把键对象和值对象进行关联的容器，Map有两种比较常用的实现： HashTable、HashMap和TreeMap。<br />
<br />
&nbsp;HashMap也用到了哈希码的算法，以便快速查找一个键，TreeMap则是对键按序存放，因此它有一些扩展的方法，比如firstKey(),lastKey()等。<br />
只有HashMap可以让你将空值作为一个表的条目的key或value<br />
<br />
HashMap和Hashtable的区别。 HashMap是Hashtable的轻量级实现（非线程安全的实现），他们都完成了Map接口。主要区别在于HashMap允许空（null）键（key）或值（value）,非同步，由于非线程安全，效率上可能高于Hashtable。 Hashtable不允许空（null）键（key）或值（value），Hashtable的方法是Synchronize的，在多个线程访问Hashtable时，不需要自己为它的方法实现同步，而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概一样，所以性能不会有很大的差异。<br />
<br />
HashMap:<br />
&nbsp;&nbsp;&nbsp; 散列表的通用映射表，无序，可在初始化时设定其大小，自动增长。 <br />
&nbsp;&nbsp;&nbsp; 只有HashMap可以让你将空值作为一个表的条目的key或value<br />
<br />
LinkedHashMap:<br />
&nbsp;&nbsp;&nbsp; 扩展HashMap，对返回集合迭代时，维护插入顺序<br />
<br />
WeakHashMap:<br />
&nbsp;&nbsp;&nbsp; 基于弱引用散列表的映射表，如果不保持映射表外的关键字的引用，则内存回收程序会回收它<br />
<br />
TreeMap:<br />
&nbsp;&nbsp;&nbsp; 基于平衡树的映射表&nbsp; <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/306596.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-12-18 17:13 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/12/18/306596.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读《effective java》第二版，实用一，遇到多个构造器参数时要考虑用构造器</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/12/17/306422.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Thu, 17 Dec 2009 12:25:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/12/17/306422.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/306422.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/12/17/306422.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/306422.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/306422.html</trackback:ping><description><![CDATA[&nbsp; 第二条&nbsp; 遇到多个构造器参数时要考虑用构造器<br />
<span style="color: rgb(255, 8, 54);"><br />
<strong>这里考虑的是参数多的情况，如果参数个数比较少，那直接采用一般的构造方法就可以了。</strong></span><br />
<br />
&nbsp;&nbsp; 书中介绍了写构造方法的时候几种方式：<br />
<br />
&nbsp;&nbsp;&nbsp; 1. 重叠构造方法模式:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 缺点：有许多参数的时候，客户端代码会很难写，而且较难以阅读。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 2. javaBeans模式：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 缺点：&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在构造过程中JavaBean可能处于不一致的状态，类本身无法判断是否有效性。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类做成不可变的可能。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 3. builder模式：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 优点：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在build方法生成对象的时候，可以做检查，判断是否符合要求<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 参数灵活<br />
&nbsp; &nbsp; &nbsp;&nbsp; 缺点：<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 创建对象必须先创建构造器，如果对性能要求非常高的应用少用为妙<br />
<br />
<br />
<br />
具体实现代码：<br />
1.重叠构造方法模式：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><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;NutritionFacts&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">final</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;servingSize;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">final</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;serviings;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">final</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;calories;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">final</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;fat;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</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;sodium;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</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;carbohydrate;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;NutritionFacts(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;servingSize,&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;serviings){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">(servingSize,&nbsp;serviings,&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;NutritionFacts(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;servingSize,&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;serviings,&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;calories){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">(servingSize,&nbsp;serviings,&nbsp;calories,&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;NutritionFacts(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;servingSize,&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;serviings,&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;calories,&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;fat){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">(servingSize,&nbsp;serviings,&nbsp;calories,&nbsp;fat,</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;NutritionFacts(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;servingSize,&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;serviings,&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;calories,&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;fat,&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;sodium){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">(servingSize,&nbsp;serviings,&nbsp;calories,&nbsp;fat,&nbsp;sodium,</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;NutritionFacts(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;servingSize,&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;serviings,&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;calories,&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;fat,&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;sodium,&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;carbohydrate){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.servingSize&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;servingSize;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.serviings&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;serviings;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.calories&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;calories;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.fat&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;fat;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.sodium&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;sodium;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.carbohydrate&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;carbohydrate;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
<br />
<br />
2. javaBeans模式 代码：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><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;NutritionFacts&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;servingSize;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;serviings;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;calories;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;fat;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</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;sodium;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</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;carbohydrate;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;NutritionFacts(){}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&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;setServingSize(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;servingSize)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.servingSize&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;servingSize;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&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;setServiings(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;serviings)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.serviings&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;serviings;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&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;setCalories(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;calories)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.calories&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;calories;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&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;setFat(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;fat)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.fat&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;fat;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&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;setSodium(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;sodium)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.sodium&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;sodium;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&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;setCarbohydrate(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;carbohydrate)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.carbohydrate&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;carbohydrate;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span></div>
<br />
<br />
&nbsp;3. builder模式<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><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;NutritionFacts&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">final</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;servingSize;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">final</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;serviings;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">final</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;calories;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">final</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;fat;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">final</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;sodium;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">final</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;carbohydrate;<br />
<br />
&nbsp;&nbsp;&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);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;Builder&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">final</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;servingSize;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">final</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;serviings;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</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;calories&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);">0</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</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;fat&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);">0</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</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;sodium&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);">0</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">private</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;carbohydrate&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);">0</span><span style="color: rgb(0, 0, 0);">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;Builder(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;servingSize,&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;serviings)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.servingSize&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;servingSize;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.serviings&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;serviings;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;Builder&nbsp;calories(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;val){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;calories&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;val;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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, 255);">this</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;Builder&nbsp;fat(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;val){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fat&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;val;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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, 255);">this</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;Builder&nbsp;sodium(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;val){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sodium&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;val;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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, 255);">this</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;Builder&nbsp;carbohydrate(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;val){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;carbohydrate&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;val;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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, 255);">this</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;NutritionFacts&nbsp;build(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;NutritionFacts(</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;NutritionFacts(Builder&nbsp;builder)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;servingSize&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;builder.servingSize;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;serviings&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;builder.serviings;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;calories&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;builder.calories;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fat&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;builder.fat;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sodium&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;builder.sodium;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;carbohydrate&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;builder.carbohydrate;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
</div>
&nbsp;这个调用的时候：&nbsp; <br />
NutritionFacts cocaCola = new NutritionFacts.Builder(11,22).calories(1).fat(2).calories(3).build();<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/306422.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-12-17 20:25 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/12/17/306422.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中关键字volatile的含义(转)</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/11/16/302574.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Mon, 16 Nov 2009 08:34:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/11/16/302574.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/302574.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/11/16/302574.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/302574.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/302574.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在Java中设置变量值的操作，除了long和double类型的变量外都是原子操作，也就是说，对于变量值的简单读写操作没有必要进行同步。 </p>
<p>这在JVM 1.2之前，Java的内存模型实现总是从主存读取变量，是不需要进行特别的注意的。而随着JVM的成熟和优化，现在在多线程环境下volatile关键字的使用变得非常重要。 </p>
<p>在当前的Java内存模型下，线程可以把变量保存在本地内存（比如机器的寄存器）中，而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值，而另外一个线程还继续使用它在寄存器中的变量值的拷贝，造成数据的不一致。 </p>
<p>要解决这个问题，只需要像在本程序中的这样，把该变量声明为volatile（不稳定的）即可，这就指示JVM，这个变量是不稳定的，每次使用它都到主存中进行读取。一般说来，多任务环境下各任务间共享的标志都应该加volatile修饰。 </p>
<p>Volatile修饰的成员变量在每次被线程访问时，都强迫从共享内存中重读该成员变量的值。而且，当成员变量发生变化时，强迫线程将变化值回写到共享内存。这样在任何时刻，两个不同的线程总是看到某个成员变量的同一个值。 </p>
<p>Java语言规范中指出：为了获得最佳速度，允许线程保存共享成员变量的私有拷贝，而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。 </p>
<p>这样当多个线程同时与某个对象交互时，就必须要注意到要让线程及时的得到共享成员变量的变化。 </p>
<p>而volatile关键字就是提示VM：对于这个成员变量不能保存它的私有拷贝，而应直接与共享成员变量交互。 </p>
<p>使用建议：在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中，或者为常量时，不必使用。 </p>
<p>由于使用volatile屏蔽掉了VM中必要的代码优化，所以在效率上比较低，因此一定在必要时才使用此关键字。 <br />
<br />
文章出处：DIY部落(http://www.diybl.com/course/3_program/java/javaxl/20090302/156333.html)</p><p><br /></p><p>同时查看下IBM中的详细解释：</p><p><div><h1>Java 理论与实践: 正确使用 Volatile 变量</h1></div></p><p><div>http://www.ibm.com/developerworks/cn/java/j-jtp06197.html</div><br /></p><img src ="http://www.blogjava.net/lsbwahaha/aggbug/302574.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-11-16 16:34 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/11/16/302574.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于 java.util.ConcurrentModificationException 异常</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/08/04/289762.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Tue, 04 Aug 2009 06:51:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/08/04/289762.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/289762.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/08/04/289762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/289762.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/289762.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;网上的解释原因：<br />
Iterator 是工作在一个独立的线程中，并且拥有一个 互斥 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表，当原来的对象数量发生变化时，这个索引表的内容不会同步改变，所以当索引指针往后移动的时候就找不到要迭代的对象，所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。<br />
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象， Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<a href="http://gceclub.sun.com.cn/yuanchuang/week-14/iterator.html#about">廖雪峰</a>&nbsp;大师&nbsp; Java源码分析：深入探讨Iterator模式&nbsp; <a href="http://gceclub.sun.com.cn/yuanchuang/week-14/iterator.html">http://gceclub.sun.com.cn/yuanchuang/week-14/iterator.html</a><br />
<br />
<br />
在工作碰到这个问题所有看看：<br />
<span style="color: rgb(0,0,255)">List list = ...;<br />
for(Iterator iter = list.iterator(); iter.hasNext();) {<br />
&nbsp;&nbsp;&nbsp; Object obj = iter.next();<br />
&nbsp;&nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp; if(***) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.remove(obj);&nbsp; //list.add(obj)&nbsp; 其实也是一样的。<br />
&nbsp;&nbsp;&nbsp; }<br />
}</span><br />
在执行了remove方法之后，再去执行循环，iter.next()的时候，报java.util.ConcurrentModificationException(当然，如果remove的是最后一条，就不会再去执行next()操作了)，<br />
<br />
下面来看一下源码<br />
<span style="color: rgb(0,0,255)">public interface Iterator&lt;E&gt; {<br />
&nbsp;&nbsp;&nbsp; boolean hasNext();<br />
&nbsp;&nbsp;&nbsp; E next();<br />
&nbsp;&nbsp;&nbsp; void remove();<br />
}<br />
<br />
public interface Collection&lt;E&gt; extends Iterable&lt;E&gt; {<br />
&nbsp;&nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp; Iterator&lt;E&gt; iterator();<br />
&nbsp;&nbsp;&nbsp; boolean add(E o);<br />
&nbsp;&nbsp;&nbsp; boolean remove(Object o);<br />
&nbsp;&nbsp;&nbsp; ...<br />
}</span><br />
<br />
<br />
<span style="color: rgb(0,0,255)">public abstract class AbstractList&lt;E&gt; extends AbstractCollection&lt;E&gt; implements List&lt;E&gt; {&nbsp; <br />
//AbstractCollection和List都继承了Collection<br />
&nbsp;&nbsp;&nbsp; protected transient int modCount = 0;<br />
&nbsp;&nbsp;&nbsp; private class Itr implements Iterator&lt;E&gt; {&nbsp; //内部类Itr<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int cursor = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int lastRet = -1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int expectedModCount = modCount;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean hasNext() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return cursor != size();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public E next() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; checkForComodification();&nbsp; <span style="color: rgb(255,0,0)">//该方法中检测到改变，从而抛出异常<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; E next = get(cursor);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lastRet = cursor++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return next;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch(IndexOutOfBoundsException e) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; checkForComodification();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new NoSuchElementException();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void remove() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (lastRet == -1)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new IllegalStateException();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; checkForComodification();<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AbstractList.this.remove(lastRet);&nbsp; <span style="color: rgb(255,0,0)">//执行remove对象的操作<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (lastRet &lt; cursor)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cursor--;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lastRet = -1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; expectedModCount = modCount;&nbsp; <span style="color: rgb(255,0,0)">//重新设置了expectedModCount的值，避免了ConcurrentModificationException的产生<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch(IndexOutOfBoundsException e) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new ConcurrentModificationException();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final void checkForComodification() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (modCount != expectedModCount)&nbsp; <span style="color: rgb(255,0,0)">//当expectedModCount和modCount不相等时，就抛出ConcurrentModificationException</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new ConcurrentModificationException();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />
}</span><br />
<br />
remove(Object o)在ArrayList中实现如下：<br />
<span style="color: rgb(0,0,255)">public boolean remove(Object o) {<br />
&nbsp;&nbsp;&nbsp; if (o == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int index = 0; index &lt; size; index++)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (elementData[index] == null) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fastRemove(index);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (int index = 0; index &lt; size; index++)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (o.equals(elementData[index])) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fastRemove(index);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; return false;<br />
}<br />
private void fastRemove(int index) {<br />
&nbsp;&nbsp;&nbsp; modCount++;&nbsp; <span style="color: rgb(255,0,0)">//只增加了modCount<br />
</span>&nbsp;&nbsp;&nbsp; ....<br />
}<br />
<span style="color: rgb(51,153,102)"><br />
<strong style="color: rgb(128,0,0)">所以，产生ConcurrentModificationException的原因就是：<br />
执行remove(Object o)方法之后，modCount和expectedModCount不相等了。然后当代码执行到next()方法时，判断了checkForComodification()，发现两个数值不等，就抛出了该Exception。<br />
要避免这个Exception，就应该使用remove()方法，但是没有add()方法了，只能另建一个list来处理这个问题了。</strong></span></span><br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/289762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-08-04 14:51 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/08/04/289762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>看《java优化编程》一些细节上的东东</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/07/26/288454.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Sun, 26 Jul 2009 09:33:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/07/26/288454.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/288454.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/07/26/288454.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/288454.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/288454.html</trackback:ping><description><![CDATA[<span style="color: red">java程序设计风格：（类的说明介绍）</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;
<p>Java<span style="font-family: 宋体">文件注释头</span></p>
<p><span style="font-family: 宋体">类中开头处插入如下</span> <span style="font-family: 宋体">注释</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">/******************************************************************</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">该类功能及特点的描述</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">(</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">例如</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">:</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">该类是用来</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">.....)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">该类未被编译测试过。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span><strong><span style="font-size: 10pt; color: #7f9fbf; font-family: 'Courier New'">@see</span></strong><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">(</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">与该类相关联的类</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">):(AnotherClass.java)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">开发公司或单位</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">:XXX</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">软件有限公司研发中心</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">版权</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">:</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">本文件版权归属</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">XXX</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">公司研发中心</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span><strong><span style="font-size: 10pt; color: #7f9fbf; font-family: 'Courier New'">@author</span></strong><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">(</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">作者</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">):XXX</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span><strong><span style="font-size: 10pt; color: #7f9fbf; font-family: 'Courier New'">@since</span></strong><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">(</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">该文件所支持的</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">JDK</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">版本</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">):Jdk1.3</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">或</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">Jdk1.4</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span><strong><span style="font-size: 10pt; color: #7f9fbf; font-family: 'Courier New'">@version</span></strong><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">(</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">版本</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">):1.0</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span><strong><span style="font-size: 10pt; color: #7f9fbf; font-family: 'Courier New'">@date</span></strong><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">(</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">开发日期</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">):</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">1999</span><span style="font-size: 10pt; color: #7f7f9f; font-family: 'Courier New'">-</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">01</span><span style="font-size: 10pt; color: #7f7f9f; font-family: 'Courier New'">-</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">29</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">最后更改日期</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">:</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">2003</span><span style="font-size: 10pt; color: #7f7f9f; font-family: 'Courier New'">-</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">01</span><span style="font-size: 10pt; color: #7f7f9f; font-family: 'Courier New'">-</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">02</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">修改人</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">:</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">XXXX</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">复审人</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">:</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">张三</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">李四</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">王五</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*/<br />
</span></p>
<br />
<br />
<span style="color: red">内存管理<br />
</span><img height="768" alt="" src="http://www.blogjava.net/images/blogjava_net/lsbwahaha/a.JPG" width="690" border="0" /><br />
<br />
&nbsp;
<p><span style="font-family: 宋体">伊甸园用来保存新的对象，它就像一个堆栈，新的对象被创建，就像指向该栈的指针在不断的增长一样，当伊甸园区域中的对象满了之后，</span>JVM<span style="font-family: 宋体">系统将要做可到达性测试，主要任务是检测有哪些对象由根集合出发是不可到达的，这些对象就可以被</span>JVM<span style="font-family: 宋体">回收，并且将所有的活动对象从伊甸园区域拷到</span>TO<span style="font-family: 宋体">区域，此时一些对象将发生状态交换，有的对象就从</span>TO<span style="font-family: 宋体">区域被转移到</span>From<span style="font-family: 宋体">区域，此时</span>From<span style="font-family: 宋体">区域就有了对象</span>,<span style="font-family: 宋体">这个过程都是</span>JVM<span style="font-family: 宋体">控制完成的。</span></p>
<p>Java <span style="font-family: 宋体">中的析构方法</span> finalize</p>
<p>&nbsp;<span style="font-family: 宋体">对象是使用完了</span> <span style="font-family: 宋体">尽量都赋</span> <span style="font-family: 宋体">为</span> null </p>
<p><span style="font-family: 宋体">共享静态变量存储空间</span> </p>
<p><span style="font-family: 宋体">不要提前创建对象</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; ........</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; background: silver; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> f(){</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">int</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> i;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A a = </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> A();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">//</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">类</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">A</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">的对象</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">a</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">被创建</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">//</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">在判断语句之中没有</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">//</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">应用过</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">a</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">对象</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .....</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">if</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">(....){</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">//</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">类</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">A</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">的对象</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">a</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">仅在此处被应用</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.showMessage();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ....</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .....</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; <span style="background: silver">}</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; ..........</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: black; font-family: 宋体">正确的书写方式为：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> f(){</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">int</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> i;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .....</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">if</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">(...){</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A a = </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> A();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">//</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">类</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">A</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">的对象</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">a</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">被创建</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">//</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">应用过</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">a</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">对象</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.showMessage();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 'Courier New'">JVM</span><span style="font-size: 10pt; color: black; font-family: 宋体">内存参数调优</span></p>
<br />
<span style="color: red">表达式、语句和保留字<br />
</span>
<p><span style="font-family: 宋体">非静态方法中可引用静态变量</span></p>
<p><span style="font-family: 宋体">静态方法不可以引用非静态变量</span></p>
<p><span style="font-family: 宋体">静态方法中可</span> <span style="font-family: 宋体">创建</span> <span style="font-family: 宋体">非静态变量</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 宋体">调用父类的构造方法必须将其放置子类构造方法的第一行<br />
</span></p>
<br />
<br />
<span style="color: red">JAVA核心类与性能优化<br />
</span>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">线程同步：</span><span lang="EN-US">Vector Hashtable</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">非线程同步</span><span lang="EN-US">: ArrayList HashMap</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字符串累加</span> <span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">尽量使用</span><span lang="EN-US"> StringBuffer<span style="mso-spacerun: yes">&nbsp; </span>+=<span style="mso-spacerun: yes">&nbsp; </span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法</span><span lang="EN-US">length() </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US"> length</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性</span><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp; </span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">区别</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">IO</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">缓存，读写文件优化。<br />
</span></p>
<br />
<span style="color: red">类与接口<br />
</span>&nbsp;
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">内部类（</span>Inner Class<span style="font-family: 宋体">）是</span>Java<span style="font-family: 宋体">语言中特有的类型，内部类只能被主类以外的其他内部类继承，主类是不能继承其内部类的，因为这样就引起了类循环继承的错误，下面的代码就是错误的。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class A extends x {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public A(){}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;&#8230;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Classs x{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;..</p>
<p style="margin-left: 21pt; text-indent: 21pt">}</p>
<p style="text-indent: 21pt">}</p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">上面的代码将引发类循环继承的错误，这种错误在编译时就会被发现，比较容易发现和排除。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">但是下面例子中的内部类的继承方式却是正确的：</span></p>
<p style="text-indent: 21pt">class A{</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;.</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public &nbsp;A(){}</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;&#8230;</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class &nbsp;X &nbsp;extends Y &nbsp;{</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;&#8230;&#8230;.</p>
<p style="margin-left: 21pt; text-indent: 21pt">}</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; calss &nbsp;Y&nbsp;{</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;&#8230;</p>
<p style="margin-left: 21pt; text-indent: 21pt">}</p>
<p style="text-indent: 21pt">}</p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">什么时候使用继承，什么样的继承是合理的：</span></p>
<p style="margin-left: 39pt; text-indent: -18pt; tab-stops: list 39.0pt">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">现实世界的事物继承关系，可以作为软件系统中类继承关系的依据。</span></p>
<p style="margin-left: 39pt; text-indent: -18pt; tab-stops: list 39.0pt">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">包含关系的类之间不存在继承关系。如：主机，外设</span> <span style="font-family: 宋体">，电脑。</span> <span style="font-family: 宋体">把主机类和外设类作为电脑类的成员就可以了。</span></p>
<p style="margin-left: 39pt; text-indent: -18pt; tab-stops: list 39.0pt">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">如果在逻辑上类</span>B<span style="font-family: 宋体">是类</span>A<span style="font-family: 宋体">的一种，并且类的所有属性和行为对类而言都有意义，则允许</span>B<span style="font-family: 宋体">继承</span>A<span style="font-family: 宋体">的行为和属性（私有属性与行为除外）。</span></p>
<br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/288454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-07-26 17:33 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/07/26/288454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java如何进阶(转)</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/07/23/288080.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Thu, 23 Jul 2009 11:36:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/07/23/288080.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/288080.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/07/23/288080.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/288080.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/288080.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原帖javaeye上的：&nbsp; <a href="http://yongtech.javaeye.com/blog/428671">http://yongtech.javaeye.com/blog/428671</a>&nbsp;，觉得写得挺不错的！不知道您到什么阶段了。。。。hoho<br />
<p><span style="font-size: large"><span style="font-size: 12pt">本来我想把这篇文章的名字命名为: &lt;怎样成为一个优秀的Java程序员&gt;的, 但是自己还不够优秀, 而本篇所涉及的都是自己学习和工作中的一些经验, 后来一想, 叫&lt;怎样进阶Java&gt;可能更为合适吧. 能给初学Java的人一个参考, 也就是我本来的心愿. 如果有大牛看到不妥之处, 敬请指正. 我一定会修正的 :).</span></span></p>
<p><span style="font-size: large"><span style="font-size: 12pt">&nbsp;</span></span></p>
<p><span style="font-size: large"><span style="font-size: 12pt">Java目前是最流行的语言之一,&nbsp; 是很多公司和程序员喜爱的一门程序语言. 而且, Java的入门比C++相对来说要简单一些, 所以有很大一部分程序员都选择Java作为自己的开发语言.&nbsp;我也是其中之一, 就是因为觉得学C++太难, 当初在学校学了将近一个学期的C++, 啥进步都没有, 哈哈, 天资太差, 所以才选择自学Java(当时学校并没有开设Java的课程), 才走上了程序开发这条路.</span></span></p>
<p><span style="font-size: large"><span style="font-size: 12pt">&nbsp;</span></span></p>
<p><span style="font-size: large"><span style="font-size: 12pt">Java虽然入门要容易, 然而要精通它, 要成为专家却很难.&nbsp;主要原因是Java所涉及的技术面比较宽,&nbsp;人的精力总是有限的.&nbsp;有些Java方面的技术是必须要要掌握的, 钻研得越深入越好, 比如多线程技术.</span></span></p>
<p><span style="font-size: large"><span style="font-size: 12pt">&nbsp;</span></span></p>
<p><strong><span style="font-size: large"><span style="font-size: 12pt">1. 基础阶段</span></span></strong></p>
<p><span><span style="font-size: large"><span style="font-size: 12pt">基础阶段, 可能需要经历1-2年吧. 这个时段, 应该多写一些基础的小程序(自己动手写的越多越好). 计算机是一门实践性很强的学科, 自己动手的东西, 记忆非常深刻, 效果要胜过读好多书. 当然, 学Java基础的时候, 书籍的选择也非常重要, 好的书籍事半功倍, 能让你打个非常好的基础. 而差的书籍,&nbsp;很容易将你带入歧途, 多走很多弯路.&nbsp;书籍不在多, 而在乎读得精(有些书, 你读十遍都不为过). 我记得我学Java的第一本书是&lt;Thinking in Java&gt;的中文版, 网上有很多人都建议不要把这本书作为第一本的入门教程来看, 太难. 我却想在此极力推荐它, 这本书确实是本经典之作. 而且书中确实讲的也是Java中的一些基础技术, 没有什么太难的东西, 只不过比较厚, 学习周期比较长, 所以很多人中途会选择放弃. 其实, 这本书是一本难得的入门教程,&nbsp;对Java一些基础的东西, 讲得很全, 而且也很清晰, 更重要的是, 这本书能让你养成很多好的编程习惯,&nbsp;例子也很多. 建议你把大部分的例子自己去实现一遍. &nbsp;我的亲身经历, 我记得当时认真的看了2遍, 花了大概7个月的时间, 不过真的有很好的效果. 另外一个教程, 就是&lt;Java核心技术&gt;卷一, 卷二的话可以不必要买. 卷一看完, 自己再钻研一下, 就已经能达到卷二的高度了:). 到那时, 你就会觉得看卷二没啥意思, 感觉浪费钱了. 还有一个, 就是张孝祥的Java视频, 看视频有个好处, 就是比看书的记忆要深刻, 还有很多你可以跟着视频的演示同步操作. 张孝祥的Java视频对初学者来说, 确实很有作用.<strong> 总结起来: 看这些资料的时候, 一定要多写例子, 写的越多越好!</strong></span></span></span></p>
<p><span style="font-size: large"><span style="font-size: 12pt">&nbsp;</span></span></p>
<p><strong></strong></p>
<p><strong></strong></p>
<p><strong><span style="font-size: large"><span style="font-size: 12pt">2. 中级阶段</span></span></strong></p>
<p><span style="font-size: large"><span style="font-size: 12pt">中级阶段, 是一个更漫长的时期, 能否突破此阶段, 跟个人的努力和天资有着很大的关系. 你不得不承认, 同样一门新技术, 有些人一个月领悟到的东西, 比你一年的都多. 这就是天资, 程序员是一个需要天才的工作. 我想, 很多人听说李一男吧, 此君就是这样的人物, 三个月的时间就能解决好大一帮人几年解决不了的问题, 给华为某部门带来了很多的收益. 哦, 这是题外话了, 与此篇的主题无关, 只是本人偶尔的感慨而已:).&nbsp; 这个阶段, 就需要研究很多专题性的东西了, 比如: IO的实现原理, 多线程和Java的线程模型, 网络编程, swing, RMI, reflect, EJB, JDBC等等很多很多的专题技术, 钻研得越深越好. 为了更好的提高, 研究的更深入, 你需要经常到网络上搜索资料, 这个时候往往一本书起不来很大的作用. 选一个JDK版本吧, 目前建议选用1.6, 多多研究它, 尤其是源代码(尽量! 就是尽自己最大的努力, 虽然研究透是不可能滴). 比如说: util, collection, io, nio, concurrent等等包. 可能有人会反对我说, 不是有API文档吗, 为什么还要研究这么多的源代码? 错了, 有API文档, 你仅仅只是知道怎么用而已, 而认真仔细的研读这些大牛的源码, 你就会深入更高的一个阶层, 自己的编码, 设计都会有很大的提高. 如果有能力和精力, 我建议你把JDK的每一行代码都熟悉一遍, 绝对只有好处, 没有坏处! 而且你会有些意外的收获,&nbsp;比如, 当你仔细地读完concurrent包的时候(不多, 好像总共是86个类吧), 你就会对Doug Lea佩服得五体投地. <strong>这个时候最忌碰到难题就去寻找帮助, 去网上找答案! 先把自己的脑袋想破吧, 或者等你的老板拿着砍刀冲过来要把你杀了,&nbsp;再去寻求帮助吧.</strong>&nbsp;对于专题的学习, 英文原版的阅读是非常必要的, 看的越多越好, 多上上IBM的developer, SUN的网站吧, 当然Javaeye也很不错:), 有很多大牛, 呵呵. </span></span></p>
<p><span style="font-size: large"><span style="font-size: 12pt">这个时候, 你应该建立自己的代码库了, 你应该自己去研究很多有意思的东西了. 从一个200多M的文件中寻找一个字段, 最坏情况(在文件的末尾咯)也只需要1秒左右的时间, 你知道吗?&nbsp;&nbsp;这个阶段, 有很多很多类似的有趣的东西可以供你去研究, 你需要更多地关注性能, 规范性, 多解决一些疑难问题. 需要学会所有的调试技术, 运用各种性能工具, 还有JDK附带的很多工具, 这些你都要熟练得跟屠夫操刀一样. 也可以看看&lt;Effective Java&gt;, 这本书总结的也不错, 对写高效稳定的Java程序有些帮助. 也可以看看模式方面的东西, 但是我建议模式不要滥用, 非得要用的时候才用, 模式往往会把问题搞复杂:). <strong>总结起来: 这个阶段是一个由点延伸到面的过程, 经过不断的学习, 演变成全面的深入! Java技术中你没什么盲点了, 还能解决很多性能问题和疑难问题, 你就成了一个合格的程序员了! :)</strong>&nbsp; [要想成为优秀程序员, 还得对数据库和操作系统很精通.]</span></span></p>
<p><span style="font-size: large"><span style="font-size: 12pt">&nbsp;</span></span></p>
<p><span style="font-size: large"><strong><span style="font-size: 12pt">3. 高级阶段</span></strong></span></p>
<p><span style="font-size: large"><span style="font-size: 12pt">高级阶段, 我就不敢妄言了. 呵呵, 我感觉自己也是处于中级阶段吧. 也是根据自己的一些经验, 谈谈自己的理解吧:</span></span></p>
<p><span style="font-size: large"><span style="font-size: 12pt">这个阶段, 需要研究各种框架, Spring, struts, Junit, Hibernate, iBatis, Jboss, Tomcat, snmp4j等等, 我觉得这个时候, 只要是用Java实现的经典框架, 你都可以去研究. <strong>------在此申明一下, 我的意思不是说会用. 光会用其实是远远不够的, 你可以选择自己喜欢钻研的框架, 去好好研究一下, 兴趣是最好的老师嘛.(2009.07.21)</strong></span></span></p>
<p><span style="font-size: large"><span style="font-size: 12pt">建议开始的时候, 研究Junit和Struts吧, 小一点, 里面都采用了很多的模式, 呵呵, 可以熟悉一下, 尽量想想人家为什么这么做.&nbsp;我建议主要的精力可以花在spring和jboss上, 尤其是jboss, &nbsp;经典中的经典, 设计, 性能, 多线程, 资源管理等等, 你从中可以学到的东西简直是太多了. 而且它还有一本写得很好的参考书, 叫&lt;Jboss管理与开发核心技术&gt;, 英文方面的资料也是非常的多. 在工作中如果有机会参与架构的设计, 业务问题的讨论, 一定想方设法杀进去! 这对自己的设计能力, 以及对设计如何运用在业务上有很大的帮助. 毕竟, 程序都是为了更好地实现用户的业务的. 这个时候, 需要更多看看软件工程和UML方面的资料, 或者自己主持一个项目玩玩, 不一定非得出去拉项目赚钱(能赚钱当然更好),&nbsp;不管成功或失败, 都是很宝贵的经验, 都能提高很多!&nbsp;&nbsp;</span></span></p>
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/288080.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-07-23 19:36 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/07/23/288080.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读《effective java》学习笔记一</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/07/23/288079.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Thu, 23 Jul 2009 11:31:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/07/23/288079.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/288079.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/07/23/288079.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/288079.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/288079.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该书介绍了在Java编程中极具实用价值的经验规则，这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案。通过对Java平台设计专家所使用的技术的全面描述，揭示了应该做什么，不应该做什么才能产生清晰、健壮和高效的代码。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;每天下班花点时间学习下吧，尽量在一个星期内把它看完，总结出来，大多数内容都来自书上，个人觉得该书不错的地方摘出来。<br />
<br />
&nbsp;<span style="color: red">第一条：考虑用静态工厂方法代替构造函数<br />
<span style="color: #020000">&nbsp;&nbsp;&nbsp;&nbsp;静态工厂方法(优点)：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.每次调用的时候，不一定要创建一个新的对象，这个可以自由控制。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.它可以返回一个原返回类型的子类型的对象。<br />
<br />
<p><font color="#020000">&nbsp;<br />
<span style="color: #ff0000">第二条：使用私有构造函数强化singleton属性</span><br />
<strong>第一种：提供共有的静态final域<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_18_105_Open_Image" onclick="this.style.display='none'; Codehighlighter1_18_105_Open_Text.style.display='none'; Codehighlighter1_18_105_Closed_Image.style.display='inline'; Codehighlighter1_18_105_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_18_105_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_18_105_Closed_Text.style.display='none'; Codehighlighter1_18_105_Open_Image.style.display='inline'; Codehighlighter1_18_105_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Elvis</span><span id="Codehighlighter1_18_105_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_18_105_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;Elvis&nbsp;INSTANCE&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Elvis();<br />
<img id="Codehighlighter1_87_98_Open_Image" onclick="this.style.display='none'; Codehighlighter1_87_98_Open_Text.style.display='none'; Codehighlighter1_87_98_Closed_Image.style.display='inline'; Codehighlighter1_87_98_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_87_98_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_87_98_Closed_Text.style.display='none'; Codehighlighter1_87_98_Open_Image.style.display='inline'; Codehighlighter1_87_98_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Elvis()</span><span id="Codehighlighter1_87_98_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_87_98_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<p></strong></font>&nbsp;</p>
<p><font color="#020000"><strong>第二种：提供一个共有的静态工厂方法</strong><br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img id="Codehighlighter1_18_169_Open_Image" onclick="this.style.display='none'; Codehighlighter1_18_169_Open_Text.style.display='none'; Codehighlighter1_18_169_Closed_Image.style.display='inline'; Codehighlighter1_18_169_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_18_169_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_18_169_Closed_Text.style.display='none'; Codehighlighter1_18_169_Open_Image.style.display='inline'; Codehighlighter1_18_169_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Elvis</span><span id="Codehighlighter1_18_169_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_18_169_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;Elvis&nbsp;INSTANCE&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Elvis();<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img id="Codehighlighter1_88_99_Open_Image" onclick="this.style.display='none'; Codehighlighter1_88_99_Open_Text.style.display='none'; Codehighlighter1_88_99_Closed_Image.style.display='inline'; Codehighlighter1_88_99_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_88_99_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_88_99_Closed_Text.style.display='none'; Codehighlighter1_88_99_Open_Image.style.display='inline'; Codehighlighter1_88_99_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Elvis()</span><span id="Codehighlighter1_88_99_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_88_99_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img id="Codehighlighter1_140_162_Open_Image" onclick="this.style.display='none'; Codehighlighter1_140_162_Open_Text.style.display='none'; Codehighlighter1_140_162_Closed_Image.style.display='inline'; Codehighlighter1_140_162_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_140_162_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_140_162_Closed_Text.style.display='none'; Codehighlighter1_140_162_Open_Image.style.display='inline'; Codehighlighter1_140_162_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Elvis&nbsp;getInstance()</span><span id="Codehighlighter1_140_162_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_140_162_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;INSTANCE;<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<p></font>&nbsp;</p>
<p><font color="#020000">第一种性能上会稍微好些<br />
第二种提供了灵活性，在不改变API的前提下，允许我们改变想法，把该类做成singleton，或者不做，容易被修改。</font></p>
<p><font color="#020000">注意点：为了使一个singleton类变成克序列花的(Serializable),仅仅在声明中加上implements Serializable是不够的，<br />
为了维护singleton性，必须也要提供一个 <br />
private Object readResolve() throws ObjectStreamException{<br />
&nbsp;return INSTANCE;<br />
}</font></p>
<font color="#020000">
<p><br />
<span style="color: #ff0000">第三条：通过私有构造函数强化不可实例化的能力</span><br />
只要让这个类包含单个显式的私有构造函数，则它就不可被实例化;<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span>&nbsp;<span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;UtilityClass{<br />
</span><span style="color: #008080">2</span>&nbsp;<span style="color: #000000">&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;UtilityClass(){<br />
</span><span style="color: #008080">3</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
</span><span style="color: #008080">4</span>&nbsp;<span style="color: #000000">&nbsp;}<br />
</span><span style="color: #008080">5</span>&nbsp;<span style="color: #000000">&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
</span><span style="color: #008080">6</span>&nbsp;<span style="color: #000000">}</span></div>
<p>&nbsp;</p>
<p>企图通过将一个类做成抽象类来强制该类不可被实例化，这是行不通的。该类可以被子类化，并且该子类也可以被实例化。<br />
更进一步，这样做会误导用户，以为这种类是专门为了继承而设计的。</p>
<p>&nbsp;</p>
<p><span style="color: #ff0000">第四条：避免创建重复的对象</span><br />
String s&nbsp; = new Sting("silly");//这么恶心的代码就不要写啦。。。</p>
<p>1.静态工厂方法可几乎总是优先于构造方法;Boolean.valueOf(...) &gt; Boolean(...),构造函数每次被调用的时候都会创建一个新的对象，<br />
而静态工厂方法从来不要求这样做。</p>
<p>2.<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_20_477_Open_Image" onclick="this.style.display='none'; Codehighlighter1_20_477_Open_Text.style.display='none'; Codehighlighter1_20_477_Closed_Image.style.display='inline'; Codehighlighter1_20_477_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_20_477_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_20_477_Closed_Text.style.display='none'; Codehighlighter1_20_477_Open_Image.style.display='inline'; Codehighlighter1_20_477_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Person&nbsp;</span><span id="Codehighlighter1_20_477_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_20_477_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;Date&nbsp;birthDate;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_80_108_Open_Image" onclick="this.style.display='none'; Codehighlighter1_80_108_Open_Text.style.display='none'; Codehighlighter1_80_108_Closed_Image.style.display='inline'; Codehighlighter1_80_108_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_80_108_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_80_108_Closed_Text.style.display='none'; Codehighlighter1_80_108_Open_Image.style.display='inline'; Codehighlighter1_80_108_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Person(Date&nbsp;date)</span><span id="Codehighlighter1_80_108_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_80_108_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.birthDate&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;date;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">don't&nbsp;do&nbsp;this</span><span style="color: #008000"><br />
<img id="Codehighlighter1_159_475_Open_Image" onclick="this.style.display='none'; Codehighlighter1_159_475_Open_Text.style.display='none'; Codehighlighter1_159_475_Closed_Image.style.display='inline'; Codehighlighter1_159_475_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_159_475_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_159_475_Closed_Text.style.display='none'; Codehighlighter1_159_475_Open_Image.style.display='inline'; Codehighlighter1_159_475_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;isBabyBoomer()</span><span id="Codehighlighter1_159_475_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_159_475_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calendar&nbsp;gmtCal&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Calendar.getInstance(TimeZone.getTimeZone(</span><span style="color: #000000">"</span><span style="color: #000000">GMT</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gmtCal.set(</span><span style="color: #000000">1946</span><span style="color: #000000">,Calendar.JANUARY,</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">0</span><span style="color: #000000">,</span><span style="color: #000000">0</span><span style="color: #000000">,</span><span style="color: #000000">0</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;boomStart&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;gmtCal.getTime();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gmtCal.set(</span><span style="color: #000000">1965</span><span style="color: #000000">,Calendar.JANUARY,</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">0</span><span style="color: #000000">,</span><span style="color: #000000">0</span><span style="color: #000000">,</span><span style="color: #000000">0</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;boomEnd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;gmtCal.getTime();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;birthDate.compareTo(boomStart)&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;birthDate.compareTo(boomEnd)&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>isBabyBoomer每次被调用的时候，都会创建一个新的Calendar，一个新的TimeZone和两个新的Date实例。。。</p>
<p>下面的版本避免了这种低效率的动作，代之以一个static 块初始化Calendar对象，而且最体现效率的是，他的生命周期只实例化一次Calendar并且把<br />
80年，90年的出生的值赋值给类静态变量BOOM_START和BOOM_END<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_13_566_Open_Image" onclick="this.style.display='none'; Codehighlighter1_13_566_Open_Text.style.display='none'; Codehighlighter1_13_566_Closed_Image.style.display='inline'; Codehighlighter1_13_566_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_13_566_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_13_566_Closed_Text.style.display='none'; Codehighlighter1_13_566_Open_Image.style.display='inline'; Codehighlighter1_13_566_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Person&nbsp;</span><span id="Codehighlighter1_13_566_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_13_566_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;Date&nbsp;birthDate;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_78_111_Open_Image" onclick="this.style.display='none'; Codehighlighter1_78_111_Open_Text.style.display='none'; Codehighlighter1_78_111_Closed_Image.style.display='inline'; Codehighlighter1_78_111_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_78_111_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_78_111_Closed_Text.style.display='none'; Codehighlighter1_78_111_Open_Image.style.display='inline'; Codehighlighter1_78_111_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Person(Date&nbsp;birthDate)&nbsp;</span><span id="Codehighlighter1_78_111_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_78_111_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.birthDate&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;birthDate;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;Date&nbsp;BOOM_START;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;Date&nbsp;BOOM_END;<br />
<img id="Codehighlighter1_200_438_Open_Image" onclick="this.style.display='none'; Codehighlighter1_200_438_Open_Text.style.display='none'; Codehighlighter1_200_438_Closed_Image.style.display='inline'; Codehighlighter1_200_438_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_200_438_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_200_438_Closed_Text.style.display='none'; Codehighlighter1_200_438_Open_Image.style.display='inline'; Codehighlighter1_200_438_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_200_438_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_200_438_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;Calendar&nbsp;gmtCal&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Calendar.getInstance(TimeZone.getTimeZone(</span><span style="color: #000000">"</span><span style="color: #000000">GMT</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;gmtCal.set(</span><span style="color: #000000">1980</span><span style="color: #000000">,&nbsp;Calendar.JANUARY,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;BOOM_START&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;gmtCal.getTime();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;gmtCal.set(</span><span style="color: #000000">1990</span><span style="color: #000000">,&nbsp;Calendar.JANUARY,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;BOOM_END&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;gmtCal.getTime();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_472_563_Open_Image" onclick="this.style.display='none'; Codehighlighter1_472_563_Open_Text.style.display='none'; Codehighlighter1_472_563_Closed_Image.style.display='inline'; Codehighlighter1_472_563_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_472_563_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_472_563_Closed_Text.style.display='none'; Codehighlighter1_472_563_Open_Image.style.display='inline'; Codehighlighter1_472_563_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;isBabyBoomer()&nbsp;</span><span id="Codehighlighter1_472_563_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_472_563_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;birthDate.compareTo(BOOM_START)&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;birthDate.compareTo(BOOM_END)&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span></div>
<p></span>&nbsp;</p>
<p>&nbsp;</p>
<p><br />
</font>&nbsp;</p>
</span></span>
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/288079.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-07-23 19:31 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/07/23/288079.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于eclipse和javac编译结果不一致的问题的分析与解决 (转)</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/05/23/277438.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Fri, 22 May 2009 18:15:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/05/23/277438.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/277438.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/05/23/277438.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/277438.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/277438.html</trackback:ping><description><![CDATA[<p>问题：</p>
<p>下面一个简单的类：</p>
<p>public class MyTest {<br />
&nbsp;<span style="color: #ff0000;">private static String
className = String.class.getName(); //红色部分是下面问题的关键<br />
</span>&nbsp;public static void
main(String[] args){<br />
&nbsp; System.out.println(className);&nbsp;&nbsp;&nbsp; <br />
&nbsp;}<br />
}</p>
<p>经eclipse3.1.1编译后(指定类兼容性版本为1.4)，再反编译的结果是：</p>
<p>public class MyTest<br />
{</p>
<p>&nbsp;&nbsp;&nbsp; public MyTest()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public static void main(String args[])<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
System.out.println(className);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; private static String className;</p>
<p>&nbsp;&nbsp;&nbsp; static <br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; className =
java.lang.String.class.getName();<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>而经过sun javac(或者ant, antx)编译后(JDK版本1.4，或者JDK1.5，但是编译结果指定版本为1.4)，再反编译的结果是：</p>
<p>public class MyTest<br />
{</p>
<p>&nbsp;&nbsp;&nbsp; public MyTest()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public static void main(String args[])<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
System.out.println(className);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; <span style="color: #ff0000;">static Class _mthclass$(String x0)<br />
&nbsp;&nbsp;&nbsp;
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Class.forName(x0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClassNotFoundException
x1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw (new
NoClassDefFoundError()).initCause(x1);<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p>&nbsp;&nbsp;&nbsp; private static String className;</p>
<p>&nbsp;&nbsp;&nbsp; static <br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; className =
(java.lang.String.class).getName();<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>&nbsp;</p>
<p>也就是说sun javac编译出来的结果里面多了一个_mthclass$方法，这个通常不会有什么问题，不过在使用hot swap技术(例如Antx
eclipse plugin中的快速部署插件利用hot swap来实现类的热替换，或者某些类序列化的地方，这个就成为问题了。</p>
<p>&nbsp;</p>
<p>用_mthclass$在google上搜一把，结果不多，比较有价值的是这一篇：<a href="http://coding.derkeiler.com/Archive/Java/comp.lang.java.softwaretools/2004-01/0138.html">http://coding.derkeiler.com/Archive/Java/comp.lang.java.softwaretools/2004-01/0138.html</a>
</p>
<p>按照这个说法，这个问题是由于Sun本身没有遵循规范，而eclipse compiler遵循规范导致的，而且eclipse
compiler是没有办法替换的。</p>
<p>&nbsp;</p>
<p>尝试将JDK版本换成1.5，sun
javac生成出来的_mthclass$是不见了，不过，这回奇怪的是eclipse的编译结果中多了一个成员变量class$0，<br />
下面是经eclipse3.1.1编译后(指定类兼容性版本为5.0)，再反编译的结果：<br />
public
class MyTest<br />
{</p>
<p>&nbsp;&nbsp;&nbsp; public MyTest()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public static void main(String args[])<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
System.out.println(className);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; private static String className = java/lang/String.getName();<br />
&nbsp;&nbsp;&nbsp;
<span style="color: #ff0000;">static Class class$0;</span></p>
<p>}<br />
而经过sun javac(或者ant, antx)编译后(JDK版本1.5)，再反编译的结果是：<br />
public class
MyTest<br />
{</p>
<p>&nbsp;&nbsp;&nbsp; public MyTest()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public static void main(String args[])<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
System.out.println(className);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; private static String className = java/lang/String.getName();</p>
<p>}</p>
<p>再在goole上搜了一把，发现了Eclipse3.2有两个比较重要的特征：<br />
1.与javac的兼容性更好。<br />
2.提供了单独的编译器，可以在eclipse外部使用，包括ant中使用。</p>
<p>于是下载eclipse3.2版本，首先验证一下其与sun javac的兼容性如何，<br />
使用JDK1.4版本的时候，还是老样子，sun
javac编译出来的_mthclass$方法在eclipse3.2的编译结果中还是不存在，所以还是不兼容的。<br />
不过使用JDK1.5版本的时候，这会eclipse
3.2的编译结果总算和sun javac一致了。</p>
<p>虽然，用JDK1.5加上eclipse
3.2已经保证了这个类在两种编译器下的兼容性，不过总觉得不踏实：<br />
1.谁知道这两个编译器还有没有其它不兼容的地方呢？<br />
2.版本要求太严格，很多由于各种原因没有使用这些版本的很麻烦。</p>
<p>因此，还是从根本上解决这个问题比较合适：根本上解决最好就是不要使用两种不同的编译器，而使用同一种。<br />
由于eclipse环境下的编译器是不可替换的，所以企图都使用sun
javac的方式不太可行，那么统一使用eclipse自带的编译器如何呢？<br />
刚才提到的eclipse3.2的第二个比较重要的特性就派上用场了。<br />
独立的eclipse编译器(1M大小而已)可以在如下地址下载：<a href="http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.2-200606291905/ecj.jar">http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.2-200606291905/ecj.jar</a>
<br />
这个独立的编译器在antx下的使用也很简单：(关于该编译器的独立使用或者ant下面的使用可以参看this help section: JDT
Plug-in Developer Guide&gt;Programmer's Guide&gt;JDT Core&gt;Compiling Java
code)<br />
1.将下载下来的编译器放在ANTX_HOME/lib目录下面。<br />
2.在总控项目文件的project.xml增加这么一行即可：&lt;property
name="build.compiler"
value="org.eclipse.jdt.core.JDTCompilerAdapter"/&gt;<br />
这样就保证了通过antx打包的类也是用eclipse的编译器编译出来的，当然就不应该存在类不兼容的情况了。</p>
<p>&nbsp;</p>
<p>实际上，eclipse3.1.1版本也已经提供了独立的eclipse编译器，不过当时并没有单独提供独立的包下载，如果希望使用3.1.1版本的eclipse编译器，可以使用org.eclipse.jdt.core_3.1.1.jar以及其中包含的jdtCompilerAdapter.jar。（eclipse3.1.1环境的编译器我没有独立验证过）</p>
<p>&nbsp;</p>
<br />
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/277438.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-05-23 02:15 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/05/23/277438.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Unicode简介(转)</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/05/16/270963.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Fri, 15 May 2009 17:52:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/05/16/270963.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/270963.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/05/16/270963.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/270963.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/270963.html</trackback:ping><description><![CDATA[<br />
Unicode是一种字符编码规范&nbsp;。<br />
<br />
先从ASCII说起。ASCII是用来表示英文字符的一种编码规范，每个ASCII字符占用1个字节（8bits）&nbsp;<br />
<br />
因此，ASCII编码可以表示的最大字符数是256，其实英文字符并没有那么多，一般只用前128个（最高位为0），其中包括了控制字符、数字、大小写字母和其他一些符号&nbsp;。<br />
<br />
而最高位为1的另128个字符被成为&#8220;扩展ASCII&#8221;，一般用来存放英文的制表符、部分音标字符等等的一些其他符号&nbsp;<br />
<br />
这种字符编码规范显然用来处理英文没有什么问题&nbsp;。（实际上也可以用来处理法文、德文等一些其他的西欧字符，但是不能和英文通用），但是面对中文、阿拉伯文之类复杂的文字，255个字符显然不够用&nbsp;<br />
<br />
于是，各个国家纷纷制定了自己的文字编码规范，其中中文的文字编码规范叫做&#8220;GB2312-80&#8221;，它是和ASCII兼容的一种编码规范，其实就是利用扩展ASCII没有真正标准化这一点，把一个中文字符用两个扩展ASCII字符来表示。&nbsp;<br />
<br />
但是这个方法有问题，最大的问题就是，中文文字没有真正属于自己的编码，因为扩展ASCII码虽然没有真正的标准化，但是PC里的ASCII码还是有一个事实标准的（存放着英文制表符），所以很多软件利用这些符号来画表格。这样的软件用到中文系统中，这些表格符就会被误认作中文字，破坏版面。而且，统计中英文混合字符串中的字数，也是比较复杂的，我们必须判断一个ASCII码是否扩展，以及它的下一个ASCII是否扩展，然后才&#8220;猜&#8221;那可能是一个中文字&nbsp;。<br />
<br />
总之当时处理中文是很痛苦的。而更痛苦的是GB2312是国家标准，台湾当时有一个Big5编码标准，很多编码和GB是相同的，所以&#8230;&#8230;，嘿嘿。&nbsp;<br />
<br />
这时候，我们就知道，要真正解决中文问题，不能从扩展ASCII的角度入手，也不能仅靠中国一家来解决。而必须有一个全新的编码系统，这个系统要可以将中文、英文、法文、德文&#8230;&#8230;等等所有的文字统一起来考虑，为每个文字都分配一个单独的编码，这样才不会有上面那种现象出现。&nbsp;<br />
<br />
于是，Unicode诞生了。&nbsp;<br />
<br />
Unicode有两套标准，一套叫UCS-2(Unicode-16)，用2个字节为字符编码，另一套叫UCS-4(Unicode-32)，用4个字节为字符编码。&nbsp;<br />
<br />
以目前常用的UCS-2为例，它可以表示的字符数为2^16=65535，基本上可以容纳所有的欧美字符和绝大部分的亚洲字符&nbsp;。<br />
<br />
UTF-8的问题后面会提到&nbsp;。<br />
<br />
在Unicode里，所有的字符被一视同仁。汉字不再使用&#8220;两个扩展ASCII&#8221;，而是使用&#8220;1个Unicode&#8221;，注意，现在的汉字是&#8220;一个字符&#8221;了，于是，拆字、统计字数这些问题也就自然而然的解决了&nbsp;。<br />
<br />
但是，这个世界不是理想的，不可能在一夜之间所有的系统都使用Unicode来处理字符，所以Unicode在诞生之日，就必须考虑一个严峻的问题：和ASCII字符集之间的不兼容问题。&nbsp;<br />
<br />
我们知道，ASCII字符是单个字节的，比如&#8220;A&#8221;的ASCII是65。而Unicode是双字节的，比如&#8220;A&#8221;的Unicode是0065，这就造成了一个非常大的问题：以前处理ASCII的那套机制不能被用来处理Unicode了&nbsp;。<br />
<br />
另一个更加严重的问题是，C语言使用'\0'作为字符串结尾，而Unicode里恰恰有很多字符都有一个字节为0，这样一来，C语言的字符串函数将无法正常处理Unicode，除非把世界上所有用C写的程序以及他们所用的函数库全部换掉&nbsp;。<br />
<br />
于是，比Unicode更伟大的东东诞生了，之所以说它更伟大是因为它让Unicode不再存在于纸上，而是真实的存在于我们大家的电脑中。那就是：UTF&nbsp;。<br />
<br />
UTF=&nbsp;UCS&nbsp;Transformation&nbsp;Format&nbsp;UCS转换格式&nbsp;<br />
<br />
它是将Unicode编码规则和计算机的实际编码对应起来的一个规则。现在流行的UTF有2种：UTF-8和UTF-16&nbsp;。<br />
<br />
其中UTF-16和上面提到的Unicode本身的编码规范是一致的，这里不多说了。而UTF-8不同，它定义了一种&#8220;区间规则&#8221;，这种规则可以和ASCII编码保持最大程度的兼容&nbsp;。<br />
<br />
UTF-8有点类似于Haffman编码，它将Unicode编码为00000000-0000007F的字符，用单个字节来表示；&nbsp;<br />
<br />
00000080-000007FF的字符用两个字节表示&nbsp;<br />
<br />
00000800-0000FFFF的字符用3字节表示&nbsp;<br />
<br />
因为目前为止Unicode-16规范没有指定FFFF以上的字符，所以UTF-8最多是使用3个字节来表示一个字符。但理论上来说，UTF-8最多需要用6字节表示一个字符。&nbsp;<br />
<br />
在UTF-8里，英文字符仍然跟ASCII编码一样，因此原先的函数库可以继续使用。而中文的编码范围是在0080-07FF之间，因此是2个字节表示（但这两个字节和GB编码的两个字节是不同的），用专门的Unicode处理类可以对UTF编码进行处理。&nbsp;<br />
<br />
下面说说中文的问题。&nbsp;<br />
<br />
由于历史的原因，在Unicode之前，一共存在过3套中文编码标准。&nbsp;<br />
<br />
GB2312-80，是中国大陆使用的国家标准，其中一共编码了6763个常用简体汉字。Big5，是台湾使用的编码标准，编码了台湾使用的繁体汉字，大概有8千多个。HKSCS，是中国香港使用的编码标准，字体也是繁体，但跟Big5有所不同。&nbsp;<br />
<br />
这3套编码标准都采用了两个扩展ASCII的方法，因此，几套编码互不兼容，而且编码区间也各有不同&nbsp;<br />
<br />
因为其不兼容性，在同一个系统中同时显示GB和Big5基本上是不可能的。当时的南极星、RichWin等等软件，在自动识别中文编码、自动显示正确编码方面都做了很多努力&nbsp;。<br />
<br />
他们用了怎样的技术我就不得而知了，我知道好像南极星曾经以同屏显示繁简中文为卖点。&nbsp;<br />
<br />
后来，由于各方面的原因，国际上又制定了针对中文的统一字符集GBK和GB18030，其中GBK已经在Windows、Linux等多种操作系统中被实现。&nbsp;<br />
<br />
GBK兼容GB2312，并增加了大量不常用汉字，还加入了几乎所有的Big5中的繁体汉字。但是GBK中的繁体汉字和Big5中的几乎不兼容。&nbsp;<br />
<br />
GB18030相当于是GBK的超集，比GBK包含的字符更多。据我所知目前还没有操作系统直接支持GB18030。&nbsp;<br />
<br />
<br />
谈谈Unicode编码，简要解释UCS、UTF、BMP、BOM等名词&nbsp;<br />
这是一篇程序员写给程序员的趣味读物。所谓趣味是指可以比较轻松地了解一些原来不清楚的概念，增进知识，类似于打RPG游戏的升级。整理这篇文章的动机是两个问题：<br />
<br />
问题一：&nbsp;<br />
使用Windows记事本的&#8220;另存为&#8221;，可以在GBK、Unicode、Unicode&nbsp;big&nbsp;endian和UTF-8这几种编码方式间相互转换。同样是txt文件，Windows是怎样识别编码方式的呢？<br />
<br />
我很早前就发现Unicode、Unicode&nbsp;big&nbsp;endian和UTF-8编码的txt文件的开头会多出几个字节，分别是FF、FE（Unicode）,FE、FF（Unicode&nbsp;big&nbsp;endian）,EF、BB、BF（UTF-8）。但这些标记是基于什么标准呢？<br />
<br />
问题二：&nbsp;<br />
最近在网上看到一个ConvertUTF.c，实现了UTF-32、UTF-16和UTF-8这三种编码方式的相互转换。对于Unicode(UCS2)、GBK、UTF-8这些编码方式，我原来就了解。但这个程序让我有些糊涂，想不起来UTF-16和UCS2有什么关系。&nbsp;<br />
查了查相关资料，总算将这些问题弄清楚了，顺带也了解了一些Unicode的细节。写成一篇文章，送给有过类似疑问的朋友。本文在写作时尽量做到通俗易懂，但要求读者知道什么是字节，什么是十六进制。<br />
<br />
0、big&nbsp;endian和little&nbsp;endian<br />
big&nbsp;endian和little&nbsp;endian是CPU处理多字节数的不同方式。例如&#8220;汉&#8221;字的Unicode编码是6C49。那么写到文件里时，究竟是将6C写在前面，还是将49写在前面？如果将6C写在前面，就是big&nbsp;endian。还是将49写在前面，就是little&nbsp;endian。<br />
<br />
&#8220;endian&#8221;这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开，由此曾发生过六次叛乱，其中一个皇帝送了命，另一个丢了王位。<br />
<br />
我们一般将endian翻译成&#8220;字节序&#8221;，将big&nbsp;endian和little&nbsp;endian称作&#8220;大尾&#8221;和&#8220;小尾&#8221;。<br />
<br />
1、字符编码、内码，顺带介绍汉字编码<br />
字符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。早期的计算机使用7位的ASCII编码，为了处理汉字，程序员设计了用于简体中文的GB2312和用于繁体中文的big5。<br />
<br />
GB2312(1980年)一共收录了7445个字符，包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7，低字节从A1-FE，占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。<br />
<br />
GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号，它分为汉字区和图形符号区。汉字区包括21003个字符。2000年的GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字，同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。现在的PC平台必须支持GB18030，对嵌入式产品暂不作要求。所以手机、MP3一般只支持GB2312。<br />
<br />
从ASCII、GB2312、GBK到GB18030，这些编码方法是向下兼容的，即同一个字符在这些方案中总是有相同的编码，后面的标准支持更多的字符。在这些编码中，英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼，GB2312、GBK到GB18030都属于双字节字符集&nbsp;(DBCS)。<br />
<br />
有的中文Windows的缺省内码还是GBK，可以通过GB18030升级包升级到GB18030。不过GB18030相对GBK增加的字符，普通人是很难用到的，通常我们还是用GBK指代中文Windows内码。<br />
<br />
这里还有一些细节：<br />
<br />
GB2312的原文还是区位码，从区位码到内码，需要在高字节和低字节上分别加上A0。<br />
<br />
在DBCS中，GB内码的存储格式始终是big&nbsp;endian，即高位在前。<br />
<br />
GB2312的两个字节的最高位都是1。但符合这个条件的码位只有128*128=16384个。所以GBK和GB18030的低字节最高位都可能不是1。不过这不影响DBCS字符流的解析：在读取DBCS字符流时，只要遇到高位为1的字节，就可以将下两个字节作为一个双字节编码，而不用管低字节的高位是什么。<br />
<br />
2、Unicode、UCS和UTF<br />
前面提到从ASCII、GB2312、GBK到GB18030的编码方法是向下兼容的。而Unicode只与ASCII兼容（更准确地说，是与ISO-8859-1兼容），与GB码不兼容。例如&#8220;汉&#8221;字的Unicode编码是6C49，而GB码是BABA。<br />
<br />
Unicode也是一种字符编码方法，不过它是由国际组织设计，可以容纳全世界所有语言文字的编码方案。Unicode的学名是"Universal&nbsp;Multiple-Octet&nbsp;Coded&nbsp;Character&nbsp;Set"，简称为UCS。UCS可以看作是"Unicode&nbsp;Character&nbsp;Set"的缩写。<br />
<br />
根据维基百科全书(<a href="http://zh.wikipedia.org/wiki/">http://zh.wikipedia.org/wiki/</a>)的记载：历史上存在两个试图独立设计Unicode的组织，即国际标准化组织（ISO）和一个软件制造商的协会（unicode.org）。ISO开发了ISO&nbsp;10646项目，Unicode协会开发了Unicode项目。<br />
<br />
在1991年前后，双方都认识到世界不需要两个不兼容的字符集。于是它们开始合并双方的工作成果，并为创立一个单一编码表而协同工作。从Unicode2.0开始，Unicode项目采用了与ISO&nbsp;10646-1相同的字库和字码。<br />
<br />
目前两个项目仍都存在，并独立地公布各自的标准。Unicode协会现在的最新版本是2005年的Unicode&nbsp;4.1.0。ISO的最新标准是10646-3:2003。<br />
<br />
UCS规定了怎么用多个字节表示各种文字。怎样传输这些编码，是由UTF(UCS&nbsp;Transformation&nbsp;Format)规范规定的，常见的UTF规范包括UTF-8、UTF-7、UTF-16。<br />
<br />
IETF的RFC2781和RFC3629以RFC的一贯风格，清晰、明快又不失严谨地描述了UTF-16和UTF-8的编码方法。我总是记不得IETF是Internet&nbsp;Engineering&nbsp;Task&nbsp;Force的缩写。但IETF负责维护的RFC是Internet上一切规范的基础。<br />
<br />
3、UCS-2、UCS-4、BMP<br />
<br />
UCS有两种格式：UCS-2和UCS-4。顾名思义，UCS-2就是用两个字节编码，UCS-4就是用4个字节（实际上只用了31位，最高位必须为0）编码。下面让我们做一些简单的数学游戏：<br />
<br />
UCS-2有2^16=65536个码位，UCS-4有2^31=2147483648个码位。<br />
<br />
UCS-4根据最高位为0的最高字节分成2^7=128个group。每个group再根据次高字节分为256个plane。每个plane根据第3个字节分为256行&nbsp;(rows)，每行包含256个cells。当然同一行的cells只是最后一个字节不同，其余都相同。<br />
<br />
group&nbsp;0的plane&nbsp;0被称作Basic&nbsp;Multilingual&nbsp;Plane,&nbsp;即BMP。或者说UCS-4中，高两个字节为0的码位被称作BMP。<br />
<br />
将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。在UCS-2的两个字节前加上两个零字节，就得到了UCS-4的BMP。而目前的UCS-4规范中还没有任何字符被分配在BMP之外。<br />
<br />
4、UTF编码<br />
<br />
UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下：<br />
<br />
UCS-2编码(16进制)&nbsp;UTF-8&nbsp;字节流(二进制)&nbsp;<br />
0000&nbsp;-&nbsp;007F&nbsp;0xxxxxxx&nbsp;<br />
0080&nbsp;-&nbsp;07FF&nbsp;110xxxxx&nbsp;10xxxxxx&nbsp;<br />
0800&nbsp;-&nbsp;FFFF&nbsp;1110xxxx&nbsp;10xxxxxx&nbsp;10xxxxxx&nbsp;<br />
<br />
例如&#8220;汉&#8221;字的Unicode编码是6C49。6C49在0800-FFFF之间，所以肯定要用3字节模板了：1110xxxx&nbsp;10xxxxxx&nbsp;10xxxxxx。将6C49写成二进制是：0110&nbsp;110001&nbsp;001001，&nbsp;用这个比特流依次代替模板中的x，得到：11100110&nbsp;10110001&nbsp;10001001，即E6&nbsp;B1&nbsp;89。<br />
<br />
读者可以用记事本测试一下我们的编码是否正确。<br />
<br />
UTF-16以16位为单元对UCS进行编码。对于小于0x10000的UCS码，UTF-16编码就等于UCS码对应的16位无符号整数。对于不小于0x10000的UCS码，定义了一个算法。不过由于实际使用的UCS2，或者UCS4的BMP必然小于0x10000，所以就目前而言，可以认为UTF-16和UCS-2基本相同。但UCS-2只是一个编码方案，UTF-16却要用于实际的传输，所以就不得不考虑字节序的问题。<br />
<br />
5、UTF的字节序和BOM<br />
UTF-8以字节为编码单元，没有字节序的问题。UTF-16以两个字节为编码单元，在解释一个UTF-16文本前，首先要弄清楚每个编码单元的字节序。例如收到一个&#8220;奎&#8221;的Unicode编码是594E，&#8220;乙&#8221;的Unicode编码是4E59。如果我们收到UTF-16字节流&#8220;594E&#8221;，那么这是&#8220;奎&#8221;还是&#8220;乙&#8221;？<br />
<br />
Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是&#8220;Bill&nbsp;Of&nbsp;Material&#8221;的BOM表，而是Byte&nbsp;Order&nbsp;Mark。BOM是一个有点小聪明的想法：<br />
<br />
在UCS编码中有一个叫做"ZERO&nbsp;WIDTH&nbsp;NO-BREAK&nbsp;SPACE"的字符，它的编码是FEFF。而FFFE在UCS中是不存在的字符，所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前，先传输字符"ZERO&nbsp;WIDTH&nbsp;NO-BREAK&nbsp;SPACE"。<br />
<br />
这样如果接收者收到FEFF，就表明这个字节流是Big-Endian的；如果收到FFFE，就表明这个字节流是Little-Endian的。因此字符"ZERO&nbsp;WIDTH&nbsp;NO-BREAK&nbsp;SPACE"又被称作BOM。<br />
<br />
UTF-8不需要BOM来表明字节顺序，但可以用BOM来表明编码方式。字符"ZERO&nbsp;WIDTH&nbsp;NO-BREAK&nbsp;SPACE"的UTF-8编码是EF&nbsp;BB&nbsp;BF（读者可以用我们前面介绍的编码方法验证一下）。所以如果接收者收到以EF&nbsp;BB&nbsp;BF开头的字节流，就知道这是UTF-8编码了。<br />
<br />
Windows就是使用BOM来标记文本文件的编码方式的。<br />
<br />
6、进一步的参考资料<br />
本文主要参考的资料是&nbsp;"Short&nbsp;overview&nbsp;of&nbsp;ISO-IEC&nbsp;10646&nbsp;and&nbsp;Unicode"&nbsp;(<a href="http://www.nada.kth.se/i18n/ucs/unicode-iso10646-oview.html">http://www.nada.kth.se/i18n/ucs/unicode-iso10646-oview.html</a>)。<br />
<br />
我还找了两篇看上去不错的资料，不过因为我开始的疑问都找到了答案，所以就没有看：<br />
<br />
"Understanding&nbsp;Unicode&nbsp;A&nbsp;general&nbsp;introduction&nbsp;to&nbsp;the&nbsp;Unicode&nbsp;Standard"&nbsp;(<a href="http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&amp;item_id=IWS-Chapter04a">http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&amp;item_id=IWS-Chapter04a</a>)&nbsp;<br />
"Character&nbsp;set&nbsp;encoding&nbsp;basics&nbsp;Understanding&nbsp;character&nbsp;set&nbsp;encodings&nbsp;and&nbsp;legacy&nbsp;encodings"&nbsp;(<a href="http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&amp;item_id=IWS-Chapter03">http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&amp;item_id=IWS-Chapter03</a>)<br />
<br />
<br />
<script type="text/javascript"><!-- google_ad_client="pub-7390275636631344" ; google_ad_width="728;
google_ad_height" = 90; google_ad_format="728x90_as" ; google_ad_type="text_image" ; google_ad_channel="5095444487" ; google_color_border="336699" ; google_color_bg="FFFFFF" ; google_color_link="0000FF" ; google_color_url="008000" ; google_color_text="000000" ;
//--></script><script src="JR - 精品文章 - Unicode简介(UTF-8和GB2312,GBK,GB10830的关系可以看看).files/show_ads.js" type="text/javascript">
</script>
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/270963.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-05-16 01:52 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/05/16/270963.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用的匹配正则表达式和实例(转)</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/05/15/270865.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Fri, 15 May 2009 08:06:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/05/15/270865.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/270865.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/05/15/270865.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/270865.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/270865.html</trackback:ping><description><![CDATA[<p><br />
匹配中文字符的正则表达式： [\u4e00-\u9fa5] <br />
匹配双字节字符(包括汉字在内)：[^\x00-\xff]<br />
应用：计算字符串的长度（一个双字节字符长度计2，ASCII字符计1）<br />
String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}<br />
匹配空行的正则表达式：\n[\s| ]*\r<br />
匹配HTML标记的正则表达式：/&lt;(.*)&gt;.*&lt;\/\1&gt;|&lt;(.*) \/&gt;/ <br />
匹配首尾空格的正则表达式：(^\s*)|(\s*$)<br />
应用：javascript中没有像vbscript那样的trim函数，我们就可以利用这个表达式来实现，如下：<br />
String.prototype.trim = function()<br />
{ return this.replace(/(^\s*)|(\s*$)/g, "");<br />
} 利用正则表达式分解和转换IP地址：<br />
下面是利用正则表达式匹配IP地址，并将IP地址转换成对应数值的Javascript程序：<br />
function IP2V(ip)<br />
{<br />
re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式<br />
if(re.test(ip))<br />
{<br />
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1<br />
}<br />
else<br />
{<br />
throw new Error("Not a valid IP address!")<br />
}<br />
}</p>
<p>不过上面的程序如果不用正则表达式，而直接用split函数来分解可能更简单，程序如下：</p>
<p>var ip="10.100.20.168"<br />
ip=ip.split(".")<br />
alert("IP值是："+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))</p>
<p>匹配Email地址的正则表达式：\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*</p>
<p>匹配网址URL的正则表达式：http://([\w-]+\.)+[\w-]+(/[\w- ./?%&amp;=]*)?</p>
<p>利用正则表达式限制网页表单里的文本框输入内容：</p>
<p>用正则表达式限制只能输入中文：onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" <br />
onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))" </p>
<p>用正则表达式限制只能输入全角字符： onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" <br />
onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"</p>
<p>用正则表达式限制只能输入数字：onkeyup="value=value.replace(/</p>
<p>[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"</p>
<p>用正则表达式限制只能输入数字和英文：onkeyup="value=value.replace(/<br />
[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" </p>
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/270865.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-05-15 16:06 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/05/15/270865.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java获取qq邮箱中的好友列表</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/05/07/269462.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Thu, 07 May 2009 09:54:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/05/07/269462.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/269462.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/05/07/269462.html#Feedback</comments><slash:comments>20</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/269462.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/269462.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先访问qq.mail.com 这个url分析html代码，发现，里面有很多加密的js，而且配合httpwatch工具发现，哇，靠，这个太复杂了。<br />
如果简单的使用java模拟浏览器 访问qq mail服务器获取 好友列表，实在是太困难了，个人能力有限实现不了，想了其他办法，创建了<br />
web项目，分析不了腾讯是怎么加密，但我可以作为一种代理，如图：<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/lsbwahaha/p2jpg.JPG" border="0" /><br />
&nbsp;&nbsp; 要采用上面的方式来获取好友，大致可以分为一下几个步骤：<br />
1.首先制作一个login.jsp页面，代码直接从腾讯邮件的登陆页面中复制过来，把页面交互的改成我们自己的服务器.<br />
&nbsp;&nbsp;&nbsp;&nbsp;(1)获取验证码的地址：<a href="http://ptlogin2.qq.com/getimage?aid=23000101">http://ptlogin2.qq.com/getimage?aid=23000101</a> 后面带个随机数，为了防止浏览器缓存。<br />
&nbsp;&nbsp;&nbsp;&nbsp;(2)当用户输入用户名 密码 和验证码，点登陆的时候，也让用户提交到我们的服务器来。<br />
2. 我这里写了一个servlet，该类是从qq邮件服务器中获取验证码的，如何获取呢？我采用的是<br />
httpclient4.0-beta2 包，该包是apache的 Apache HttpComponents project，是个开源的，具体使用和了解可以访问：<br />
<a href="http://hc.apache.org/httpcomponents-client/index.html">http://hc.apache.org/httpcomponents-client/index.html</a>，（该项目功能很强大）<br />
&nbsp;&nbsp;&nbsp; &nbsp; 在获取了验证码之后，qq服务器他在cookie中写了一个verifysession，当你点登陆的时候<br />
客户端校验需要。<br />
3. 把客户端提交过来的信息我们去请求qq服务器，这样就会登陆成功了，服务器会返回带sid的html代码，解析出来sid的值<br />
然后访问http://m11.mail.qq.com/cgi-bin/addr_listall?sid=" +sid+"&amp;sorttype=null&amp;category=common，就获取到qq中好友分组，以及每一个组的链接地址<br />
4.请求每一个链接 &nbsp;就可以得到每一组的好友了 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上面我只是写了实现的思路，有兴趣的可以跟我联系，具体代码可以分享 给大家 。。。&nbsp; qq：253041869<br />
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/269462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-05-07 17:54 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/05/07/269462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CSVReader的下载地址</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/05/04/268880.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Mon, 04 May 2009 12:04:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/05/04/268880.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/268880.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/05/04/268880.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/268880.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/268880.html</trackback:ping><description><![CDATA[目前最高版本： &nbsp; <a href="http://downloads.sourceforge.net/opencsv/opencsv-1.8-src-with-libs.tar.gz">http://downloads.sourceforge.net/opencsv/opencsv-1.8-src-with-libs.tar.gz</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; 开源的opencsv， 用来操作csv，这个还是不错的。&nbsp;&nbsp; 要看介绍还是去看官方的文档吧，下了，感觉还不错的~&nbsp; 一些使用的东东上面说的很清楚，我也懒的复制了，这个给自己标注下吧。。 hoho
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/268880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-05-04 20:04 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/05/04/268880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>servlet中获取（其他网站的）验证码，显示在自己页面上</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/04/23/267226.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Thu, 23 Apr 2009 12:38:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/04/23/267226.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/267226.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/04/23/267226.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/267226.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/267226.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有时候要获取其他网站的代码来实现模拟登陆，下面使用servlet来实现：程序代码如下：<br />
<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">String&nbsp;urlStr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">http://xxx.xxx.xx.xx</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL&nbsp;url&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;URL(urlStr);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URLConnection&nbsp;conn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;url.openConnection();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.connect();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;is&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;conn.getInputStream();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">得到输入的编码器，将文件流进行jpg格式编码</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JPEGImageDecoder&nbsp;decoder&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;JPEGCodec.createJPEGDecoder(is);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">得到编码后的图片对象</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedImage&nbsp;image&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;decoder.decodeAsBufferedImage();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">得到输出的编码器</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStream&nbsp;output&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;response.getOutputStream();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JPEGImageEncoder&nbsp;encoder&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;JPEGCodec.createJPEGEncoder(output);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encoder.encode(image);</span><span style="color: #008000">//</span><span style="color: #008000">对图片进行输出编码</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is.close();</span><span style="color: #008000">//</span><span style="color: #008000">关闭文件流</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output.close();</span></div>
&nbsp; 比较简单。。。。。hoho
 <img src ="http://www.blogjava.net/lsbwahaha/aggbug/267226.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-04-23 20:38 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/04/23/267226.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>String,StringBuffer,StringBuilder之间的区别，以及使用中该注意什么(转)</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/04/22/267038.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Wed, 22 Apr 2009 12:31:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/04/22/267038.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/267038.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/04/22/267038.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/267038.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/267038.html</trackback:ping><description><![CDATA[&#160;&#160; &#160;只是了解个大概，具体细节上不太清楚，这篇文章不错，基本上都讲清楚了。。。 嘿嘿，学习下。。。 &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;相信大家对 String 和 <span class="hilite3">StringBuffer</span>
的区别也已经很了解了，但是估计还是会有很多同志对这两个类的工作原理有些不清楚的地方，今天我在这里重新把这个概念给大家复习一下，顺便牵出 J2SE 5.0
里面带来的一个新的字符操作的类—— <span class="hilite1">StringBuilder</span>
（先别忙着扔我砖头，我还算清醒，我这里说的不是 C ＃， Java 也有 <span class="hilite1">StringBuilder</span>
类）。那么这个 <span class="hilite1">StringBuilder</span> 和 <span class="hilite3">StringBuffer</span> 以及我们最早遇见的 String
类有那些区别呢？在不同的场合下我们应该用哪个呢？我讲讲自己对这几个类的一点看法，也希望大家提出意见，每个人都有错的地方，在错了改的同时更是一个学习的好机会。
<br />
<br />
&#160;&#160;&#160; 简要的说， String 类型和 <span class="hilite3">StringBuffer</span>
类型的主要性能区别其实在于 String 是不可变的对象（为什么？问问 Java 的设计者吧，为什么 String 不是原生类型呢？）因此在每次对 String
类型进行改变的时候其实都等同于生成了一个新的 String 对象，然后将指针指向新的 String 对象，所以经常改变内容的字符串最好不要用 String
，因为每次生成对象都会对系统性能产生影响，特别当内存中无引用对象多了以后， JVM 的 GC
就会开始工作，那速度是一定会相当慢的。这里尝试举个不是很恰当的例子： <br />
<br />
String S1 = &#8220;abc&#8221;; <br />
For(int I = 0
; I &lt; 10000 ; I ++) // For 模拟程序的多次调用 <br />
{ <br />
S1 + = &#8220;def&#8221;; <br />
S1 = &#8220;abc&#8221;;
<br />
}<br />
<br />
&#160;&#160;&#160; 如果是这样的话，到这个 for 循环完毕后，如果内存中的对象没有被 GC 清理掉的话，内存中一共有 2
万多个了，惊人的数目，而如果这是一个很多人使用的系统，这样的数目就不算很多了，所以大家使用的时候一定要小心。 <br />
<br />
&#160;&#160;&#160; 而如果是使用 <span class="hilite3">StringBuffer</span> 类则结果就不一样了，每次结果都会对 <span class="hilite3">StringBuffer</span> 对象本身进行操作，而不是生成新的对象，再改变对象引用。所以在一般情况下我们推荐使用
<span class="hilite3">StringBuffer</span> ，特别是字符串对象经常改变的情况下。而在某些特别情况下， String
对象的字符串拼接其实是被 JVM 解释成了 <span class="hilite3">StringBuffer</span> 对象的拼接，所以这些时候
String 对象的速度并不会比 <span class="hilite3">StringBuffer</span> 对象慢，而特别是以下的字符串对象生成中，
String 效率是远要比 <span class="hilite3">StringBuffer</span> 快的： <br />
<br />
String S1 =
&#8220;This is only a&#8221; + &#8220; simple&#8221; + &#8220; test&#8221;; <br />
<span class="hilite3">StringBuffer</span> Sb = new <span class="hilite1">StringBuilder</span>(&#8220;This is only a&#8221;).append(&#8220; simple&#8221;).append(&#8220;
test&#8221;); <br />
<br />
&#160;&#160;&#160; 你会很惊讶的发现，生成 String S1 对象的速度简直太快了，而这个时候 <span class="hilite3">StringBuffer</span> 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏，在 JVM 眼里，这个
<br />
<br />
String S1 = &#8220;This is only a&#8221; + &#8220; simple&#8221; + &#8220;test&#8221;; 其实就是： String S1 =
&#8220;This is only a simple test&#8221;; 所以当然不需要太多的时间了。但大家这里要注意的是，如果你的字符串是来自另外的 String
对象的话，速度就没那么快了，譬如： <br />
<br />
String S2 = &#8220;This is only a&#8221;; <br />
String S3 = &#8220;
simple&#8221;; <br />
String S4 = &#8220; test&#8221;; <br />
String S1 = S2 +S3 + S4; <br />
<br />
&#160;&#160;&#160; 这时候
JVM 会规规矩矩的按照原来的方式去做， S1 对象的生成速度就不像刚才那么快了，一会儿我们可以来个测试作个验证。 <br />
<br />
&#160;&#160;&#160;
由此我们得到第一步结论： 在大部分情况下 <span class="hilite3">StringBuffer</span> > String
<br />
<br />
&#160;&#160;&#160; 而 <span class="hilite1">StringBuilder</span> 跟他们比又怎么样呢？先简单介绍一下， <span class="hilite1">StringBuilder</span> 是 JDK5.0 中新增加的一个类，它跟 <span class="hilite3">StringBuffer</span> 的区别看下面的介绍（来源 JavaWorld ）： <br />
<br />
&#160;&#160;&#160;
Java.lang.<span class="hilite3">StringBuffer</span> 线程安全的可变字符序列。类似于 String
的字符串缓冲区，但不能修改。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步，因此任意特定实例上的所有操作就好像是以串行顺序发生的，该顺序与所涉及的每个线程进行的方法调用顺序一致。
<br />
<br />
&#160;&#160;&#160;
每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量，就无需分配新的内部缓冲区数组。如果内部缓冲区溢出，则此容量自动增大。从
JDK 5.0 开始，为该类增添了一个单个线程使用的等价类，即 <span class="hilite1">StringBuilder</span>
。与该类相比，通常应该优先使用 <span class="hilite1">StringBuilder</span>
类，因为它支持所有相同的操作，但由于它不执行同步，所以速度更快。 <br />
<br />
&#160;&#160;&#160; 但是如果将 <span class="hilite1">StringBuilder</span> 的实例用于多个线程是不安全的。需要这样的同步，则建议使用 <span class="hilite3">StringBuffer</span> 。 <br />
<br />
&#160;&#160;&#160;
这样说估计大家都能明白他们之间的区别了，那么下面我们再做一个一般性推导： <br />
<br />
&#160;&#160;&#160; 在大部分情况下 <span class="hilite1">StringBuilder</span> > <span class="hilite3">StringBuffer</span>
<br />
<br />
&#160;&#160;&#160; 因此，根据这个不等式的传递定理： 在大部分情况下 <span class="hilite1">StringBuilder</span>
> <span class="hilite3">StringBuffer</span> > String <br />
<br />
&#160;&#160;&#160;
既然有这样的推导结果了，我们做个测试验证一下： <br />
<br />
&#160;&#160;&#160; 测试代码如下： <br />
<br />
public class testssb {
<br />
<br />
/** Creates a new instance of testssb */ <br />
final static int ttime =
10000;// 测试循环次数 <br />
public testssb() { <br />
} <br />
<br />
public void test(String s){
<br />
long begin = System.currentTimeMillis(); <br />
for(int i=0;i&lt;ttime;i++){
<br />
s += "add"; <br />
}<br />
long over = System.currentTimeMillis();
<br />
System.out.println(" 操作 "+s.getClass().getName()+" 类型使用的时间为： " + (over -
begin) + " 毫秒 " ); <br />
} <br />
<br />
public void test(<span class="hilite3">StringBuffer</span> s){ <br />
long begin =
System.currentTimeMillis(); <br />
for(int i=0;i&lt;ttime;i++){
<br />
s.append("add"); <br />
} <br />
long over = System.currentTimeMillis();
<br />
System.out.println(" 操作 "+s.getClass().getName()+" 类型使用的时间为： " + (over -
begin) + " 毫秒 " ); <br />
} <br />
<br />
public void test(<span class="hilite1">StringBuilder</span> s){ <br />
long begin =
System.currentTimeMillis(); <br />
for(int i=0;i&lt;ttime;i++){
<br />
s.append("add"); <br />
} <br />
long over = System.currentTimeMillis();
<br />
System.out.println(" 操作 "+s.getClass().getName()+" 类型使用的时间为： " + (over -
begin) + " 毫秒 " ); <br />
} <br />
<br />
// 对 String 直接进行字符串拼接的测试 <br />
public void
test2(){ <br />
String s2 = "abadf"; <br />
long begin = System.currentTimeMillis();
<br />
for(int i=0;i&lt;ttime;i++){ <br />
String s = s2 + s2 + s2 ; <br />
} <br />
long
over = System.currentTimeMillis(); <br />
System.out.println(" 操作字符串对象引用相加类型使用的时间为：
" + (over - begin) + " 毫秒 " ); <br />
} <br />
<br />
public void test3(){ <br />
long begin
= System.currentTimeMillis(); <br />
for(int i=0;i&lt;ttime;i++){ <br />
String s =
"abadf" + "abadf" + "abadf" ; <br />
} <br />
long over = System.currentTimeMillis();
<br />
System.out.println(" 操作字符串相加使用的时间为： "+ (over - begin) + " 毫秒 " ); <br />
}
<br />
<br />
public static void main(String[] args){ <br />
String s1 ="abc"; <br />
<span class="hilite3">StringBuffer</span> sb1 = new <span class="hilite3">StringBuffer</span>("abc"); <br />
<span class="hilite1">StringBuilder</span> sb2 = new <span class="hilite1">StringBuilder</span>("abc"); <br />
<br />
testssb t = new testssb();
<br />
t.test(s1); <br />
t.test(sb1);<br />
t.test(sb2); <br />
t.test2(); <br />
t.test3();
<br />
} <br />
} <br />
<br />
&#160;&#160;&#160; 以上代码在 NetBeans 5.0 IDE/JDK1.6 上编译通过,循环次数 ttime 为 10000
次的测试结果如下： <br />
操作 java.lang.String 类型使用的时间为： 4392 毫秒 <br />
操作 java.lang.<span class="hilite3">StringBuffer</span> 类型使用的时间为： 0 毫秒 <br />
操作 java.lang.<span class="hilite1">StringBuilder</span> 类型使用的时间为： 0 毫秒 <br />
操作字符串对象引用相加类型使用的时间为： 15 毫秒
<br />
操作字符串相加使用的时间为： 0 毫秒 <br />
<br />
&#160;&#160;&#160; 好像还看不出 <span class="hilite3">StringBuffer</span> 和 <span class="hilite1">StringBuilder</span>
的区别，把 ttime 加到 30000 次看看： <br />
操作 java.lang.String 类型使用的时间为： 53444 毫秒 <br />
操作
java.lang.<span class="hilite3">StringBuffer</span> 类型使用的时间为： 15 毫秒 <br />
操作
java.lang.<span class="hilite1">StringBuilder</span> 类型使用的时间为： 15 毫秒
<br />
操作字符串对象引用相加类型使用的时间为： 31 毫秒 <br />
操作字符串相加使用的时间为： 0 毫秒 <br />
<br />
&#160;&#160;&#160; <span class="hilite3">StringBuffer</span> 和 <span class="hilite1">StringBuilder</span>
的性能上还是没有太大的差异，再加大到 100000 看看，这里就不加入对 String 类型的测试了，因为对 String 类型这么大数据量的测试会很慢滴&#8230;&#8230;
<br />
操作 java.lang.<span class="hilite3">StringBuffer</span> 类型使用的时间为： 31 毫秒 <br />
操作
java.lang.<span class="hilite1">StringBuilder</span> 类型使用的时间为： 16 毫秒 <br />
<br />
&#160;&#160;&#160;
能看出差别了，但其中有多次的测试结果居然是 <span class="hilite3">StringBuffer</span> 比 <span class="hilite1">StringBuilder</span> 快，再加大一些到 1000000 看看（应该不会当机吧？）： <br />
操作
java.lang.<span class="hilite3">StringBuffer</span> 类型使用的时间为： 265 毫秒 <br />
操作
java.lang.<span class="hilite1">StringBuilder</span> 类型使用的时间为： 219 毫秒 <br />
<br />
&#160;&#160;&#160;
有些少区别了，而且结果很稳定，再大点看看， ttime = 5000000 ： <br />
<br />
&#183;&#183;&#183;&#183;&#183;&#183; Exception in thread
"main" java.lang.OutOfMemoryError: Java heap space &#183;&#183;&#183;&#183;&#183;&#183; <br />
<br />
&#160;&#160;&#160;
呵呵，算了，不去测试了，基本来说都是在性能上都是 <span class="hilite1">StringBuilder</span> > <span class="hilite3">StringBuffer</span> > String 的了。&#160;<br />
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/267038.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-04-22 20:31 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/04/22/267038.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>for循环 while do while 中的一个小bug</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/04/19/266423.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Sun, 19 Apr 2009 07:05:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/04/19/266423.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/266423.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/04/19/266423.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/266423.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/266423.html</trackback:ping><description><![CDATA[如下程序会输出什么?
<div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> Creator {<br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> main(String[] args) {<br />
</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">100</span><span style="color: #000000; ">;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br />
Creature creature </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Creature();<br />
<br />
System.out.println(Creature.numCreated());<br />
}<br />
}<br />
<br />
</span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> Creature{<br />
</span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">long</span><span style="color: #000000; "> numCreated </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />
<br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> Creature(){<br />
numCreated</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />
}<br />
<br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">long</span><span style="color: #000000; "> numCreated(){<br />
</span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> numCreated;<br />
}<br />
}</span></div>
</div>
编译的时候发现：上面的程序在<span style="font-size: 13px; "><span style="color: #000000; ">Creature creature </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000ff; ">new</span><span style="color: #000000; "> Creature(); 发现语法错误，这个为什么呢？？？，觉得很奇怪啊，<br />
原来java语言规范不允许一个额本地变量声明语句作为一条语句在for，while，或do循环中重复执行。<strong><span style="color: red; "> 一个本地变量声明作为一条语句只能直接出现在一个语句块中。</span></strong></span></span>
<div><font size="3"><span style="font-size: 13px; ">针对上面的程序：可以有几种方式来修改，<span style="color: #000000; ">Creature creature </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000ff; ">new</span><span style="color: #000000; "> Creature();改成 <span style="color: #0000ff; ">new</span><span style="color: #000000; "> Creature(); 也可以改成<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">{<br />
Creature creature </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> Creature();<br />
}</span></div>
</span></span></span></font></div>
等等。。。。。。。。。。。。。。。。。。。。。
<div><br />
</div>
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/266423.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-04-19 15:05 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/04/19/266423.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>又是一个hello world</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/04/19/266385.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Sun, 19 Apr 2009 03:22:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/04/19/266385.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/266385.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/04/19/266385.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/266385.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/266385.html</trackback:ping><description><![CDATA[&#160;&#160;简单的hello world hoho：
<div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&#160;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&#160;Null&#160;{<br />
&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&#160;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&#160;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&#160;greet(){<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">hello&#160;world!</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&#160;&#160;&#160;&#160;}<br />
&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&#160;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&#160;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&#160;main(String[]&#160;args)&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;((Null)</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">).greet();<br />
&#160;&#160;&#160;&#160;}<br />
}</span></div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; ">程序运行结果： hello world！&#160;</div>
</div>
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/266385.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-04-19 11:22 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/04/19/266385.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>静态数据初始化 你 真的了解了吗？构造方法的初始之后。。我又做错了，太粗心了</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/04/15/265832.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Wed, 15 Apr 2009 11:28:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/04/15/265832.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/265832.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/04/15/265832.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/265832.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/265832.html</trackback:ping><description><![CDATA[&#160; 下面的程序输出什么呢?&#160; 考虑下哦。。。。<br />
<br />
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left-color: #cccccc; width: 98%; word-break: break-all; padding-top: 4px; background-color: #eeeeee; "><img id="Codehighlighter1_18_365_Open_Image" onclick="this.style.display='none'; Codehighlighter1_18_365_Open_Text.style.display='none'; Codehighlighter1_18_365_Closed_Image.style.display='inline'; Codehighlighter1_18_365_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_18_365_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_18_365_Closed_Text.style.display='none'; Codehighlighter1_18_365_Open_Image.style.display='inline'; Codehighlighter1_18_365_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">class</span><span style="color: #000000">&#160;Test&#160;</span><span id="Codehighlighter1_18_365_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_18_365_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" alt="" />&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">static</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">final</span><span style="color: #000000">&#160;Test&#160;TEST&#160;</span><span style="color: #000000">=</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">new</span><span style="color: #000000">&#160;Test();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" alt="" />&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">private</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">final</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">int</span><span style="color: #000000">&#160;belt;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" alt="" />&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">private</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">static</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">final</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">int</span><span style="color: #000000">&#160;CURRENT_YEAR&#160;</span><span style="color: #000000">=</span><span style="color: #000000">&#160;Calendar.getInstance().get(Calendar.YEAR);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" alt="" />&#160;&#160;&#160;&#160;<br />
<img id="Codehighlighter1_190_223_Open_Image" onclick="this.style.display='none'; Codehighlighter1_190_223_Open_Text.style.display='none'; Codehighlighter1_190_223_Closed_Image.style.display='inline'; Codehighlighter1_190_223_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_190_223_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_190_223_Closed_Text.style.display='none'; Codehighlighter1_190_223_Open_Image.style.display='inline'; Codehighlighter1_190_223_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;Test()</span><span id="Codehighlighter1_190_223_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_190_223_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" alt="" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;belt&#160;</span><span style="color: #000000">=</span><span style="color: #000000">&#160;CURRENT_YEAR&#160;</span><span style="color: #000000">-</span><span style="color: #000000">&#160;</span><span style="color: #000000">1930</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&#160;&#160;&#160;&#160;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_246_264_Open_Image" onclick="this.style.display='none'; Codehighlighter1_246_264_Open_Text.style.display='none'; Codehighlighter1_246_264_Closed_Image.style.display='inline'; Codehighlighter1_246_264_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_246_264_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_246_264_Closed_Text.style.display='none'; Codehighlighter1_246_264_Open_Image.style.display='inline'; Codehighlighter1_246_264_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">int</span><span style="color: #000000">&#160;getBelt()</span><span id="Codehighlighter1_246_264_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_246_264_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" alt="" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">return</span><span style="color: #000000">&#160;belt;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&#160;&#160;&#160;&#160;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_322_363_Open_Image" onclick="this.style.display='none'; Codehighlighter1_322_363_Open_Text.style.display='none'; Codehighlighter1_322_363_Closed_Image.style.display='inline'; Codehighlighter1_322_363_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_322_363_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_322_363_Closed_Text.style.display='none'; Codehighlighter1_322_363_Open_Image.style.display='inline'; Codehighlighter1_322_363_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">static</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">void</span><span style="color: #000000">&#160;main(String&#160;[]args)&#160;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&#160;Exception</span><span id="Codehighlighter1_322_363_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_322_363_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" alt="" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;System.out.println(TEST.getBelt());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&#160;&#160;&#160;&#160;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span></div>
<br />
可能你觉得应该是当前年- 1930, 例如：今年是2009，2009-1930= 79，运行结果真的是这样吗？<br />
你运行下，额，奇怪，居然是 -1930,&#160; 额，为什么呢？？<br />
<br />
&#160; 原来 首先其静态域 被设置为缺省值， TEST先设置为null， belt设置为0 ， 然后TEST构造器计算出来，但我们已经初始化belt了，<br />
belt被设置为final， 所以忽略了。。。&#160;
<div>再来看下 下面一个简单的例子，刚开始做的时候不仔细，哎，， 我错了。。哎~！~ 希望大家不要跟我一样啊。</div>
<div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">&#160;1</span>&#160;<span style="color: #0000FF; ">class</span><span style="color: #000000; ">&#160;Point&#160;{<br />
</span><span style="color: #008080; ">&#160;2</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">protected</span><span style="color: #000000; ">&#160;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&#160;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&#160;x,&#160;y;<br />
</span><span style="color: #008080; ">&#160;3</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&#160;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&#160;String&#160;name;<br />
</span><span style="color: #008080; ">&#160;4</span>&#160;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">&#160;5</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;Point(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&#160;x,&#160;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&#160;y)&#160;{<br />
</span><span style="color: #008080; ">&#160;6</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.x&#160;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&#160;x;<br />
</span><span style="color: #008080; ">&#160;7</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.y&#160;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&#160;y;<br />
</span><span style="color: #008080; ">&#160;8</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;name&#160;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&#160;makeName();<br />
</span><span style="color: #008080; ">&#160;9</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;}<br />
</span><span style="color: #008080; ">10</span>&#160;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">11</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">protected</span><span style="color: #000000; ">&#160;String&#160;makeName()&#160;{<br />
</span><span style="color: #008080; ">12</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&#160;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&#160;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&#160;x&#160;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&#160;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&#160;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&#160;y&#160;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&#160;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">13</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;}<br />
</span><span style="color: #008080; ">14</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;<br />
</span><span style="color: #008080; ">15</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&#160;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&#160;String&#160;toString(){<br />
</span><span style="color: #008080; ">16</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&#160;name;<br />
</span><span style="color: #008080; ">17</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;}<br />
</span><span style="color: #008080; ">18</span>&#160;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">19</span>&#160;<span style="color: #000000; ">}<br />
</span><span style="color: #008080; ">20</span>&#160;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">21</span>&#160;<span style="color: #0000FF; ">public</span><span style="color: #000000; ">&#160;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&#160;ColorPoint&#160;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&#160;Point&#160;{<br />
</span><span style="color: #008080; ">22</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&#160;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&#160;String&#160;color;<br />
</span><span style="color: #008080; ">23</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;<br />
</span><span style="color: #008080; ">24</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;ColorPoint(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&#160;x,&#160;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&#160;y,&#160;String&#160;color){<br />
</span><span style="color: #008080; ">25</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">super</span><span style="color: #000000; ">(x,y);<br />
</span><span style="color: #008080; ">26</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.color&#160;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&#160;color;<br />
</span><span style="color: #008080; ">27</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;}<br />
</span><span style="color: #008080; ">28</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">protected</span><span style="color: #000000; ">&#160;String&#160;makeName()&#160;{<br />
</span><span style="color: #008080; ">29</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&#160;</span><span style="color: #0000FF; ">super</span><span style="color: #000000; ">.makeName()</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">color;<br />
</span><span style="color: #008080; ">30</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;}<br />
</span><span style="color: #008080; ">31</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;<br />
</span><span style="color: #008080; ">32</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&#160;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&#160;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&#160;main(String[]&#160;args)&#160;{<br />
</span><span style="color: #008080; ">33</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;System.out.println(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&#160;ColorPoint(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">abc</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br />
</span><span style="color: #008080; ">34</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;}<br />
</span><span style="color: #008080; ">35</span>&#160;<span style="color: #000000; ">&#160;&#160;&#160;&#160;<br />
</span><span style="color: #008080; ">36</span>&#160;<span style="color: #000000; ">}</span></div>
</div>
<div><br />
运行结果： &#160;[1,2]:null</div>
<div>程序从main启动，然后到 25行，<span  style="font-size: 13px; "><span style="color: #0000ff; ">super</span><span style="color: #000000; ">(x,y); &#160; 之后 到 第 8行&#160;</span></span><span  style="font-size: 13px; "><span style="color: #000000; ">&#160;&#160;name&#160;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&#160;makeName(); &#160;再之后29行，&#160;</span></span><span  style="font-size: 13px; "><span style="color: #0000ff; ">return</span><span style="color: #000000; ">&#160;</span><span style="color: #0000ff; ">super</span><span style="color: #000000; ">.makeName()</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">color;</span></span><br />
这里，方法被子类重载了，运行到26行&#160;<span  style="font-size: 13px; "><span style="color: #000000; ">&#160;</span><span style="color: #0000ff; ">this</span><span style="color: #000000; ">.color&#160;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&#160;color; &#160;最后结束， 当然输出：</span></span>&#160;[1,2]:null &#160;<br />
<br />
</div>
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/265832.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-04-15 19:28 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/04/15/265832.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在继承中的 静态方法调用注意</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/04/15/265828.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Wed, 15 Apr 2009 11:15:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/04/15/265828.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/265828.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/04/15/265828.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/265828.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/265828.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;<br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;在继承中的 使用静态方法的时候该注意。。。。。<br />
&nbsp;&nbsp; 你觉得下面程序很简单吧，打印出什么呢? 没看仔细要错的哦~！~<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_9_76_Open_Image" onclick="this.style.display='none'; Codehighlighter1_9_76_Open_Text.style.display='none'; Codehighlighter1_9_76_Closed_Image.style.display='inline'; Codehighlighter1_9_76_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_9_76_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_9_76_Closed_Text.style.display='none'; Codehighlighter1_9_76_Open_Image.style.display='inline'; Codehighlighter1_9_76_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Dog</span><span id="Codehighlighter1_9_76_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_9_76_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_37_74_Open_Image" onclick="this.style.display='none'; Codehighlighter1_37_74_Open_Text.style.display='none'; Codehighlighter1_37_74_Closed_Image.style.display='inline'; Codehighlighter1_37_74_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_37_74_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_37_74_Closed_Text.style.display='none'; Codehighlighter1_37_74_Open_Image.style.display='inline'; Codehighlighter1_37_74_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;bark()</span><span id="Codehighlighter1_37_74_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_37_74_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Dog&nbsp;bark</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_104_140_Open_Image" onclick="this.style.display='none'; Codehighlighter1_104_140_Open_Text.style.display='none'; Codehighlighter1_104_140_Closed_Image.style.display='inline'; Codehighlighter1_104_140_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_104_140_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_104_140_Closed_Text.style.display='none'; Codehighlighter1_104_140_Open_Image.style.display='inline'; Codehighlighter1_104_140_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Basenji&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Dog</span><span id="Codehighlighter1_104_140_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_104_140_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_132_138_Open_Image" onclick="this.style.display='none'; Codehighlighter1_132_138_Open_Text.style.display='none'; Codehighlighter1_132_138_Closed_Image.style.display='inline'; Codehighlighter1_132_138_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_132_138_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_132_138_Closed_Text.style.display='none'; Codehighlighter1_132_138_Open_Image.style.display='inline'; Codehighlighter1_132_138_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;bark()</span><span id="Codehighlighter1_132_138_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_132_138_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_161_313_Open_Image" onclick="this.style.display='none'; Codehighlighter1_161_313_Open_Text.style.display='none'; Codehighlighter1_161_313_Closed_Image.style.display='inline'; Codehighlighter1_161_313_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_161_313_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_161_313_Closed_Text.style.display='none'; Codehighlighter1_161_313_Open_Image.style.display='inline'; Codehighlighter1_161_313_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Test&nbsp;</span><span id="Codehighlighter1_161_313_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_161_313_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_219_311_Open_Image" onclick="this.style.display='none'; Codehighlighter1_219_311_Open_Text.style.display='none'; Codehighlighter1_219_311_Closed_Image.style.display='inline'; Codehighlighter1_219_311_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_219_311_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_219_311_Closed_Text.style.display='none'; Codehighlighter1_219_311_Open_Image.style.display='inline'; Codehighlighter1_219_311_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String&nbsp;[]args)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception</span><span id="Codehighlighter1_219_311_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_219_311_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dog&nbsp;dog&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Dog();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dog&nbsp;basenji&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Basenji();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dog.bark();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;basenji.bark();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
<br />
程序运行结果：<br />
Dog bark<br />
Dog bark<br />
<br />
打印出2个Dog bark，额，原来<span style="color: red"><strong>对静态方法的调用不存在任何动态的分派机制。</strong><span style="color: #000000">这个没有注意很容易搞错的哦~！！~<br />
</span></span>
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/265828.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-04-15 19:15 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/04/15/265828.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>求：2个数的最小公倍数和 最大公约数</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/04/12/265117.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Sun, 12 Apr 2009 07:03:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/04/12/265117.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/265117.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/04/12/265117.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/265117.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/265117.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;简单程序：求2个数的最小公倍数 和 最大公约数<br />
<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000"><br />
<img id="Codehighlighter1_16_637_Open_Image" onclick="this.style.display='none'; Codehighlighter1_16_637_Open_Text.style.display='none'; Codehighlighter1_16_637_Closed_Image.style.display='inline'; Codehighlighter1_16_637_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_16_637_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_16_637_Closed_Text.style.display='none'; Codehighlighter1_16_637_Open_Image.style.display='inline'; Codehighlighter1_16_637_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;T&nbsp;</span><span id="Codehighlighter1_16_637_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_16_637_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_58_231_Open_Image" onclick="this.style.display='none'; Codehighlighter1_58_231_Open_Text.style.display='none'; Codehighlighter1_58_231_Closed_Image.style.display='inline'; Codehighlighter1_58_231_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_58_231_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_58_231_Closed_Text.style.display='none'; Codehighlighter1_58_231_Open_Image.style.display='inline'; Codehighlighter1_58_231_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_58_231_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_58_231_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;m,&nbsp;n;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">32</span><span style="color: #000000">&nbsp;;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">48</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(m</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">和</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">n</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">的</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">最大公约数是：</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;getGongYue(m,n));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">最小公倍数是：</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;getGongBei(m,n));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_236_299_Open_Image" onclick="this.style.display='none'; Codehighlighter1_236_299_Open_Text.style.display='none'; Codehighlighter1_236_299_Closed_Image.style.display='inline'; Codehighlighter1_236_299_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_236_299_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_236_299_Closed_Text.style.display='none'; Codehighlighter1_236_299_Open_Image.style.display='inline'; Codehighlighter1_236_299_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_236_299_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_236_299_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;得到&nbsp;m,n&nbsp;的最大公约数<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;m<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;n<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_344_489_Open_Image" onclick="this.style.display='none'; Codehighlighter1_344_489_Open_Text.style.display='none'; Codehighlighter1_344_489_Closed_Image.style.display='inline'; Codehighlighter1_344_489_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_344_489_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_344_489_Closed_Text.style.display='none'; Codehighlighter1_344_489_Open_Image.style.display='inline'; Codehighlighter1_344_489_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getGongYue(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;m,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n)</span><span id="Codehighlighter1_344_489_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_344_489_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;r;<br />
<img id="Codehighlighter1_361_458_Open_Image" onclick="this.style.display='none'; Codehighlighter1_361_458_Open_Text.style.display='none'; Codehighlighter1_361_458_Closed_Image.style.display='inline'; Codehighlighter1_361_458_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_361_458_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_361_458_Closed_Text.style.display='none'; Codehighlighter1_361_458_Open_Image.style.display='inline'; Codehighlighter1_361_458_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_361_458_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_361_458_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_377_419_Open_Image" onclick="this.style.display='none'; Codehighlighter1_377_419_Open_Text.style.display='none'; Codehighlighter1_377_419_Closed_Image.style.display='inline'; Codehighlighter1_377_419_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_377_419_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_377_419_Closed_Text.style.display='none'; Codehighlighter1_377_419_Open_Image.style.display='inline'; Codehighlighter1_377_419_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(m&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;n)&nbsp;</span><span id="Codehighlighter1_377_419_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_377_419_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;t&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;n;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;t;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">&nbsp;n;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;n;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;r;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(r&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;m;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_494_557_Open_Image" onclick="this.style.display='none'; Codehighlighter1_494_557_Open_Text.style.display='none'; Codehighlighter1_494_557_Closed_Image.style.display='inline'; Codehighlighter1_494_557_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_494_557_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_494_557_Closed_Text.style.display='none'; Codehighlighter1_494_557_Open_Image.style.display='inline'; Codehighlighter1_494_557_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_494_557_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_494_557_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;得到&nbsp;m,n&nbsp;的最小公倍数<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;m<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;n<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_602_635_Open_Image" onclick="this.style.display='none'; Codehighlighter1_602_635_Open_Text.style.display='none'; Codehighlighter1_602_635_Closed_Image.style.display='inline'; Codehighlighter1_602_635_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_602_635_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_602_635_Closed_Text.style.display='none'; Codehighlighter1_602_635_Open_Image.style.display='inline'; Codehighlighter1_602_635_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;getGongBei(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;m,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n)</span><span id="Codehighlighter1_602_635_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_602_635_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;m</span><span style="color: #000000">*</span><span style="color: #000000">n</span><span style="color: #000000">/</span><span style="color: #000000">getGongYue(m,n);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/265117.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-04-12 15:03 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/04/12/265117.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据结构—算法介绍(转)</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/04/12/265115.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Sun, 12 Apr 2009 06:37:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/04/12/265115.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/265115.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/04/12/265115.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/265115.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/265115.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; 算法(Algorithm)是一系列解决问题的清晰指令，也就是说，能够对一定规范的输入，在有限时间内获得所要求的输出。如果一个算法有缺陷，或不适合于某个问题，执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。 <br />
<p>　　算法可以理解为有基本运算及规定的运算顺序所构成的完整的解题步骤。或者看成按照要求设计好的有限的确切的计算序列，并且这样的步<br />
骤和序列可以解决一类问题。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 一个算法应该具有以下五个重要的特征：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、有穷性： 一个算法必须保证执行有限步之后结束; </p>
<p>　　2、确切性： 算法的每一步骤必须有确切的定义;</p>
<p>　　3、输入：一个算法有0个或多个输入，以刻画运算对象的初始情况，所谓0个输入是指算法本身定除了初始条件;</p>
<p>　　4、输出：一个算法有一个或多个输出，以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;</p>
<p>　　5、可行性： 算法原则上能够精确地运行，而且人们用笔和纸做有限次运算后即可完成。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;计算机科学家尼克劳斯-沃思曾著过一本著名的书《数据结构+算法=程序》，可见算法在计算机科学界与计算机应用界的地位。<br />
</p>
<p><br />
<strong>算法的复杂度</strong> </p>
<p>　　同一问题可用不同算法解决，而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑。</p>
<p>　　时间复杂度</p>
<p>　　算法的时间复杂度是指算法需要消耗的时间资源。一般来说，计算机算法是问题规模n 的函数f(n)，算法的时间复杂度也因此记做</p>
<p>　　T(n)=&#927;(f(n))</p>
<p>　　因此，问题的规模n 越大，算法执行的时间的增长率与f(n) 的增长率正相关，称作渐进时间复杂度(Asymptotic Time Complexity)。</p>
<p>　　空间复杂度</p>
<p>　　算法的空间复杂度是指算法需要消耗的空间资源。其计算和表示方法与时间复杂度类似，一般都用复杂度的渐近性来表示。同时间复杂度相比，空间复杂度的分析要简单得多。</p>
<p><strong>算法设计与分析的基本方法</strong> </p>
<p>　　1.递推法</p>
<p>　　递推法是利用问题本身所具有的一种递推关系求问题解的一种方法。它把问题分成若干步，找出相邻几步的关系，从而达到目的，此方法称为递推法。</p>
<p>　　2.递归</p>
<p>　　递归指的是一个过程：函数不断引用自身，直到引用的对象已知</p>
<p>　　3.穷举搜索法</p>
<p>　　穷举搜索法是对可能是解的众多候选解按某种顺序进行逐一枚举和检验，并从众找出那些符合要求的候选解作为问题的解。</p>
<p>　　4.贪婪法</p>
<p>　　贪婪法是一种不追求最优解，只希望得到较为满意解的方法。贪婪法一般可以快速得到满意的解，因为它省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪婪法常以当前情况为基础作最优选择，而不考虑各种可能的整体情况，所以贪婪法不要回溯。</p>
<p>　　5.分治法</p>
<p>　　把一个复杂的问题分成两个或更多的相同或相似的子问题，再把子问题分成更小的子问题&#8230;&#8230;直到最后子问题可以简单的直接求解，原问题的解即子问题的解的合并。</p>
<p>　　6.动态规划法</p>
<p>　　动态规划是一种在数学和计算机科学中使用的，用于求解包含重叠子问题的最优化问题的方法。其基本思想是，将原问题分解为相似的子问题，在求解的过程中通过子问题的解求出原问题的解。动态规划的思想是多种算法的基础，被广泛应用于计算机科学和工程领域。</p>
<p>　　7.迭代法</p>
<p>　　迭代是数值分析中通过从一个初始估计出发寻找一系列近似解来解决问题(一般是解方程或者方程组)的过程，为实现这一过程所使用的方法统称为迭代法。<br />
</p>
<p><strong><br />
&nbsp;&nbsp; 算法分类</strong> </p>
<p>　　算法可大致分为基本算法、数据结构的算法、数论与代数算法、计算几何的算法、图论的算法、动态规划以及数值分析、<a href="http://www.miiceic.org.cn/phrase/200801081050021.html" target="_new">加密</a>算法、排序算法、检索算法、随机化算法、并行算法。<br />
</p>
<p><br />
<br />
<br />
<br />
&nbsp;</p>
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/265115.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-04-12 14:37 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/04/12/265115.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java数据结构学习—数据结构的基本概念(转)</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/04/12/265113.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Sun, 12 Apr 2009 06:22:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/04/12/265113.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/265113.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/04/12/265113.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/265113.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/265113.html</trackback:ping><description><![CDATA[<p style="text-indent: 2em">数据结构的基本概念</p>
<p style="text-indent: 2em"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据：</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据（data）是描述客观事物的数字、字符以及所有能够输入到计算机中并能被计算机接受的各种符号集合的统称。数据是信息的符号表示，是计算机程序的处理对象。除了数值数据，计算机能够处理的数据还可以是各种非数值数据，如字符串、图形、音频、视频等多媒体数据。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示一个事物的一组数据称为一个数据元素（data element）：数据元素是数据的基本单位。一个数据元素可以是一个不可分割的原子项，也可以由多个数据项组成。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据项（data item）是数据元素中有独立含义的、不可分割的最小标识单位。例如，一个整数、一个字符都是原子项；一个学生数据元素包含学号、姓名、性别和出生日期等多个数据项组成。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p style="text-indent: 2em">数据类型：</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型（type）是具有相同逻辑意义的一组值的集合。数据类型（data type）是指一个类型和定义在这个类型上的操作集合。数据类型定义了数据的性质、取值范围以及对数据所能进行的各种操作。例如，Java语言的整数类型int，除了数值集合[-231，...，-2，-1，0，1，2，...，231-1]之外，还包括在这个值集合上的操作集合[+，-，*，/，%，=]。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 程序中的每一个数据都属于一个数据类型，决定了数据的类型也就决定了数据的性质以及对数据进行的运算和操作，同时数据也受到类型的保护，确保数据不能进行非法操作。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 高级程序涉及语言通常预定一些基本数据类型和构造数据类型。基本数据类型的值是不可分解的，它可直接参与该类型所允许的运算。构造数据类型是使用已有的简单数据类型和已定义的构造数据类型按照一定的语法规则组织起来的较复杂的数据类型。构造数据类型的变量包含多个数据项。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java语言的基本数据类型有整数类型、浮点数类型、字符类型、布尔类型，构造数据类型（引用类型）有数组、类和接口。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">数据结构</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 计算机处理的数据不是杂乱无章的，而是有着内在联系的。只有分析清楚它们的内在联系，对大量的、复杂的数据才能进行复核的组织和有效处理。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据结构是指元素之间存在的关系。一个数据结构（data structure）是由n（n&#8805;0）个数据元素组成的有限集合，数据元素之间具有某种特定的关系。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据结构概念包括三方向：数据的逻辑结构</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据的存储结构</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据的操作</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据结构与数据类型两个概念的侧重点不同。数据类型研究的是每种数据所具有的特性，以及对这种特性的数据能够进行哪些操作；数据结构研究的是数据元素之间具有的相互关系，数据结构与数据元素的数据类型无关，也不随数据元素值的变化而变化。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">抽象数据类型</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 程序设计语言使用数据类型描述数据特性，采取&#8220;表示与实现分离&#8221;的策略。语言本身仅提供数据类型的语法规则，并没有说明这些数据类型是如何实现的；程序员按照这些规则使用数据类型，而不必知道这些数据类型是如何实现的。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 抽象数据类型（Abstract Data type，ADT）指一个数学模型以及定义在该模型上的一组操作。抽象数据类型和数据类型本质上是一个概念，它的最重要特征是将一个类型上的数据及操作的逻辑含义与具体实现分离</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与使用数据类型描述数据特性一样，通常使用抽象数据类型描述数据结构，将线性表、树、图等数据结构分别定义为抽象数据类型，每种抽象数据类型描述一种数据结构的逻辑特性和操作，与该数据结构在计算机内的存储及实现无关。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 抽象数据类型是软件模块化设计思想的重要手段。一个抽象数据类型是描述一种特定功能软件的基本模块，由各种基本模块可组织和构造起来一个庞大的软件系统。</p>
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/265113.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-04-12 14:22 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/04/12/265113.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java解惑——循环，你真的会吗？？</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/04/07/264356.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Tue, 07 Apr 2009 14:49:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/04/07/264356.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/264356.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/04/07/264356.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/264356.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/264356.html</trackback:ping><description><![CDATA[<p>使用StringBuffer时应该注意的：<br />
&nbsp; StringBuffer sb = new StringBuffer('M');<br />
&nbsp;&nbsp;sb.append("abc");<br />
&nbsp;&nbsp;System.out.println(sb.toString());</p>
<p>&nbsp;&nbsp; 该程序会输出什么呢？&nbsp;&nbsp; 不是 mabc&nbsp;&nbsp; 输入结果为： abc<br />
&nbsp;&nbsp; 为什么m没有输出来呢？奇怪了？ 其实也不是很奇怪，StringBuffer没有字符为参数的构造方法，只有int作为缓冲区初始容量的构造器。<br />
在本例子中， new StringBuffer('M') 返回的是一个具有初始容量77的空字符串缓冲区。</p>
<p><br />
**2******************************************************************************************************************</p>
<p>&nbsp;</p>
<p>下面的程序循环遍历byte数值，以查找某个特定值。这个程序会打印出什么？<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_24_185_Open_Image" onclick="this.style.display='none'; Codehighlighter1_24_185_Open_Text.style.display='none'; Codehighlighter1_24_185_Closed_Image.style.display='inline'; Codehighlighter1_24_185_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_24_185_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_24_185_Closed_Text.style.display='none'; Codehighlighter1_24_185_Open_Image.style.display='inline'; Codehighlighter1_24_185_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;BigDelight&nbsp;</span><span id="Codehighlighter1_24_185_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_24_185_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_66_183_Open_Image" onclick="this.style.display='none'; Codehighlighter1_66_183_Open_Text.style.display='none'; Codehighlighter1_66_183_Closed_Image.style.display='inline'; Codehighlighter1_66_183_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_66_183_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_66_183_Closed_Text.style.display='none'; Codehighlighter1_66_183_Open_Image.style.display='inline'; Codehighlighter1_66_183_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_66_183_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_66_183_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_125_180_Open_Image" onclick="this.style.display='none'; Codehighlighter1_125_180_Open_Text.style.display='none'; Codehighlighter1_125_180_Closed_Image.style.display='inline'; Codehighlighter1_125_180_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_125_180_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_125_180_Closed_Text.style.display='none'; Codehighlighter1_125_180_Open_Image.style.display='inline'; Codehighlighter1_125_180_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">byte</span><span style="color: #000000">&nbsp;b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Byte.MIN_VALUE;&nbsp;b&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;Byte.MAX_VALUE;&nbsp;b</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_125_180_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_125_180_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(b&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0x90</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">hello</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<p><br />
<br />
&nbsp;</p>
<p>结果什么都没有打印。<br />
&nbsp; 0x90是一个两位数的十六进制字面常量，每一个十六进制位都占据4个比特的位置，<br />
所以整个数值也只占8个比特，即1个byte。问题在于byte是有符号类型，常量0x90是<br />
一个正的最高位被置为8位int数值。合法的byte数值是从-128到+127，但是常量0x90等于+144</p>
<p><br />
上面这个程序大家应该都能理解，但是下面整个判断是true还是false呢？<br />
( (byte)0x90 == 0x90 ) ，当然是false啦，有点java基础知识的人都知道会转化成int比较的，<br />
但转化后值是多少呢？ 这个这个。。。。。hoho&nbsp;&nbsp; (byte)0x90 提升为int数值-122，而0x90为144</p>
<p><br />
如果要实现比较，其实也很简单。</p>
<p>方法一： 只要我们相同的类型比较就可以啦，苹果跟苹果比较，桔子跟桔子比较。<br />
最上面的程序改成：<br />
if (b == (byte)0x90)<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("hello");<br />
这就可以打印出来了。</p>
<p>方法二：<br />
可以用一个屏蔽码来消除符号扩展的影响，从而将byte转化为int，之后就可以拿到一个int与另一个int进行比较了。<br />
if ( (b &amp; 0xff) == 0x90)<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("hello");</p>
<p>&nbsp;&nbsp; 虽然上面的两种方法都可以，但是避免这类问题的最佳方法还是将常量值移到循环的外面，并在一个常量种定义它。<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img id="Codehighlighter1_24_237_Open_Image" onclick="this.style.display='none'; Codehighlighter1_24_237_Open_Text.style.display='none'; Codehighlighter1_24_237_Closed_Image.style.display='inline'; Codehighlighter1_24_237_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_24_237_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_24_237_Closed_Text.style.display='none'; Codehighlighter1_24_237_Open_Image.style.display='inline'; Codehighlighter1_24_237_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;BigDelight&nbsp;</span><span id="Codehighlighter1_24_237_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_24_237_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">&nbsp;TARGET&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">byte</span><span style="color: #000000">)</span><span style="color: #000000">0x90</span><span style="color: #000000">;<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img id="Codehighlighter1_114_235_Open_Image" onclick="this.style.display='none'; Codehighlighter1_114_235_Open_Text.style.display='none'; Codehighlighter1_114_235_Closed_Image.style.display='inline'; Codehighlighter1_114_235_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_114_235_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_114_235_Closed_Text.style.display='none'; Codehighlighter1_114_235_Open_Image.style.display='inline'; Codehighlighter1_114_235_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_114_235_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_114_235_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img id="Codehighlighter1_173_232_Open_Image" onclick="this.style.display='none'; Codehighlighter1_173_232_Open_Text.style.display='none'; Codehighlighter1_173_232_Closed_Image.style.display='inline'; Codehighlighter1_173_232_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_173_232_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_173_232_Closed_Text.style.display='none'; Codehighlighter1_173_232_Open_Image.style.display='inline'; Codehighlighter1_173_232_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">byte</span><span style="color: #000000">&nbsp;b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Byte.MIN_VALUE;&nbsp;b&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;Byte.MAX_VALUE;&nbsp;b</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_173_232_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_173_232_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;b&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;TARGET&nbsp;)<br />
</span><span style="color: #008080">6</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">hello</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">7</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">8</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">9</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br />
<br />
<br />
****3**************************************************************************************<br />
下面的程序输入结果是什么呢？<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_22_150_Open_Image" onclick="this.style.display='none'; Codehighlighter1_22_150_Open_Text.style.display='none'; Codehighlighter1_22_150_Closed_Image.style.display='inline'; Codehighlighter1_22_150_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_22_150_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_22_150_Closed_Text.style.display='none'; Codehighlighter1_22_150_Open_Image.style.display='inline'; Codehighlighter1_22_150_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Incremet&nbsp;</span><span id="Codehighlighter1_22_150_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_22_150_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_64_147_Open_Image" onclick="this.style.display='none'; Codehighlighter1_64_147_Open_Text.style.display='none'; Codehighlighter1_64_147_Closed_Image.style.display='inline'; Codehighlighter1_64_147_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_64_147_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_64_147_Closed_Text.style.display='none'; Codehighlighter1_64_147_Open_Image.style.display='inline'; Codehighlighter1_64_147_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_64_147_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_64_147_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_103_119_Open_Image" onclick="this.style.display='none'; Codehighlighter1_103_119_Open_Text.style.display='none'; Codehighlighter1_103_119_Closed_Image.style.display='inline'; Codehighlighter1_103_119_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_103_119_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_103_119_Closed_Text.style.display='none'; Codehighlighter1_103_119_Open_Image.style.display='inline'; Codehighlighter1_103_119_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">100</span><span style="color: #000000">;i</span><span style="color: #000000">++</span><span style="color: #000000">)</span><span id="Codehighlighter1_103_119_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_103_119_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;j</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;System.out.println(j);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p>&nbsp;</p>
<p><br />
乍一看应该慧是100吧。 毕竟做了100次循环增量。&nbsp;&nbsp; 结果确是0</p>
<p><br />
j = j++; 整个操作细分开来大家都知道：<br />
int temp = j;<br />
j = j+1 ;<br />
j = temp;</p>
<p>&nbsp;那如果是这样那么结果就不用怀疑了，j=0</p>
<p>****4***************************************************************************</p>
<p><br />
下面的程序输出什么呢?<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img id="Codehighlighter1_23_266_Open_Image" onclick="this.style.display='none'; Codehighlighter1_23_266_Open_Text.style.display='none'; Codehighlighter1_23_266_Closed_Image.style.display='inline'; Codehighlighter1_23_266_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_23_266_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_23_266_Closed_Text.style.display='none'; Codehighlighter1_23_266_Open_Image.style.display='inline'; Codehighlighter1_23_266_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;InTheLoop&nbsp;</span><span id="Codehighlighter1_23_266_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_23_266_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;END&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Integer.MAX_VALUE;<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;START&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Integer.MIN_VALUE;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img id="Codehighlighter1_167_264_Open_Image" onclick="this.style.display='none'; Codehighlighter1_167_264_Open_Text.style.display='none'; Codehighlighter1_167_264_Closed_Image.style.display='inline'; Codehighlighter1_167_264_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_167_264_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_167_264_Closed_Text.style.display='none'; Codehighlighter1_167_264_Open_Image.style.display='inline'; Codehighlighter1_167_264_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_167_264_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_167_264_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;count&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img id="Codehighlighter1_215_232_Open_Image" onclick="this.style.display='none'; Codehighlighter1_215_232_Open_Text.style.display='none'; Codehighlighter1_215_232_Closed_Image.style.display='inline'; Codehighlighter1_215_232_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_215_232_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_215_232_Closed_Text.style.display='none'; Codehighlighter1_215_232_Open_Image.style.display='inline'; Codehighlighter1_215_232_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">START;i</span><span style="color: #000000">&lt;=</span><span style="color: #000000">END;i</span><span style="color: #000000">++</span><span style="color: #000000">)</span><span id="Codehighlighter1_215_232_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_215_232_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;count&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;System.out.println(count);<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<p>&nbsp;</p>
<p>应该是101吧，应该，那就是错啦，实际上是：在for循环中，出现了无限循环。<br />
当i达到Integer.MAX_VALUE时，并且再次执行增量操作时，它就又绕回到了Integer.MIN_VALUE。 所以就出现无限循环。</p>
<p>&nbsp;</p>
<p><br />
求：寻找一种定义，使得下面的循环一直无限，<br />
&nbsp;&nbsp; (1). for(int i=start;i&lt;=start+1;i++){}<br />
&nbsp;&nbsp; (2). while(i== i+1){}<br />
&nbsp;&nbsp; (3). while(i !=i ){}<br />
&nbsp;&nbsp; (4). while(i!= i + 0 ){}，附加要求，不能使用浮点数类型<br />
&nbsp;&nbsp; (5). while(i&lt;=j &amp;&amp; i&gt;=j &amp;&amp; i!=j ){}<br />
&nbsp;&nbsp; (6). while(i!=0 &amp;&amp; i== -i ){}&nbsp;</p>
<p>解答(1)：int start = Integer.MAX_VALUE-1;&nbsp;&nbsp; //不信你可以试一试<br />
解答(2)：可以用任何计算位无穷大的浮点算术表达式来实现：<br />
double i = 1.0/0.0; 一般都使用浮点数常量：double i = Double.POSITIVE_INFINITY;事实上，不必将i初始化为无穷大，<br />
任何足够大的浮点数都可以实现这一目的。例如：double i = 1.0e40;<br />
解答(3)：double i=0.0/0.0; 即：double i = Double.NaN;<br />
解答(4)：把i定义成string类型就可以实现啦<br />
解答(5)：Integer i = new Integer(0);&nbsp; Integer j = new Integer(0);<br />
解答(6)：int i = Integer.MIN_VALUE; 或 long i = Long.MIN_VALUE;</p>
<p>&nbsp;</p>
<p><br />
寻找i一种定义，使得 if( i-i == 0 ){} if中的条件永远为false?<br />
解答：double i=0.0/0.0; 即：double i = Double.NaN;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/264356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-04-07 22:49 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/04/07/264356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> java解惑中的—异常，简单程序，但容易错</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/04/07/264322.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Tue, 07 Apr 2009 12:51:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/04/07/264322.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/264322.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/04/07/264322.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/264322.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/264322.html</trackback:ping><description><![CDATA[&nbsp;下面三个程序每一个都会打印些什么？ 不要假设他们都可以编译通过：<br />
<br />
第一个程序：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.IOException;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_50_231_Open_Image" onclick="this.style.display='none'; Codehighlighter1_50_231_Open_Text.style.display='none'; Codehighlighter1_50_231_Closed_Image.style.display='inline'; Codehighlighter1_50_231_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_50_231_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_50_231_Closed_Text.style.display='none'; Codehighlighter1_50_231_Open_Image.style.display='inline'; Codehighlighter1_50_231_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Arcane1&nbsp;</span><span id="Codehighlighter1_50_231_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_50_231_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_92_229_Open_Image" onclick="this.style.display='none'; Codehighlighter1_92_229_Open_Text.style.display='none'; Codehighlighter1_92_229_Closed_Image.style.display='inline'; Codehighlighter1_92_229_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_92_229_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_92_229_Closed_Text.style.display='none'; Codehighlighter1_92_229_Open_Image.style.display='inline'; Codehighlighter1_92_229_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_92_229_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_92_229_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_99_145_Open_Image" onclick="this.style.display='none'; Codehighlighter1_99_145_Open_Text.style.display='none'; Codehighlighter1_99_145_Closed_Image.style.display='inline'; Codehighlighter1_99_145_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_99_145_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_99_145_Closed_Text.style.display='none'; Codehighlighter1_99_145_Open_Image.style.display='inline'; Codehighlighter1_99_145_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span id="Codehighlighter1_99_145_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_99_145_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">hello&nbsp;lsbwahaha</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img id="Codehighlighter1_166_226_Open_Image" onclick="this.style.display='none'; Codehighlighter1_166_226_Open_Text.style.display='none'; Codehighlighter1_166_226_Closed_Image.style.display='inline'; Codehighlighter1_166_226_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_166_226_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_166_226_Closed_Text.style.display='none'; Codehighlighter1_166_226_Open_Image.style.display='inline'; Codehighlighter1_166_226_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(IOException&nbsp;e)</span><span id="Codehighlighter1_166_226_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_166_226_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">I've&nbsp;never&nbsp;seen&nbsp;println&nbsp;fail!</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
<br />
第二个程序：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img id="Codehighlighter1_21_179_Open_Image" onclick="this.style.display='none'; Codehighlighter1_21_179_Open_Text.style.display='none'; Codehighlighter1_21_179_Closed_Image.style.display='inline'; Codehighlighter1_21_179_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_21_179_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_21_179_Closed_Text.style.display='none'; Codehighlighter1_21_179_Open_Image.style.display='inline'; Codehighlighter1_21_179_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Arcane2&nbsp;</span><span id="Codehighlighter1_21_179_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_21_179_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img id="Codehighlighter1_63_177_Open_Image" onclick="this.style.display='none'; Codehighlighter1_63_177_Open_Text.style.display='none'; Codehighlighter1_63_177_Closed_Image.style.display='inline'; Codehighlighter1_63_177_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_63_177_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_63_177_Closed_Text.style.display='none'; Codehighlighter1_63_177_Open_Image.style.display='inline'; Codehighlighter1_63_177_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_63_177_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_63_177_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img id="Codehighlighter1_70_107_Open_Image" onclick="this.style.display='none'; Codehighlighter1_70_107_Open_Text.style.display='none'; Codehighlighter1_70_107_Closed_Image.style.display='inline'; Codehighlighter1_70_107_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_70_107_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_70_107_Closed_Text.style.display='none'; Codehighlighter1_70_107_Open_Image.style.display='inline'; Codehighlighter1_70_107_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span id="Codehighlighter1_70_107_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_70_107_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">you&nbsp;have&nbsp;noting&nbsp;nice&nbsp;to&nbsp;say</span><span style="color: #008000"><br />
</span><span style="color: #008080">5</span><span style="color: #008000"><img id="Codehighlighter1_126_174_Open_Image" onclick="this.style.display='none'; Codehighlighter1_126_174_Open_Text.style.display='none'; Codehighlighter1_126_174_Closed_Image.style.display='inline'; Codehighlighter1_126_174_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_126_174_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_126_174_Closed_Text.style.display='none'; Codehighlighter1_126_174_Open_Image.style.display='inline'; Codehighlighter1_126_174_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;e)</span><span id="Codehighlighter1_126_174_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_126_174_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">6</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">this&nbsp;can't&nbsp;happen</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">7</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">8</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">9</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
<br />
第三个程序：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_15_62_Open_Image" onclick="this.style.display='none'; Codehighlighter1_15_62_Open_Text.style.display='none'; Codehighlighter1_15_62_Closed_Image.style.display='inline'; Codehighlighter1_15_62_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_15_62_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_15_62_Closed_Text.style.display='none'; Codehighlighter1_15_62_Open_Image.style.display='inline'; Codehighlighter1_15_62_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;Type1</span><span id="Codehighlighter1_15_62_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_15_62_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;CloneNotSupportedException;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_80_121_Open_Image" onclick="this.style.display='none'; Codehighlighter1_80_121_Open_Text.style.display='none'; Codehighlighter1_80_121_Closed_Image.style.display='inline'; Codehighlighter1_80_121_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_80_121_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_80_121_Closed_Text.style.display='none'; Codehighlighter1_80_121_Open_Image.style.display='inline'; Codehighlighter1_80_121_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;Type2</span><span id="Codehighlighter1_80_121_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_80_121_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;InterruptedException;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_159_160_Open_Image" onclick="this.style.display='none'; Codehighlighter1_159_160_Open_Text.style.display='none'; Codehighlighter1_159_160_Closed_Image.style.display='inline'; Codehighlighter1_159_160_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_159_160_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_159_160_Closed_Text.style.display='none'; Codehighlighter1_159_160_Open_Image.style.display='inline'; Codehighlighter1_159_160_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;Type3&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Type2,Type1</span><span id="Codehighlighter1_159_160_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_159_160_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_201_348_Open_Image" onclick="this.style.display='none'; Codehighlighter1_201_348_Open_Text.style.display='none'; Codehighlighter1_201_348_Closed_Image.style.display='inline'; Codehighlighter1_201_348_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_201_348_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_201_348_Closed_Text.style.display='none'; Codehighlighter1_201_348_Open_Image.style.display='inline'; Codehighlighter1_201_348_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Arcane3&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Type3&nbsp;</span><span id="Codehighlighter1_201_348_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_201_348_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_219_263_Open_Image" onclick="this.style.display='none'; Codehighlighter1_219_263_Open_Text.style.display='none'; Codehighlighter1_219_263_Closed_Image.style.display='inline'; Codehighlighter1_219_263_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_219_263_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_219_263_Closed_Text.style.display='none'; Codehighlighter1_219_263_Open_Image.style.display='inline'; Codehighlighter1_219_263_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f()</span><span id="Codehighlighter1_219_263_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_219_263_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">hello&nbsp;lsbwahaha</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_305_346_Open_Image" onclick="this.style.display='none'; Codehighlighter1_305_346_Open_Text.style.display='none'; Codehighlighter1_305_346_Closed_Image.style.display='inline'; Codehighlighter1_305_346_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_305_346_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_305_346_Closed_Text.style.display='none'; Codehighlighter1_305_346_Open_Image.style.display='inline'; Codehighlighter1_305_346_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_305_346_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_305_346_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type3&nbsp;t3&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Arcane3();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t3.f();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
<br />
分析第一个程序：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 看起来应该会打印出hello lsbwahaha，这个程序不能编译，因为pringln犯法没有会抛出任何受检查异常，<br />
而IOException 却正是一个受检查异常。<br />
语言规范中描述：如果一个catch子句要捕获一个类型为E的受检查异常，而其相对应的try子句不能抛出E的某种子类型的异常，<br />
那么这就是一个编译期错误。<br />
<br />
<br />
分析第二个程序：<br />
&nbsp;&nbsp;&nbsp; 基于第一个程序，那么第二个程序应该不可以编译，但是它却可以。它之所以可以编译，是因为它唯一的catch子句检查了Exception<br />
&nbsp;&nbsp; 捕获Exception或Throwable的catch子句是合法的，不管于其相对应的try子句的内容为何。&nbsp; 这个程序什么都不会打印。<br />
<br />
<br />
分析第三个程序：<br />
&nbsp;&nbsp; 看起来它也不能编译。 如果它能编译，那是为什么呢？<br />
&nbsp;结果居然能编译通过。。。。&nbsp; 这个到底是为什么呢？、、、、、、、<br />
&nbsp;&nbsp;&nbsp;&nbsp; Type3 中 因为每一个接口都限制了方法f可以抛出的受检查异常集合。一个方法可以抛出的受检查异常集合是它所适用的所有类型声明<br />
要抛出的受检查异常交集，而不是并集。<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/264322.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-04-07 20:51 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/04/07/264322.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>