﻿<?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-On Cloud Nine-随笔分类-Java Basic</title><link>http://www.blogjava.net/tastesnow/category/37231.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 18 May 2009 19:46:57 GMT</lastBuildDate><pubDate>Mon, 18 May 2009 19:46:57 GMT</pubDate><ttl>60</ttl><item><title>[转]Java中的内部类和匿名类 </title><link>http://www.blogjava.net/tastesnow/archive/2009/05/18/271405.html</link><dc:creator>TracyLu</dc:creator><author>TracyLu</author><pubDate>Mon, 18 May 2009 13:55:00 GMT</pubDate><guid>http://www.blogjava.net/tastesnow/archive/2009/05/18/271405.html</guid><wfw:comment>http://www.blogjava.net/tastesnow/comments/271405.html</wfw:comment><comments>http://www.blogjava.net/tastesnow/archive/2009/05/18/271405.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tastesnow/comments/commentRss/271405.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tastesnow/services/trackbacks/271405.html</trackback:ping><description><![CDATA[提起Java内部类（<strong>Inner Class</strong>）可能很多人不太熟悉，实际上类似的概念在C++里也有，那就是嵌套类（<strong>Nested Class</strong>），关于这两者的区别与联系，在下文中会有对比。内部类从表面上看，就是在类中又定义了一个类（下文会看到，内部类可以在很多地方定义），而实际上并没有那么简单，乍看上去内部类似乎有些多余，它的用处对于初学者来说可能并不是那么显著，但是随着对它的深入了解，你会发现Java的设计者在内部类身上的确是用心良苦。学会使用内部类，是掌握Java高级编程的一部分，它可以让你更优雅地设计你的程序结构。下面从以下几个方面来介绍：<br clear="all" />
<ul>
    <li><font size="+1"><strong>第一次见面</strong></font> </li>
</ul>
<br />
<table class="code" cellspacing="4" width="100%" align="center" bgcolor="#e0e0e0" border="0">
    <tbody>
        <tr>
            <td>
            <p class="unnamed1"><font color="#0000ff"><strong>public </strong></font><strong>interface </strong><span style="padding-right: 0px; padding-left: 0px; font-weight: bold; padding-bottom: 0px; color: rgb(238,102,0); padding-top: 0px; background-color: yellow">Contents</span> {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>int</strong></font> value();<br />
            }</p>
            <p class="unnamed1"><font color="#0000ff"><strong>public </strong></font><strong>interface</strong> Destination {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>String</strong></font> readLabel();<br />
            }</p>
            <p class="unnamed1"><font color="#0000ff"><strong>public </strong></font><strong>class</strong> Goods {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>private </strong></font><strong>class</strong> Content implements <span style="padding-right: 0px; padding-left: 0px; font-weight: bold; padding-bottom: 0px; color: rgb(238,102,0); padding-top: 0px; background-color: yellow">Contents</span> {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>private int</strong></font> i = 11;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>public int</strong></font> value() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">return</font></strong> i; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp; }</p>
            <p class="unnamed1">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>protected </strong></font><strong>class</strong> GDestination <strong><font color="#0000ff">implements</font></strong> Destination {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>private </strong></font><font color="#cccccc"><strong><font color="#000000">String</font></strong></font> label;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>private</strong></font> GDestination(<strong><font color="#0000ff">String</font></strong> whereTo) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>label</strong></font> = whereTo;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>public </strong></font><strong>String</strong> readLabel() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>return</strong></font> label; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp; }</p>
            <p class="unnamed1">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>public</strong></font> Destination dest(<strong><font color="#0000ff">String</font></strong> s) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>return </strong></font><strong>new</strong> GDestination(s);<br />
            &nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>public </strong></font><strong><span style="padding-right: 0px; padding-left: 0px; font-weight: bold; padding-bottom: 0px; color: rgb(238,102,0); padding-top: 0px; background-color: yellow">Contents</span></strong> cont() {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>return</strong></font><strong>new</strong> Content();<br />
            &nbsp;&nbsp;&nbsp;&nbsp; }<br />
            }</p>
            <p class="unnamed1"><font color="#0000ff"><strong>class</strong></font> TestGoods {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>public </strong></font><strong><font color="#0000ff">static</font> void main</strong>(<strong><font color="#0000ff">String[]</font></strong> args) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Goods p = <strong><font color="#0000ff">new</font></strong> Goods();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="padding-right: 0px; padding-left: 0px; font-weight: bold; padding-bottom: 0px; color: rgb(238,102,0); padding-top: 0px; background-color: yellow">Contents</span> c = p.cont();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Destination d = p.dest("Beijing");<br />
            &nbsp;&nbsp;&nbsp;&nbsp; }<br />
            } </p>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp;&nbsp; 在这个例子里类Content和GDestination被定义在了类Goods内部，并且分别有着protected和private修饰符来控制访问级别。Content代表着Goods的内容，而GDestination代表着Goods的目的地。它们分别实现了两个接口Content和 Destination。在后面的main方法里，直接用 <span style="padding-right: 0px; padding-left: 0px; font-weight: bold; padding-bottom: 0px; color: rgb(238,102,0); padding-top: 0px; background-color: yellow">Contents</span> c和Destination d进行操作，你甚至连这两个内部类的名字都没有看见！这样，内部类的第一个好处就体现出来了——<strong><font color="#0000ff">隐藏你不想让别人知道的操作</font></strong>，也即封装性。
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp; 同时，我们也发现了在外部类作用范围之外得到内部类对象的第一个方法，那就是利用其外部类的方法创建并返回。上例中的cont()和dest()方法就是这么做的。那么还有没有别的方法呢？当然有，其语法格式如下：</p>
<table class="code" cellspacing="4" width="100%" bgcolor="#e0e0e0" border="0">
    <tbody>
        <tr>
            <td>
            <p class="unnamed1" align="left">outer Object=<strong><font color="#0000ff">new </font></strong>outerClass(Constructor Parameters);</p>
            <p class="unnamed1" align="left">outerClass.innerClass innerObject=outerObject.new InnerClass(Constructor Parameters);</p>
            </td>
        </tr>
    </tbody>
</table>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp; 注意在创建非静态内部类对象时，一定要先创建起相应的外部类对象。至于原因，也就引出了我们下一个话题——</p>
<ul>
    <li><font size="+1"><strong>非静态内部类对象有着指向其外部类对象的引用</strong></font> </li>
</ul>
<p>对刚才的例子稍作修改：</p>
<table class="code" cellspacing="4" width="100%" align="center" bgcolor="#e0e0e0" border="0">
    <tbody>
        <tr>
            <td>
            <p class="unnamed1" align="left"><font color="#0000ff"><strong>public </strong></font><strong>class</strong> Goods {</p>
            <p class="unnamed1" align="left">&nbsp;&nbsp;&nbsp;<font color="#0000ff"><font color="#ff0000"><strong>private valueRate=2;</strong></font></font></p>
            <p class="unnamed1" align="left">&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">private</font> class </strong>Content<strong> implements </strong><span style="padding-right: 0px; padding-left: 0px; font-weight: bold; padding-bottom: 0px; color: rgb(238,102,0); padding-top: 0px; background-color: yellow">Contents</span> {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">private int</font></strong> i = <font color="#ff0000"><strong>11*valueRate;</strong></font><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">public int </font></strong>value() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>return</strong></font> i; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp; }</p>
            <p class="unnamed1" align="left">&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">protected</font> class</strong> GDestination <strong>implements</strong> Destination {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">private String</font></strong> label;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>private</strong></font> GDestination(<strong><font color="#0000ff">String</font></strong> whereTo) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">label</font></strong> = whereTo;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">public String</font></strong> readLabel() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>return</strong></font> label; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp; }</p>
            <p class="unnamed1" align="left">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>public</strong></font> Destination dest(<strong><font color="#0000ff">String</font></strong> s) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#0000ff">return</font> new</strong> GDestination(s);<br />
            &nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>public </strong></font><span style="padding-right: 0px; padding-left: 0px; font-weight: bold; padding-bottom: 0px; color: rgb(238,102,0); padding-top: 0px; background-color: yellow">Contents</span> cont() {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>return </strong></font><font color="#0000ff"><strong><font color="#000000">new</font></strong></font> Content();<br />
            &nbsp;&nbsp;&nbsp;&nbsp; }<br />
            }</p>
            </td>
        </tr>
    </tbody>
</table>
<p align="left"></p>
&nbsp;&nbsp;&nbsp;&nbsp; 修改的部分用蓝色显玖恕Ｔ谡饫镂颐歉鳪oods类增加了一个private成员变量valueRate，意义是货物的价值系数，在内部类Content的方法value()计算价值时把它乘上。我们发现，value()可以访问valueRate，这也是内部类的第二个好处——<strong><font color="#0000ff">一个内部类对象可以访问创建它的外部类对象的内容</font></strong>，甚至包括私有变量！这是一个非常有用的特性，为我们在设计时提供了更多的思路和捷径。要想实现这个功能，内部类对象就必须有指向外部类对象的引用。 Java编译器在创建内部类对象时，隐式的把其外部类对象的引用也传了进去并一直保存着。这样就使得内部类对象始终可以访问其外部类对象，同时这也是为什么在外部类作用范围之外向要创建内部类对象必须先创建其外部类对象的原因。
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp; 有人会问，如果内部类里的一个成员变量与外部类的一个成员变量同名，也即外部类的同名成员变量被屏蔽了，怎么办？没事，Java里用如下格式表达外部类的引用：</p>
<table class="code" cellspacing="4" width="100%" align="center" bgcolor="#e0e0e0" border="0">
    <tbody>
        <tr>
            <td class="unnamed1">outerClass.this</td>
        </tr>
    </tbody>
</table>
<p align="left">有了它，我们就不怕这种屏蔽的情况了。</p>
<ul>
    <li><strong><font size="+1">静态内部类</font></strong> </li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 和普通的类一样，内部类也可以有静态的。不过和非静态内部类相比，区别就在于静态内部类没有了指向外部的引用。这实际上和C++中的嵌套类很相像了，Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用这一点上，当然从设计的角度以及以它一些细节来讲还有区别。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 除此之外，在任何非静态内部类中，都不能有静态数据，静态方法或者又一个静态内部类（内部类的嵌套可以不止一层）。不过静态内部类中却可以拥有这一切。这也算是两者的第二个区别吧。</p>
<ul>
    <li><strong><font size="+1">局部内部类</font></strong> </li>
</ul>
<p>是的，Java内部类也可以是局部的，它可以定义在一个方法甚至一个代码块之内。</p>
<table class="code" cellspacing="4" width="100%" align="center" bgcolor="#e0e0e0" border="0">
    <tbody>
        <tr>
            <td>
            <p class="unnamed1"><font color="#0000ff"><strong>public </strong></font><strong>class</strong> Goods1 {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>public</strong></font> Destination dest(<strong><font color="#0000ff">String</font></strong> s) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>class</strong></font> GDestination <strong><font color="#000000">implements</font></strong> Destination {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>private String</strong></font> label;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>private</strong></font> GDestination(<strong><font color="#0000ff">String</font></strong> whereTo) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>label</strong></font> = whereTo;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>public String</strong></font> readLabel() { <strong><font color="#0000ff">return</font></strong> label; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>return new </strong></font>GDestination(s);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
            <p class="unnamed1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>public static </strong></font><font color="#000000"><strong>void main</strong></font>(<strong><font color="#0000ff">String[]</font></strong> args) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Goods1 g= <strong><font color="#0000ff">new</font></strong> Goods1();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Destination d = g.dest("Beijing");<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            }</p>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 上面就是这样一个例子。在方法dest中我们定义了一个内部类，最后由这个方法返回这个内部类的对象。如果我们在用一个内部类的时候仅需要创建它的一个对象并创给外部，就可以这样做。当然，定义在方法中的内部类可以使设计多样化，用途绝不仅仅在这一点。</p>
<p>下面有一个更怪的例子：</p>
<table class="code" cellspacing="4" width="100%" align="center" bgcolor="#e0e0e0" border="0">
    <tbody>
        <tr>
            <td>
            <p class="unnamed1"><font color="#0000ff"><strong>public </strong></font><strong><font color="#000000">class</font></strong> Goods2{<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>private</strong></font><strong><font color="#000000">void</font></strong> internalTracking(<strong><font color="#0000ff">boolean</font></strong> b) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(b) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong><font color="#000000">class</font></strong></font> TrackingSlip {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>private String</strong></font> id;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TrackingSlip(<strong><font color="#0000ff">String</font></strong> s) {<br />
            &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; id = s;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#00ff00"><strong><font color="#0000ff">String</font></strong></font> getSlip() { <strong><font color="#0000ff">return</font></strong> id; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TrackingSlip ts = <strong><font color="#0000ff">new</font></strong> TrackingSlip("slip");<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>String</strong></font> s = ts.getSlip();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
            <p class="unnamed1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>public void</strong></font> track() { internalTracking(<strong><font color="#0000ff">true</font></strong>); }</p>
            <p class="unnamed1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>public static</strong></font><strong>void main</strong>(<strong><font color="#0000ff">String[]</font></strong> args) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Goods2 g= <strong><font color="#000000">new</font></strong> Goods2();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.track();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            }</p>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 你不能在if之外创建这个内部类的对象，因为这已经超出了它的作用域。不过在编译的时候，内部类TrackingSlip和其他类一样同时被编译，只不过它由它自己的作用域，超出了这个范围就无效，除此之外它和其他内部类并没有区别。</p>
<ul>
    <li><font size="+1"><strong>匿名内部类</strong></font> </li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp; java的匿名内部类的语法规则看上去有些古怪，不过如同匿名数组一样，当你只需要创建一个类的对象而且用不上它的名字时，使用内部类可以使代码看上去简洁清楚。它的语法规则是这样的：</p>
<table class="code" cellspacing="4" width="100%" align="center" bgcolor="#e0e0e0" border="0">
    <tbody>
        <tr>
            <td class="unnamed1"><font color="#0000ff"><strong>new</strong></font> interfacename(){......}; 或 <strong><font color="#0000ff">new</font></strong> superclassname(){......};</td>
        </tr>
    </tbody>
</table>
<p>下面接着前面继续举例子：</p>
<table class="code" cellspacing="4" width="100%" align="center" bgcolor="#e0e0e0" border="0">
    <tbody>
        <tr>
            <td class="unnamed1"><font color="#0000ff"><strong>public class</strong></font> Goods3 {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>public </strong></font><span style="padding-right: 0px; padding-left: 0px; font-weight: bold; padding-bottom: 0px; color: rgb(238,102,0); padding-top: 0px; background-color: yellow">Contents</span> cont(){<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>return </strong></font><strong><font color="#0000ff">new</font></strong><span style="padding-right: 0px; padding-left: 0px; font-weight: bold; padding-bottom: 0px; color: rgb(238,102,0); padding-top: 0px; background-color: yellow">Contents</span>(){<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>private int</strong></font> i = 11;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>public int</strong></font> value() { <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>return</strong></font> i; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            }</td>
        </tr>
    </tbody>
</table>
<p>这里方法cont()使用匿名内部类直接返回了一个实现了接口<span style="padding-right: 0px; padding-left: 0px; font-weight: bold; padding-bottom: 0px; color: rgb(238,102,0); padding-top: 0px; background-color: yellow">Contents</span>的类的对象，看上去的确十分简洁。</p>
<p>在java的事件处理的匿名适配器中，匿名内部类被大量的使用。例如在想关闭窗口时加上这样一句代码：</p>
<table class="code" cellspacing="4" width="100%" align="center" bgcolor="#e0e0e0" border="0">
    <tbody>
        <tr>
            <td class="unnamed1">frame.<strong><font color="#000000">addWindowListener</font></strong>(<strong><font color="#0000ff">new</font></strong> WindowAdapter(){<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff"><strong>public void</strong></font> windowClosing(WindowEvent e){<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.exit(0); <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            });</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 有一点需要注意的是，匿名内部类由于没有名字，所以它没有构造函数（但是如果这个匿名内部类继承了一个只含有带参数构造函数的父类，创建它的时候必须带上这些参数，并在实现的过程中使用super关键字调用相应的内容）。如果你想要初始化它的成员变量，有下面几种方法：</p>
<ol>
    <li>如果是在一个方法的匿名内部类，可以利用这个方法传进你想要的参数，不过记住，这些参数必须被声明为final。
    <li>将匿名内部类改造成有名字的局部内部类，这样它就可以拥有构造函数了。
    <li>在这个匿名内部类中使用初始化代码块。 </li>
</ol>
<ul>
    <li><font size="+1"><strong>为什么需要内部类？</strong></font> </li>
</ul>
<p>java内部类有什么好处？为什么需要内部类？</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 首先举一个简单的例子，如果你想实现一个接口，但是这个接口中的一个方法和你构想的这个类中的一个方法的名称，参数相同，你应该怎么办？这时候，你可以建一个内部类实现这个接口。由于内部类对外部类的所有内容都是可访问的，所以这样做可以完成所有你直接实现这个接口的功能。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 不过你可能要质疑，更改一下方法的不就行了吗？</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 的确，以此作为设计内部类的理由，实在没有说服力。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 真正的原因是这样的，java中的内部类和接口加在一起，可以的解决常被C++程序员抱怨java中存在的一个问题——没有多继承。实际上，C++的多继承设计起来很复杂，而java通过内部类加上接口，可以很好的实现多继承的效果。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;</p>
<img src ="http://www.blogjava.net/tastesnow/aggbug/271405.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tastesnow/" target="_blank">TracyLu</a> 2009-05-18 21:55 <a href="http://www.blogjava.net/tastesnow/archive/2009/05/18/271405.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>呼噜语录二</title><link>http://www.blogjava.net/tastesnow/archive/2009/03/23/261549.html</link><dc:creator>TracyLu</dc:creator><author>TracyLu</author><pubDate>Mon, 23 Mar 2009 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/tastesnow/archive/2009/03/23/261549.html</guid><wfw:comment>http://www.blogjava.net/tastesnow/comments/261549.html</wfw:comment><comments>http://www.blogjava.net/tastesnow/archive/2009/03/23/261549.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tastesnow/comments/commentRss/261549.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tastesnow/services/trackbacks/261549.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于业务对象怎么封装的在过去Core J2EE Pattern上，把业务对象的属性都是散列开的。<span style="color: #000000; font-family: MS Shell Dlg">而且其中有个不佳实践，就是把业务对象当中的所有属性都变成一个传输对象（这个传输对象看上去有点像领域模型）。<span style="color: #000000; font-family: MS Shell Dlg">新的技术编程模型下（EJB3.0）</span>，<span style="color: #000000; font-family: MS Shell Dlg">应该让业务对象直接持有实体，而不是把每一个属性都列开</span>，<span style="color: #000000; font-family: MS Shell Dlg">原因在于，如果把属性都列开，那么业务对象本身应该被管理，为什么呢？如果多个事务或多个现程在访问本来相同的业务对象（标识相同）　的时候，那么由于业务对象不受管，他们创建了各自的实例，彼此不相干，但是当最后提交内容的时候，就可能会导致结果很意外</span>。<span style="color: #000000; font-family: MS Shell Dlg">这个同 容器的四种事务隔离级别的意义很类似，如果要将BO的属性都列开，那么，就应该让BO受管，相当于单独实现一个BO的容器，控制并发，控制事务</span>。<span style="color: #000000; font-family: MS Shell Dlg">这个容器 要实现多个线程共享一个标识相同的业务对象，并控制并发访问，合适的隔离事务。也就是说要做一个容器应该做的事情</span>。<span style="color: #000000; font-family: MS Shell Dlg">应该巧妙的利用容器提供的持久性容器来解决这个问题</span>。<span style="color: #000000; font-family: MS Shell Dlg">将实体放到业务对象中，对业务对象的操作，实际上是业务对象的业务方法的操作，而业务方法操纵的是持久化上下文中的实体的状态，每一个被创建出来具有相同标识的业务对象，虽然是不同的实例，但是都包含对同一个实体对象的引用。<span style="color: #000000; font-family: MS Shell Dlg">这样对业务对象状态的变更，实际上是对一个实体对象状态的变更，仍然属于受管状态</span>。<span style="color: #000000; font-family: MS Shell Dlg">但是这个时候也一定要搞清楚，业务对象包裹的这个实体的状态：新建、受管、脱管、已删除</span>。</span></span>
<img src ="http://www.blogjava.net/tastesnow/aggbug/261549.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tastesnow/" target="_blank">TracyLu</a> 2009-03-23 17:44 <a href="http://www.blogjava.net/tastesnow/archive/2009/03/23/261549.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Exception处理之最佳实践(ZZ)</title><link>http://www.blogjava.net/tastesnow/archive/2009/03/03/257574.html</link><dc:creator>TracyLu</dc:creator><author>TracyLu</author><pubDate>Tue, 03 Mar 2009 07:45:00 GMT</pubDate><guid>http://www.blogjava.net/tastesnow/archive/2009/03/03/257574.html</guid><wfw:comment>http://www.blogjava.net/tastesnow/comments/257574.html</wfw:comment><comments>http://www.blogjava.net/tastesnow/archive/2009/03/03/257574.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tastesnow/comments/commentRss/257574.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tastesnow/services/trackbacks/257574.html</trackback:ping><description><![CDATA[<strong>关键字: java/java编程</strong>
<div class="blog_content">
<p>&nbsp;本文是Exception处理的一篇不错的文章，从Java Exception的概念介绍起，依次讲解了Exception的类型（Checked/Unchecked），Exception处理的最佳实现：<br />
1． 选择Checked还是Unchecked的几个经典依据<br />
2． Exception的封装问题<br />
3． 如无必要不要创建自己的Exception<br />
4． 不要用Exception来作流程控制<br />
5． 不要轻易的忽略捕获的Exception<br />
6． 不要简单地捕获顶层的Exception<br />
原文地址：<br />
<a href="http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html">http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html<br />
</a><br />
<br />
关于异常处理的一个问题就是要对何时（when）和如何（how）使用它们做到了然于心。在本文中我将介绍一些关于异常处理的最佳实践，同时我也会涉及到最近争论十分激烈的checked Exception的使用问题。<br />
<br />
作为开发员，我们都希望能写出解决问题并且是高质量的代码。不幸的是，一些副作用（side effects）伴随着异常在我们的代码中慢慢滋生。无庸置疑，没有人喜欢副作用（side effects）,所以我们很快就用我们自己的方式来避免它，我曾经看到一些聪明的程序员用下面的方式来处理异常：<br />
<br />
public void consumeAndForgetAllExceptions(){<br />
try {<br />
...some code that throws exceptions<br />
} catch (Exception ex){<br />
ex.printStacktrace();<br />
}<br />
}<br />
<br />
上边的代码有什么问题么？<br />
<br />
在回答以前让我们想想怎样才是正确的？是的，一旦程序碰到异常，它就该挂起程序而"做"点什么。那么上边的代码是这样子的么？看吧，它隐瞒了什么？它把所有的"苦水"往肚里咽（在控制台打印出异常信息），然后一切继续，从表面上看就像什么都没有发生过一样......，很显然，上边代码达到的效果并不是我们所期望的。<br />
<br />
后来又怎样？<br />
<br />
public void someMethod() throws Exception{<br />
}<br />
<br />
上边的代码又有什么问题？<br />
<br />
很明显，上边的方法体是空的，它不实现任何的功能（没有一句代码），试问一个空方法体能抛出什么异常？当然Java并不阻止你这么干。最近，我也遇到类似的情景，方法声明会抛出异常，但是代码中并没有任何"机会"来"展示"异常。当我问开发员为什么要这样做的时候，他回答我说"我知道，它确实有点那个，但我以前就是这么干的并且它确实能为我工作。"<br />
<br />
在C++社区曾经花了数年实践来实践如何使用异常，关于此类的争论在 java社区才刚刚开始。我曾经看到许多Java程序员针对使用异常的问题进行争论。如果对于异常处理不当的话，异常可以大大减慢应用程序的执行速度，因为它将消耗内存和CPU来创建、抛出并捕获异常。如果过分的依赖异常处理，代码对易读和易使用这两方面产生影响，以至于会让我们写出上边两处"糟糕"代码。<br />
<br />
异常原理<br />
<br />
大体上说，有三种不同的"情景"会导致异常的抛出：<br />
<br />
l 编程错误导致异常（Exception due Programming errors）: 这种情景下，异常往往处于编程错误（如：NullPointerException 或者 IllegalArgumentException）,这时异常一旦抛出，客户端将变得无能为力。<br />
<br />
l 客户端代码错误导致异常（Exception due client code errors）: 说白点就是客户端试图调用API不允许的操作。<br />
<br />
l 资源失败导致异常（Exception due to resource failures）: 如内存不足或网络连接失败导致出现异常等。这些异常的出现客户端可以采取相应的措施来恢复应用程序的继续运行。<br />
<br />
Java中异常的类型<br />
<br />
Java 中定义了两类异常：<br />
<br />
l Checked exception: 这类异常都是Exception的子类<br />
<br />
l Unchecked exception: 这类异常都是RuntimeException的子类，虽然RuntimeException同样也是Exception的子类，但是它们是特殊的，它们不能通过client code来试图解决，所以称为Unchecked exception<br />
<br />
举个例子，下图为NullPointerException的继承关系：<br />
<br />
<img alt="" src="http://www.onjava.com/onjava/2003/11/19/graphics/ExceptionHierarchy.gif" border="0" /><br />
<br />
图中，NullPointerException继承自RuntimeException，所以它是Unchecked exception.<br />
<br />
以往我都是应用checked exception多于Unchecked exception，最近，在java社区激起了一场关于checked exception和使用它们的价值的争论。这场争论起源于JAVA是第一个拥有Checked exception的主流OO语言这样一个事实，而C++和C#都是根本没有Checked exception，它们所有的异常都是unchecked。<br />
<br />
一个checked exception强迫它的客户端可以抛出并捕获它，一旦客户端不能有效地处理这些被抛出的异常就会给程序的执行带来不期望的负担。<br />
Checked exception还可能带来封装泄漏，看下面的代码：<br />
<br />
public List getAllAccounts() throws<br />
FileNotFoundException, SQLException{<br />
...<br />
}<br />
<br />
上边的方法抛出两个异常。客户端必须显示的对这两种异常进行捕获和处理即使是在完全不知道这种异常到底是因为文件还是数据库操作引起的情况下。因此，此时的异常处理将导致一种方法和调用之间不合适的耦合。<br />
<br />
<br />
<br />
接下来我会给出几种设计异常的最佳实践 （Best Practises for Designing the API）<br />
<br />
1． 当要决定是采用checked exception还是Unchecked exception的时候，你要问自己一个问题，"如果这种异常一旦抛出，客户端会做怎样的补救？"<br />
如果客户端可以通过其他的方法恢复异常，那么这种异常就是checked exception；如果客户端对出现的这种异常无能为力，那么这种异常就是Unchecked exception；从使用上讲，当异常出现的时候要做一些试图恢复它的动作而不要仅仅的打印它的信息，总来的来说，看下表：<br />
<br />
Client's reaction when exception happens<br />
Exception type<br />
<br />
Client code cannot do anything<br />
Make it an unchecked exception<br />
<br />
Client code will take some useful recovery action based on information in exception<br />
Make it a checked exception<br />
<br />
<br />
此外，尽量使用unchecked exception来处理编程错误：因为unchecked exception不用使客户端代码显示的处理它们，它们自己会在出现的地方挂起程序并打印出异常信息。Java API中提供了丰富的unchecked excetpion，譬如：NullPointerException , IllegalArgumentException 和 IllegalStateException等，因此我一般使用这些标准的异常类而不愿亲自创建新的异常类，这样使我的代码易于理解并避免的过多的消耗内存。<br />
<br />
2． 保护封装性（Preserve encapsulation）<br />
<br />
不要让你要抛出的checked exception升级到较高的层次。例如，不要让SQLException延伸到业务层。业务层并不需要（不关心？）SQLException。你有两种方法来解决这种问题：<br />
<br />
l 转变SQLException为另外一个checked exception，如果客户端并不需要恢复这种异常的话；<br />
<br />
l 转变SQLException为一个unchecked exception，如果客户端对这种异常无能为力的话；<br />
<br />
多数情况下，客户端代码都是对SQLException无能为力的，因此你要毫不犹豫的把它转变为一个unchecked exception，看看下边的代码：<br />
public void dataAccessCode(){<br />
try{<br />
..some code that throws SQLException<br />
}catch(SQLException ex){<br />
ex.printStacktrace();<br />
}<br />
}<br />
<br />
<br />
上边的catch块紧紧打印异常信息而没有任何的直接操作，这是情有可原的，因为对于SQLException你还奢望客户端做些什么呢？（但是显然这种就象什么事情都没发生一样的做法是不可取的）那么有没有另外一种更加可行的方法呢？<br />
<br />
public void dataAccessCode(){<br />
try{<br />
..some code that throws SQLException<br />
}catch(SQLException ex){<br />
throw new RuntimeException(ex);<br />
}<br />
}<br />
<br />
上边的做法是把SQLException转换为RuntimeException，一旦SQLException被抛出，那么程序将抛出RuntimeException,此时程序被挂起并返回客户端异常信息。<br />
<br />
如果你有足够的信心恢复它当SQLException被抛出的时候，那么你也可以把它转换为一个有意义的checked exception, 但是我发现在大多时候抛出RuntimeException已经足够用了。<br />
<br />
3． 不要创建没有意义的异常（Try not to create new custom exceptions if they do not have useful information for client code.）<br />
<br />
看看下面的代码有什么问题？<br />
<br />
public class DuplicateUsernameException<br />
extends Exception {}<br />
<br />
<br />
它除了有一个"意义明确"的名字以外没有任何有用的信息了。不要忘记Exception跟其他的Java类一样，客户端可以调用其中的方法来得到更多的信息。<br />
<br />
我们可以为其添加一些必要的方法，如下：<br />
<br />
public class DuplicateUsernameException<br />
extends Exception {<br />
public DuplicateUsernameException <br />
(String username){....}<br />
public String requestedUsername(){...}<br />
public String[] availableNames(){...}<br />
}<br />
<br />
<br />
<br />
在新的代码中有两个有用的方法：reqeuestedUsername(),客户但可以通过它得到请求的名称；availableNames(),客户端可以通过它得到一组有用的usernames。这样客户端在得到其返回的信息来明确自己的操作失败的原因。但是如果你不想添加更多的信息，那么你可以抛出一个标准的Exception:<br />
<br />
throw new Exception("Username already taken");<br />
更甚的情况，如果你认为客户端并不想用过多的操作而仅仅想看到异常信息，你可以抛出一个unchecked exception:<br />
<br />
throw new RuntimeException("Username already taken");<br />
<br />
另外，你可以提供一个方法来验证该username是否被占用。<br />
<br />
很有必要再重申一下，checked exception应该让客户端从中得到丰富的信息。要想让你的代码更加易读，请倾向于用unchecked excetpion来处理程序中的错误（Prefer unchecked exceptions for all programmatic errors）。<br />
<br />
4． Document exceptions.<br />
<br />
你可以通过Javadoc's @throws 标签来说明（document）你的API中要抛出checked exception或者unchecked exception。然而，我更倾向于使用来单元测试来说明（document）异常。不管你采用哪中方式，你要让客户端代码知道你的API中所要抛出的异常。这里有一个用单元测试来测试IndexOutOfBoundsException的例子：<br />
<br />
public void testIndexOutOfBoundsException() {<br />
ArrayList blankList = new ArrayList();<br />
try {<br />
blankList.get(10);<br />
fail("Should raise an IndexOutOfBoundsException");<br />
} catch (IndexOutOfBoundsException success) {}<br />
}<br />
<br />
<br />
<br />
上边的代码在请求blankList.get(10)的时候会抛出IndexOutOfBoundsException,如果没有被抛出，将fail ("Should raise an IndexOutOfBoundsException")显示说明该测试失败。通过书写测试异常的单元测试，你不但可以看到异常是怎样的工作的，而且你可以让你的代码变得越来越健壮。<br />
<br />
<br />
下面作者将介绍界中使用异常的最佳实践（Best Practices for Using Exceptions）<br />
1． 总是要做一些清理工作（Always clean up after yourself）<br />
<br />
如果你使用一些资源例如数据库连接或者网络连接，请记住要做一些清理工作（如关闭数据库连接或者网络连接），如果你的API抛出Unchecked exception，那么你要用try-finally来做必要的清理工作：<br />
</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;dataAccessCode(){ &nbsp;&nbsp;</span></span>
    <li class=""><span>Connection&nbsp;conn&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span>
    <li class="alt"><span><span class="keyword">try</span><span>{ &nbsp;&nbsp;</span> </span>
    <li class=""><span>conn&nbsp;=&nbsp;getConnection(); &nbsp;&nbsp;</span>
    <li class="alt"><span>..some&nbsp;code&nbsp;that&nbsp;</span><span class="keyword">throws</span><span>&nbsp;SQLException &nbsp;&nbsp;</span>
    <li class=""><span>}</span><span class="keyword">catch</span><span>(SQLException&nbsp;ex){ &nbsp;&nbsp;</span>
    <li class="alt"><span>ex.printStacktrace(); &nbsp;&nbsp;</span>
    <li class=""><span>}&nbsp;</span><span class="keyword">finally</span><span>{ &nbsp;&nbsp;</span>
    <li class="alt"><span>DBUtil.closeConnection(conn); &nbsp;&nbsp;</span>
    <li class=""><span>} &nbsp;&nbsp;</span>
    <li class="alt"><span>} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;DBUtil{ &nbsp;&nbsp;</span> </span>
    <li class=""><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;closeConnection &nbsp;&nbsp;</span> </span>
    <li class="alt"><span>(Connection&nbsp;conn){ &nbsp;&nbsp;</span>
    <li class=""><span><span class="keyword">try</span><span>{ &nbsp;&nbsp;</span> </span>
    <li class="alt"><span>conn.close(); &nbsp;&nbsp;</span>
    <li class=""><span>}&nbsp;</span><span class="keyword">catch</span><span>(SQLException&nbsp;ex){ &nbsp;&nbsp;</span>
    <li class="alt"><span>logger.error(</span><span class="string">"Cannot&nbsp;close&nbsp;connection"</span><span>); &nbsp;&nbsp;</span>
    <li class=""><span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;RuntimeException(ex); &nbsp;&nbsp;</span> </span>
    <li class="alt"><span>} &nbsp;&nbsp;</span>
    <li class=""><span>} &nbsp;&nbsp;</span>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>DBUtil是一个工具类来关闭Connection.有必要的说的使用的finally的重要性是不管程序是否碰到异常，它都会被执行。在上边的例子中，finally中关闭连接，如果在关闭连接的时候出现错误就抛出RuntimeException.<br />
<br />
<br />
<br />
2． 不要使用异常来控制流程（Never use exceptions for flow control）<br />
<br />
下边代码中，MaximumCountReachedException被用于控制流程：<br />
<br />
</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;useExceptionsForFlowControl()&nbsp;{ &nbsp;&nbsp;</span></span>
    <li class=""><span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span> </span>
    <li class="alt"><span><span class="keyword">while</span><span>&nbsp;(</span><span class="keyword">true</span><span>)&nbsp;{ &nbsp;&nbsp;</span> </span>
    <li class=""><span>increaseCount(); &nbsp;&nbsp;</span>
    <li class="alt"><span>} &nbsp;&nbsp;</span>
    <li class=""><span>}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(MaximumCountReachedException&nbsp;ex)&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>} &nbsp;&nbsp;</span>
    <li class=""><span><span class="comment">//Continue&nbsp;execution </span><span>&nbsp;&nbsp;</span> </span>
    <li class="alt"><span>} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;increaseCount() &nbsp;&nbsp;</span> </span>
    <li class=""><span><span class="keyword">throws</span><span>&nbsp;MaximumCountReachedException&nbsp;{ &nbsp;&nbsp;</span> </span>
    <li class="alt"><span><span class="keyword">if</span><span>&nbsp;(count&nbsp;&gt;=&nbsp;</span><span class="number">5000</span><span>) &nbsp;&nbsp;</span> </span>
    <li class=""><span><span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;MaximumCountReachedException(); &nbsp;&nbsp;</span> </span>
    <li class="alt"><span>}&nbsp; &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>上边的useExceptionsForFlowControl()用一个无限循环来增加count直到抛出异常，这种做法并没有说让代码不易读，但是它是程序执行效率降低。<br />
<br />
记住，只在要会抛出异常的地方进行异常处理。<br />
<br />
<br />
<br />
3． 不要忽略异常<br />
<br />
当有异常被抛出的时候，如果你不想恢复它，那么你要毫不犹豫的将其转换为unchecked exception，而不是用一个空的catch块或者什么也不做来忽略它，以至于从表面来看象是什么也没有发生一样。<br />
<br />
<br />
<br />
4． 不要捕获顶层的Exception<br />
<br />
unchecked exception都是RuntimeException的子类，RuntimeException又继承Exception,因此，如果单纯的捕获Exception,那么你同样也捕获了RuntimeException,如下代码：<br />
<br />
try{<br />
..<br />
}catch(Exception ex){<br />
}<br />
一旦你写出了上边的代码（注意catch块是空的），它将忽略所有的异常，包括unchecked exception.<br />
<br />
5． Log exceptions just once<br />
<br />
Logging the same exception stack trace more than once can confuse the programmer examining the stack trace about the original source of exception. So just log it once.<br />
</p>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/tastesnow/aggbug/257574.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tastesnow/" target="_blank">TracyLu</a> 2009-03-03 15:45 <a href="http://www.blogjava.net/tastesnow/archive/2009/03/03/257574.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>String和StringBuffer之概览（zz）</title><link>http://www.blogjava.net/tastesnow/archive/2009/02/14/254676.html</link><dc:creator>TracyLu</dc:creator><author>TracyLu</author><pubDate>Sat, 14 Feb 2009 08:22:00 GMT</pubDate><guid>http://www.blogjava.net/tastesnow/archive/2009/02/14/254676.html</guid><wfw:comment>http://www.blogjava.net/tastesnow/comments/254676.html</wfw:comment><comments>http://www.blogjava.net/tastesnow/archive/2009/02/14/254676.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tastesnow/comments/commentRss/254676.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tastesnow/services/trackbacks/254676.html</trackback:ping><description><![CDATA[<p>　　非可变对象一旦创建之后就不能再被改变，可变对象则可以在创建之后被改变。String对象是非可变对象，StringBuffer对象则是可变对象。为获得更佳的性能你需要根据实际情况小心谨慎地选择到底使用这两者中的某一个。下面的话题会作详细的阐述。（注意：这个章节假设读者已经具备<a class="channel_keylink" href="http://java.chinaitlab.com/" target="_blank">Java</a>的String和StringBuffer的相关基础知识。）<br />
&nbsp;<br />
创建字符串的较佳途径<br />
你可以按照以下方式创建字符串对象：<br />
1.&nbsp;String&nbsp;s1&nbsp;=&nbsp;"hello";&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s2&nbsp;=&nbsp;"hello";&nbsp;<br />
2.&nbsp;String&nbsp;s3&nbsp;=&nbsp;new&nbsp;String("hello");<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s4&nbsp;=&nbsp;new&nbsp;String("hello");<br />
&nbsp;<br />
上面哪种方式会带来更好的性能呢？下面的代码片断用来测量二者之间的区别。<br />
<br />
StringTest1.java<br />
package&nbsp;com.performance.string;<br />
/**&nbsp;This&nbsp;class&nbsp;shows&nbsp;the&nbsp;time&nbsp;taken&nbsp;for&nbsp;creation&nbsp;of<br />
&nbsp;*&nbsp;&nbsp;String&nbsp;literals&nbsp;and&nbsp;String&nbsp;objects.<br />
&nbsp;*/<br />
public&nbsp;class&nbsp;StringTest1&nbsp;{<br />
public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args){<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;create&nbsp;String&nbsp;literals<br />
&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;startTime&nbsp;=&nbsp;System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i=0;i&lt;50000;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s1&nbsp;=&nbsp;"hello";<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s2&nbsp;=&nbsp;"hello";<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;endTime&nbsp;=&nbsp;System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Time&nbsp;taken&nbsp;for&nbsp;creation&nbsp;of&nbsp;String&nbsp;literals&nbsp;:&nbsp;"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;(endTime&nbsp;-&nbsp;startTime)&nbsp;+&nbsp;"&nbsp;milli&nbsp;seconds"&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;create&nbsp;String&nbsp;objects&nbsp;using&nbsp;'new'&nbsp;keyword&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;startTime1&nbsp;=&nbsp;System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i=0;i&lt;50000;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s3&nbsp;=&nbsp;new&nbsp;String("hello");<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s4&nbsp;=&nbsp;new&nbsp;String("hello");<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;endTime1&nbsp;=&nbsp;System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Time&nbsp;taken&nbsp;for&nbsp;creation&nbsp;of&nbsp;String&nbsp;objects&nbsp;:&nbsp;"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;(endTime1&nbsp;-&nbsp;startTime1)+"&nbsp;milli&nbsp;seconds");<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
这段代码的输出：<br />
Time&nbsp;taken&nbsp;for&nbsp;creation&nbsp;of&nbsp;String&nbsp;literals&nbsp;:&nbsp;0&nbsp;milli&nbsp;seconds<br />
Time&nbsp;taken&nbsp;for&nbsp;creation&nbsp;of&nbsp;String&nbsp;objects&nbsp;:&nbsp;170&nbsp;milli&nbsp;seconds<br />
&nbsp;<br />
JVM是怎样处理字符串的呢？<br />
　　<a class="channel_keylink" href="http://java.chinaitlab.com/" target="_blank">Java</a>虚拟机会维护一个内部的滞留字符串对象的列表（唯一字符串的池）来避免在堆内存中产生重复的String对象。当JVM从class文件里加载字符串字面量并执行的时候，它会先检查一下当前的字符串是否已经存在于滞留字符串列表，如果已经存在，那就不会再创建一个新的String对象而是将引用指向已经存在的String对象，JVM会在内部为字符串字面量作这种检查，但并不会为通过new关键字创建的String对象作这种检查。当然你可以明确地使用String.intern()方法强制JVM为通过&nbsp;new关键字创建的String对象作这样的检查。这样可以强制JVM检查内部列表而使用已有的String对象。<br />
　　所以结论是，JVM会内在地为字符串字面量维护一些唯一的String对象，程序员不需要为字符串字面量而发愁，但是可能会被一些通过&nbsp;new关键字创建的String对象而困扰，不过他们可以使用intern()方法来避免在堆内存上创建重复的String对象来改善Java的运行性能。下一小节会向大家展示更多的信息。<br />
&nbsp;<br />
下图展示了未使用intern()方法来创建字符串的情况。<br />
&nbsp;<br />
string_creating_without_intern()&nbsp;method<br />
　　你可以自己使用==操作符和String.equals()方法来编码测试上面提到的区别。==操作符会返回true如果一些引用指向一个相同的对象但不会判断String对象的内容是否相同；String.equals()方法会返回true如果被操作的String对象的内容相同。对于上面的代码会有s1==s2，因为s1和s2两个引用指向同一个对象，对于上面的代码，s3.equals(s4)会返回true因为两个对象的内容都一样为&#8221;hello&#8221;。你可以从上图看出这种机制。在这里有三个独立的包含了相同的内容（&#8221;hello&#8221;）的对象，实际上我们不需要这么三个独立的对象——&nbsp;因为要运行它们的话既浪费时间又浪费内存。<br />
&nbsp;<br />
　　那么怎样才能确保String对象不会重复呢？下一个话题会涵盖对于内建String机制的兴趣。<br />
&nbsp;<br />
滞留字符串的优化作用<br />
　　同一个字符串对象被重复地创建是不必要的，String.intern&nbsp;()方法可以避免这种情况。下图说明了String.intern()方法是如何工作的，String.intern()方法检查字符串对象的存在性，如果需要的字符串对象已经存在，那么它会将引用指向已经存在的字符串对象而不是重新创建一个。下图描绘了使用了intern()方法的字符串字面量和字符串对象的创建情况。<br />
&nbsp;<br />
string_creating_with_intern()&nbsp;method<br />
下面的例程帮助大家了解String.intern()方法的重要性。<br />
StringTest2.java<br />
&nbsp;<br />
package&nbsp;com.performance.string;<br />
//&nbsp;This&nbsp;class&nbsp;shows&nbsp;the&nbsp;use&nbsp;of&nbsp;intern()&nbsp;method&nbsp;to&nbsp;improve&nbsp;performance<br />
public&nbsp;class&nbsp;StringTest2&nbsp;{<br />
public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args){<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;create&nbsp;String&nbsp;references&nbsp;like&nbsp;s1,s2,s3...so&nbsp;on..<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;variables[]&nbsp;=&nbsp;new&nbsp;String[50000];<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(&nbsp;int&nbsp;i=0;i&lt;variables.length;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;variables[i]&nbsp;=&nbsp;"s"+i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;create&nbsp;String&nbsp;literals<br />
&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;startTime0&nbsp;=&nbsp;System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i=0;i&lt;variables.length;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;variables[i]&nbsp;=&nbsp;"hello";<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;endTime0&nbsp;=&nbsp;System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Time&nbsp;taken&nbsp;for&nbsp;creation&nbsp;of&nbsp;String&nbsp;literals&nbsp;:&nbsp;"<br />
&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;(endTime0&nbsp;-&nbsp;startTime0)&nbsp;+&nbsp;"&nbsp;milli&nbsp;seconds"&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;create&nbsp;String&nbsp;objects&nbsp;using&nbsp;'new'&nbsp;keyword&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;startTime1&nbsp;=&nbsp;System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i=0;i&lt;variables.length;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;variables[i]&nbsp;=&nbsp;new&nbsp;String("hello");<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;endTime1&nbsp;=&nbsp;System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Time&nbsp;taken&nbsp;for&nbsp;creation&nbsp;of&nbsp;String&nbsp;objects&nbsp;with&nbsp;'new'&nbsp;key&nbsp;word&nbsp;:&nbsp;"<br />
&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;(endTime1&nbsp;-&nbsp;startTime1)+"&nbsp;milli&nbsp;seconds");<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;intern&nbsp;String&nbsp;objects&nbsp;with&nbsp;intern()&nbsp;method&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;startTime2&nbsp;=&nbsp;System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i=0;i&lt;variables.length;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;variables[i]&nbsp;=&nbsp;new&nbsp;String("hello");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;variables[i]&nbsp;=&nbsp;variables[i].intern();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;endTime2&nbsp;=&nbsp;System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Time&nbsp;taken&nbsp;for&nbsp;creation&nbsp;of&nbsp;String&nbsp;objects&nbsp;with&nbsp;intern():&nbsp;"<br />
&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;(endTime2&nbsp;-&nbsp;startTime2)+"&nbsp;milli&nbsp;seconds");<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
这是上面那段代码的输出结果：<br />
Time&nbsp;taken&nbsp;for&nbsp;creation&nbsp;of&nbsp;String&nbsp;literals&nbsp;:&nbsp;0&nbsp;milli&nbsp;seconds<br />
Time&nbsp;taken&nbsp;for&nbsp;creation&nbsp;of&nbsp;String&nbsp;objects&nbsp;with&nbsp;'new'&nbsp;key&nbsp;word&nbsp;:&nbsp;160&nbsp;milli&nbsp;seconds<br />
Time&nbsp;taken&nbsp;for&nbsp;creation&nbsp;of&nbsp;String&nbsp;objects&nbsp;with&nbsp;intern():&nbsp;60&nbsp;milli&nbsp;seconds<br />
&nbsp;<br />
连接字符串时候的优化技巧<br />
　　你可以使用+操作符或者String.concat()或者StringBuffer.append()等办法来连接多个字符串，那一种办法具有最佳的性能呢？<br />
　　如何作出选择取决于两种情景，第一种情景是需要连接的字符串是在编译期决定的还是在运行期决定的，第二种情景是你使用的是&nbsp;StringBuffer还是String。通常程序员会认为StringBuffer.append()方法会优于+操作符或&nbsp;String.concat()方法，但是在一些特定的情况下这个假想是不成立的。<br />
&nbsp;<br />
1)&nbsp;第一种情景：编译期决定相对于运行期决定<br />
请看下面的StringTest3.java代码和输出结果。<br />
<br />
package&nbsp;com.performance.string;<br />
/**&nbsp;This&nbsp;class&nbsp;shows&nbsp;the&nbsp;time&nbsp;taken&nbsp;by&nbsp;string&nbsp;concatenation&nbsp;at&nbsp;compile&nbsp;time&nbsp;and&nbsp;run&nbsp;time.*/<br />
public&nbsp;class&nbsp;StringTest3&nbsp;{<br />
&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args){<br />
&nbsp;&nbsp;&nbsp;&nbsp;//Test&nbsp;the&nbsp;String&nbsp;Concatination<br />
&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;startTime&nbsp;=&nbsp;System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i=0;i&lt;5000;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;result&nbsp;=&nbsp;"This&nbsp;is"+&nbsp;"testing&nbsp;the"+&nbsp;"difference"+&nbsp;"between"+<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"String"+&nbsp;"and"+&nbsp;"StringBuffer";<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;endTime&nbsp;=&nbsp;System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Time&nbsp;taken&nbsp;for&nbsp;string&nbsp;concatenation&nbsp;using&nbsp;+&nbsp;operator&nbsp;:&nbsp;"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;(endTime&nbsp;-&nbsp;startTime)+&nbsp;"&nbsp;milli&nbsp;seconds");<br />
&nbsp;&nbsp;&nbsp;&nbsp;//Test&nbsp;the&nbsp;StringBuffer&nbsp;Concatination<br />
&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;startTime1&nbsp;=&nbsp;System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i=0;i&lt;5000;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;result&nbsp;=&nbsp;new&nbsp;StringBuffer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.append("This&nbsp;is");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.append("testing&nbsp;the");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.append("difference");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.append("between");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.append("String");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.append("and");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.append("StringBuffer");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;endTime1&nbsp;=&nbsp;System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Time&nbsp;taken&nbsp;for&nbsp;String&nbsp;concatenation&nbsp;using&nbsp;StringBuffer&nbsp;:&nbsp;"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;(endTime1&nbsp;-&nbsp;startTime1)+&nbsp;"&nbsp;milli&nbsp;seconds");<br />
&nbsp;&nbsp;}<br />
}<br />
这是上面的代码的输出结果：<br />
Time&nbsp;taken&nbsp;for&nbsp;String&nbsp;concatenation&nbsp;using&nbsp;+&nbsp;operator&nbsp;:&nbsp;0&nbsp;milli&nbsp;seconds<br />
Time&nbsp;taken&nbsp;for&nbsp;String&nbsp;concatenation&nbsp;using&nbsp;StringBuffer&nbsp;:&nbsp;50&nbsp;milli&nbsp;seconds<br />
很有趣地，+操作符居然比StringBuffer.append()方法要快，为什么呢？<br />
&nbsp;<br />
　　这里编译器的优化起了关键作用，编译器像下面举例的那样简单地在编译期连接多个字符串。它使用编译期决定取代运行期决定，在你使用new关键字来创建String对象的时候也是如此。<br />
&nbsp;<br />
编译前：<br />
String&nbsp;result&nbsp;=&nbsp;"This&nbsp;is"+"testing&nbsp;the"+"difference"+"between"+"String"+"and"+"StringBuffer";<br />
编译后：<br />
String&nbsp;result&nbsp;=&nbsp;"This&nbsp;is&nbsp;testing&nbsp;the&nbsp;difference&nbsp;between&nbsp;String&nbsp;and&nbsp;StringBuffer";<br />
<br />
这里String对象在编译期就决定了而StringBuffer对象是在运行期决定的。运行期决定需要额外的开销当字符串的值无法预先知道的时候，编译期决定作用于字符串的值可以预先知道的时候，下面是一个例子。<br />
&nbsp;<br />
编译前：<br />
public&nbsp;String&nbsp;getString(String&nbsp;str1,String&nbsp;str2)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;str1+str2;<br />
}<br />
编译后：<br />
return&nbsp;new&nbsp;StringBuffer().append(str1).append(str2).toString();<br />
运行期决定需要更多的时间来运行。<br />
&nbsp;<br />
2)&nbsp;第二种情景：使用StringBuffer取代String<br />
看看下面的代码你会发现与情景一相反的结果——连接多个字符串的时候StringBuffer要比String快。<br />
StringTest4.java<br />
&nbsp;<br />
package&nbsp;com.performance.string;<br />
/**&nbsp;This&nbsp;class&nbsp;shows&nbsp;the&nbsp;time&nbsp;taken&nbsp;by&nbsp;string&nbsp;concatenation<br />
using&nbsp;+&nbsp;operator&nbsp;and&nbsp;StringBuffer&nbsp;&nbsp;*/<br />
public&nbsp;class&nbsp;StringTest4&nbsp;{<br />
&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args){<br />
&nbsp;&nbsp;&nbsp;&nbsp;//Test&nbsp;the&nbsp;String&nbsp;Concatenation&nbsp;using&nbsp;+&nbsp;operator<br />
&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;startTime&nbsp;=&nbsp;System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;result&nbsp;=&nbsp;"hello";<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i=0;i&lt;1500;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;+=&nbsp;"hello";<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;endTime&nbsp;=&nbsp;System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Time&nbsp;taken&nbsp;for&nbsp;string&nbsp;concatenation&nbsp;using&nbsp;+&nbsp;operator&nbsp;:&nbsp;"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;(endTime&nbsp;-&nbsp;startTime)+&nbsp;"&nbsp;milli&nbsp;seconds");<br />
&nbsp;&nbsp;&nbsp;&nbsp;//Test&nbsp;the&nbsp;String&nbsp;Concatenation&nbsp;using&nbsp;StringBuffer<br />
&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;startTime1&nbsp;=&nbsp;System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;result1&nbsp;=&nbsp;new&nbsp;StringBuffer("hello");<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i=0;i&lt;1500;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result1.append("hello");<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;endTime1&nbsp;=&nbsp;System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Time&nbsp;taken&nbsp;for&nbsp;string&nbsp;concatenation&nbsp;using&nbsp;StringBuffer&nbsp;:&nbsp;&nbsp;"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;(endTime1&nbsp;-&nbsp;startTime1)+&nbsp;"&nbsp;milli&nbsp;seconds");<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
这是上面的代码的输出结果：<br />
Time&nbsp;taken&nbsp;for&nbsp;string&nbsp;concatenation&nbsp;using&nbsp;+&nbsp;operator&nbsp;:&nbsp;280&nbsp;milli&nbsp;seconds<br />
Time&nbsp;taken&nbsp;for&nbsp;String&nbsp;concatenation&nbsp;using&nbsp;StringBuffer&nbsp;:&nbsp;0&nbsp;milli&nbsp;seconds<br />
看得出StringBuffer.append()方法要比+操作符要快得多，为什么呢？<br />
<br />
　　原因是两者都是在运行期决定字符串对象，但是+操作符使用不同于StringBuffer.append()的规则通过String和StringBuffer来完成字符串连接操作。（译注：什么样的规则呢？）<br />
&nbsp;<br />
借助StringBuffer的初始化过程的优化技巧<br />
　　你可以通过StringBuffer的构造函数来设定它的初始化容量，这样可以明显地提升性能。这里提到的构造函数是StringBuffer(int&nbsp;length)，length参数表示当前的StringBuffer能保持的字符数量。你也可以使用ensureCapacity(int&nbsp;minimumcapacity)方法在StringBuffer对象创建之后设置它的容量。首先我们看看StringBuffer的缺省行为，然后再找出一条更好的提升性能的途径。<br />
&nbsp;<br />
StringBuffer的缺省行为：<br />
　　StringBuffer在内部维护一个字符数组，当你使用缺省的构造函数来创建StringBuffer对象的时候，因为没有设置初始化字符长度，StringBuffer的容量被初始化为16个字符，也就是说缺省容量就是16个字符。当StringBuffer达到最大容量的时候，它会将自身容量增加到当前的2倍再加2，也就是（2*旧值+2）。<br />
　　如果你使用缺省值，初始化之后接着往里面追加字符，在你追加到第16个字符的时候它会将容量增加到34（2*16+2），当追加到34个字符的时候就会将容量增加到70（2*34+2）。无论何事只要StringBuffer到达它的最大容量它就不得不创建一个新的字符数组然后重新将旧字符和新字符都拷贝一遍——这也太昂贵了点。所以总是给StringBuffer设置一个合理的初始化容量值是错不了的，这样会带来立竿见影的性能增益。<br />
　　我利用两个StringBuffer重新测试了上面的StringTest4.java代码，一个未使用初始化容量值而另一个使用了。这次我追加了50000个&#8217;hello&#8217;对象没有使用+操作符。区别是我使用StringBuffer(250000)的构造函数来初始化第二个&nbsp;StringBuffer了。<br />
&nbsp;<br />
输出结果如下：<br />
Time&nbsp;taken&nbsp;for&nbsp;String&nbsp;concatenation&nbsp;using&nbsp;StringBuffer&nbsp;with&nbsp;out&nbsp;setting&nbsp;size:&nbsp;280&nbsp;milli&nbsp;seconds<br />
Time&nbsp;taken&nbsp;for&nbsp;String&nbsp;concatenation&nbsp;using&nbsp;StringBuffer&nbsp;with&nbsp;setting&nbsp;size:&nbsp;0&nbsp;milli&nbsp;seconds<br />
StringBuffer初始化过程的调整的作用由此可见一斑。所以，使用一个合适的容量值来初始化StringBuffer永远都是一个最佳的建议。<br />
&nbsp;<br />
关键点<br />
1.&nbsp;无论何时只要可能的话使用字符串字面量来常见字符串而不是使用new关键字来创建字符串。<br />
2.&nbsp;无论何时当你要使用new关键字来创建很多内容重复的字符串的话，请使用String.intern()方法。<br />
3.&nbsp;+操作符会为字符串连接提供最佳的性能——当字符串是在编译期决定的时候。<br />
4.&nbsp;如果字符串在运行期决定，使用一个合适的初期容量值初始化的StringBuffer会为字符串连接提供最佳的性能。 </p>
<img src ="http://www.blogjava.net/tastesnow/aggbug/254676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tastesnow/" target="_blank">TracyLu</a> 2009-02-14 16:22 <a href="http://www.blogjava.net/tastesnow/archive/2009/02/14/254676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的XML解析</title><link>http://www.blogjava.net/tastesnow/archive/2009/02/13/254566.html</link><dc:creator>TracyLu</dc:creator><author>TracyLu</author><pubDate>Fri, 13 Feb 2009 08:03:00 GMT</pubDate><guid>http://www.blogjava.net/tastesnow/archive/2009/02/13/254566.html</guid><wfw:comment>http://www.blogjava.net/tastesnow/comments/254566.html</wfw:comment><comments>http://www.blogjava.net/tastesnow/archive/2009/02/13/254566.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tastesnow/comments/commentRss/254566.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tastesnow/services/trackbacks/254566.html</trackback:ping><description><![CDATA[ <img src ="http://www.blogjava.net/tastesnow/aggbug/254566.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tastesnow/" target="_blank">TracyLu</a> 2009-02-13 16:03 <a href="http://www.blogjava.net/tastesnow/archive/2009/02/13/254566.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何创建目录</title><link>http://www.blogjava.net/tastesnow/archive/2009/02/13/254556.html</link><dc:creator>TracyLu</dc:creator><author>TracyLu</author><pubDate>Fri, 13 Feb 2009 06:53:00 GMT</pubDate><guid>http://www.blogjava.net/tastesnow/archive/2009/02/13/254556.html</guid><wfw:comment>http://www.blogjava.net/tastesnow/comments/254556.html</wfw:comment><comments>http://www.blogjava.net/tastesnow/archive/2009/02/13/254556.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tastesnow/comments/commentRss/254556.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tastesnow/services/trackbacks/254556.html</trackback:ping><description><![CDATA[<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_535_Open_Image" onclick="this.style.display='none'; Codehighlighter1_20_535_Open_Text.style.display='none'; Codehighlighter1_20_535_Closed_Image.style.display='inline'; Codehighlighter1_20_535_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_20_535_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_20_535_Closed_Text.style.display='none'; Codehighlighter1_20_535_Open_Image.style.display='inline'; Codehighlighter1_20_535_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;MakeDir</span><span id="Codehighlighter1_20_535_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_535_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_50_170_Open_Image" onclick="this.style.display='none'; Codehighlighter1_50_170_Open_Text.style.display='none'; Codehighlighter1_50_170_Closed_Image.style.display='inline'; Codehighlighter1_50_170_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_50_170_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_50_170_Closed_Text.style.display='none'; Codehighlighter1_50_170_Open_Image.style.display='inline'; Codehighlighter1_50_170_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&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()</span><span id="Codehighlighter1_50_170_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_50_170_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;String&nbsp;fileString&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">c:\\test\\do\\test.txt</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;File&nbsp;file&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;File(</span><span style="color: #000000">"</span><span style="color: #000000">fileString</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;MakeDir makeDir = new MakeDir();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; makeDir.make(file);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_202_533_Open_Image" onclick="this.style.display='none'; Codehighlighter1_202_533_Open_Text.style.display='none'; Codehighlighter1_202_533_Closed_Image.style.display='inline'; Codehighlighter1_202_533_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_202_533_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_202_533_Closed_Text.style.display='none'; Codehighlighter1_202_533_Open_Image.style.display='inline'; Codehighlighter1_202_533_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&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;make(File&nbsp;file)</span><span id="Codehighlighter1_202_533_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_202_533_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_226_330_Open_Image" onclick="this.style.display='none'; Codehighlighter1_226_330_Open_Text.style.display='none'; Codehighlighter1_226_330_Closed_Image.style.display='inline'; Codehighlighter1_226_330_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_226_330_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_226_330_Closed_Text.style.display='none'; Codehighlighter1_226_330_Open_Image.style.display='inline'; Codehighlighter1_226_330_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(file.exists())</span><span id="Codehighlighter1_226_330_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_226_330_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_253_289_Open_Image" onclick="this.style.display='none'; Codehighlighter1_253_289_Open_Text.style.display='none'; Codehighlighter1_253_289_Closed_Image.style.display='inline'; Codehighlighter1_253_289_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_253_289_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_253_289_Closed_Text.style.display='none'; Codehighlighter1_253_289_Open_Image.style.display='inline'; Codehighlighter1_253_289_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(file.isFile())</span><span id="Codehighlighter1_253_289_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_253_289_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;&nbsp;&nbsp;&nbsp;file.delete();<br />
<img id="Codehighlighter1_294_323_Open_Image" onclick="this.style.display='none'; Codehighlighter1_294_323_Open_Text.style.display='none'; Codehighlighter1_294_323_Closed_Image.style.display='inline'; Codehighlighter1_294_323_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_294_323_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_294_323_Closed_Text.style.display='none'; Codehighlighter1_294_323_Open_Image.style.display='inline'; Codehighlighter1_294_323_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">else</span><span id="Codehighlighter1_294_323_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_294_323_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;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_335_528_Open_Image" onclick="this.style.display='none'; Codehighlighter1_335_528_Open_Text.style.display='none'; Codehighlighter1_335_528_Closed_Image.style.display='inline'; Codehighlighter1_335_528_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_335_528_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_335_528_Closed_Text.style.display='none'; Codehighlighter1_335_528_Open_Image.style.display='inline'; Codehighlighter1_335_528_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">else</span><span id="Codehighlighter1_335_528_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_335_528_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_378_407_Open_Image" onclick="this.style.display='none'; Codehighlighter1_378_407_Open_Text.style.display='none'; Codehighlighter1_378_407_Closed_Image.style.display='inline'; Codehighlighter1_378_407_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_378_407_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_378_407_Closed_Text.style.display='none'; Codehighlighter1_378_407_Open_Image.style.display='inline'; Codehighlighter1_378_407_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(file.getParentFile().exists())</span><span id="Codehighlighter1_378_407_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_378_407_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;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_412_519_Open_Image" onclick="this.style.display='none'; Codehighlighter1_412_519_Open_Text.style.display='none'; Codehighlighter1_412_519_Closed_Image.style.display='inline'; Codehighlighter1_412_519_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_412_519_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_412_519_Closed_Text.style.display='none'; Codehighlighter1_412_519_Open_Image.style.display='inline'; Codehighlighter1_412_519_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">else</span><span id="Codehighlighter1_412_519_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_412_519_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;&nbsp;&nbsp;&nbsp;make(file.getParentFile());<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file.getParentFile.mkdir();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&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>
  <img src ="http://www.blogjava.net/tastesnow/aggbug/254556.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tastesnow/" target="_blank">TracyLu</a> 2009-02-13 14:53 <a href="http://www.blogjava.net/tastesnow/archive/2009/02/13/254556.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java常用包</title><link>http://www.blogjava.net/tastesnow/archive/2009/02/12/254392.html</link><dc:creator>TracyLu</dc:creator><author>TracyLu</author><pubDate>Thu, 12 Feb 2009 06:41:00 GMT</pubDate><guid>http://www.blogjava.net/tastesnow/archive/2009/02/12/254392.html</guid><wfw:comment>http://www.blogjava.net/tastesnow/comments/254392.html</wfw:comment><comments>http://www.blogjava.net/tastesnow/archive/2009/02/12/254392.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tastesnow/comments/commentRss/254392.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tastesnow/services/trackbacks/254392.html</trackback:ping><description><![CDATA[<p>1、java.lang包：java的核心类库，包含了运行java程序必不可少的系统类，如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等，系统缺省加载这个包<br />
2、java.io包：java语言的标准输入/输出类库，如基本输入/输出流、文件输入/输出、过滤输入/输出流等等<br />
3、java.util包：包含如处理时间的date类，处理变成数组的Vector类，以及stack和HashTable类<br />
4、java.awt包：构建图形用户界面(GUI)的类库，低级绘图操作Graphics类，图形界面组件和布局管理如Checkbox类、Container类、LayoutManger接口等，以及界面用户交互控制和事件响应，如Event类<br />
5、java.awt.image包：处理和操纵来自于网上的图片的java工具类库<br />
6、java.applet包<br />
7、java.net包：实现网络功能的类库有Socket类、ServerSocket类<br />
8、java.lang.reflect包：提供用于反射对象的工具<br />
9、java.util.zip包：实现文件压缩功能<br />
10、java.awt.datatransfer包：处理数据传输的工具类，包括剪贴板，字符串发送器等<br />
11、java.awt.event包<br />
12、java.sql包：实现JDBC的类库</p>
   <img src ="http://www.blogjava.net/tastesnow/aggbug/254392.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tastesnow/" target="_blank">TracyLu</a> 2009-02-12 14:41 <a href="http://www.blogjava.net/tastesnow/archive/2009/02/12/254392.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于ClassLoader</title><link>http://www.blogjava.net/tastesnow/archive/2009/02/12/254385.html</link><dc:creator>TracyLu</dc:creator><author>TracyLu</author><pubDate>Thu, 12 Feb 2009 06:21:00 GMT</pubDate><guid>http://www.blogjava.net/tastesnow/archive/2009/02/12/254385.html</guid><wfw:comment>http://www.blogjava.net/tastesnow/comments/254385.html</wfw:comment><comments>http://www.blogjava.net/tastesnow/archive/2009/02/12/254385.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tastesnow/comments/commentRss/254385.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tastesnow/services/trackbacks/254385.html</trackback:ping><description><![CDATA[类介绍&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/lang/ClassLoader.html#name" name="name">http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/lang/ClassLoader.html#name</a>&nbsp;<br />
<br />
相关文章：http://blog.csdn.net/luanxj/archive/2008/02/15/2096657.aspx<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://tech.ccidnet.com/art/5929/20071106/1266135_1.html<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.jdon.com/article/15456.html<br />
  <img src ="http://www.blogjava.net/tastesnow/aggbug/254385.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tastesnow/" target="_blank">TracyLu</a> 2009-02-12 14:21 <a href="http://www.blogjava.net/tastesnow/archive/2009/02/12/254385.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>呼噜语录一</title><link>http://www.blogjava.net/tastesnow/archive/2009/02/11/254291.html</link><dc:creator>TracyLu</dc:creator><author>TracyLu</author><pubDate>Wed, 11 Feb 2009 10:01:00 GMT</pubDate><guid>http://www.blogjava.net/tastesnow/archive/2009/02/11/254291.html</guid><wfw:comment>http://www.blogjava.net/tastesnow/comments/254291.html</wfw:comment><comments>http://www.blogjava.net/tastesnow/archive/2009/02/11/254291.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tastesnow/comments/commentRss/254291.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tastesnow/services/trackbacks/254291.html</trackback:ping><description><![CDATA[越来越发现，设计是一种艺术，需要很细致的推敲，拿构造函数举例，设计一个类的构造函数也很讲究，是否应该公开默认的构造函数，该类是否有在创建时就必须非空的属性，这些非空的属性中，哪些是必须有意义的数据，哪些必须赋值，哪些默认即可，哪些属性不能更改，哪些属性是系统生成的并且对用户透明，都会影响构造器的设计。
  <img src ="http://www.blogjava.net/tastesnow/aggbug/254291.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tastesnow/" target="_blank">TracyLu</a> 2009-02-11 18:01 <a href="http://www.blogjava.net/tastesnow/archive/2009/02/11/254291.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于序列化和文件的输入/输出（笔记二）</title><link>http://www.blogjava.net/tastesnow/archive/2009/01/09/250749.html</link><dc:creator>TracyLu</dc:creator><author>TracyLu</author><pubDate>Fri, 09 Jan 2009 14:35:00 GMT</pubDate><guid>http://www.blogjava.net/tastesnow/archive/2009/01/09/250749.html</guid><wfw:comment>http://www.blogjava.net/tastesnow/comments/250749.html</wfw:comment><comments>http://www.blogjava.net/tastesnow/archive/2009/01/09/250749.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tastesnow/comments/commentRss/250749.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tastesnow/services/trackbacks/250749.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>将字符串写入文本文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong>写入文本数据与写入对象是很类似的，你可以使用FileWriter来代替FileOutputStream。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例子如下：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><span style="color: rgb(0, 128, 128);">&nbsp;1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);">&nbsp;serial;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span><span style="color: rgb(0, 0, 0);"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span><span style="color: rgb(0, 0, 0);"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;java.io.FileWriter;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span><span style="color: rgb(0, 0, 0);"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;java.io.IOException;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span><span style="color: rgb(0, 0, 0);"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span><span style="color: rgb(0, 0, 0);"><img id="Codehighlighter1_73_107_Open_Image" onclick="this.style.display='none'; Codehighlighter1_73_107_Open_Text.style.display='none'; Codehighlighter1_73_107_Closed_Image.style.display='inline'; Codehighlighter1_73_107_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_73_107_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_73_107_Closed_Text.style.display='none'; Codehighlighter1_73_107_Open_Image.style.display='inline'; Codehighlighter1_73_107_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_73_107_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);">/**&nbsp;*/</span><span id="Codehighlighter1_73_107_Open_Text"><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span><span style="color: rgb(0, 128, 0);"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span><span style="color: rgb(0, 128, 0);"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;</span><span style="color: rgb(128, 128, 128);">@author</span><span style="color: rgb(0, 128, 0);">&nbsp;Administrator<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span><span style="color: rgb(0, 128, 0);"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;</span><span style="color: rgb(0, 128, 0);">*/</span></span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">10</span><span style="color: rgb(0, 0, 0);"><img id="Codehighlighter1_133_422_Open_Image" onclick="this.style.display='none'; Codehighlighter1_133_422_Open_Text.style.display='none'; Codehighlighter1_133_422_Closed_Image.style.display='inline'; Codehighlighter1_133_422_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_133_422_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_133_422_Closed_Text.style.display='none'; Codehighlighter1_133_422_Open_Image.style.display='inline'; Codehighlighter1_133_422_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></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);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;WriteAFile&nbsp;</span><span id="Codehighlighter1_133_422_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
</span><span style="color: rgb(0, 128, 128);">11</span><span style="color: rgb(0, 0, 0);"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: rgb(0, 128, 128);">12</span><span style="color: rgb(0, 0, 0);"><img id="Codehighlighter1_179_420_Open_Image" onclick="this.style.display='none'; Codehighlighter1_179_420_Open_Text.style.display='none'; Codehighlighter1_179_420_Closed_Image.style.display='inline'; Codehighlighter1_179_420_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_179_420_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_179_420_Closed_Text.style.display='none'; Codehighlighter1_179_420_Open_Image.style.display='inline'; Codehighlighter1_179_420_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: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_179_420_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
</span><span style="color: rgb(0, 128, 128);">13</span><span style="color: rgb(0, 0, 0);"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileWriter&nbsp;fw;<br />
</span><span style="color: rgb(0, 128, 128);">14</span><span style="color: rgb(0, 0, 0);"><img id="Codehighlighter1_216_344_Open_Image" onclick="this.style.display='none'; Codehighlighter1_216_344_Open_Text.style.display='none'; Codehighlighter1_216_344_Closed_Image.style.display='inline'; Codehighlighter1_216_344_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_216_344_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_216_344_Closed_Text.style.display='none'; Codehighlighter1_216_344_Open_Image.style.display='inline'; Codehighlighter1_216_344_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span id="Codehighlighter1_216_344_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
</span><span style="color: rgb(0, 128, 128);">15</span><span style="color: rgb(0, 0, 0);"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fw&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;FileWriter(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Storage.txt</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
</span><span style="color: rgb(0, 128, 128);">16</span><span style="color: rgb(0, 0, 0);"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fw.write(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Hu&nbsp;lu&nbsp;is&nbsp;coming&nbsp;back</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
</span><span style="color: rgb(0, 128, 128);">17</span><span style="color: rgb(0, 0, 0);"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fw.close();<br />
</span><span style="color: rgb(0, 128, 128);">18</span><span style="color: rgb(0, 0, 0);"><img id="Codehighlighter1_369_413_Open_Image" onclick="this.style.display='none'; Codehighlighter1_369_413_Open_Text.style.display='none'; Codehighlighter1_369_413_Closed_Image.style.display='inline'; Codehighlighter1_369_413_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_369_413_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_369_413_Closed_Text.style.display='none'; Codehighlighter1_369_413_Open_Image.style.display='inline'; Codehighlighter1_369_413_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);">&nbsp;(IOException&nbsp;ex)&nbsp;</span><span id="Codehighlighter1_369_413_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
</span><span style="color: rgb(0, 128, 128);">19</span><span style="color: rgb(0, 0, 0);"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />
</span><span style="color: rgb(0, 128, 128);">20</span><span style="color: rgb(0, 0, 0);"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">21</span><span style="color: rgb(0, 0, 0);"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: rgb(0, 128, 128);">22</span><span style="color: rgb(0, 0, 0);"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">23</span><span style="color: rgb(0, 0, 0);"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;输入/输出相关的操作都必须包含在try/catch块中。在工程目录下找到"storage.txt"，内容即为"Hu lu is coming back"。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  <img src ="http://www.blogjava.net/tastesnow/aggbug/250749.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tastesnow/" target="_blank">TracyLu</a> 2009-01-09 22:35 <a href="http://www.blogjava.net/tastesnow/archive/2009/01/09/250749.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于序列化和文件的输入/输出（笔记一）</title><link>http://www.blogjava.net/tastesnow/archive/2009/01/09/250729.html</link><dc:creator>TracyLu</dc:creator><author>TracyLu</author><pubDate>Fri, 09 Jan 2009 11:16:00 GMT</pubDate><guid>http://www.blogjava.net/tastesnow/archive/2009/01/09/250729.html</guid><wfw:comment>http://www.blogjava.net/tastesnow/comments/250729.html</wfw:comment><comments>http://www.blogjava.net/tastesnow/archive/2009/01/09/250729.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tastesnow/comments/commentRss/250729.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tastesnow/services/trackbacks/250729.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对象有状态和行为两种属性。行为存在于类中，而状态存在于个别的对象中。存储状态的选择有很多种，这可能要看你如何使用存储下来的状态而决定。下面我们讨论两种选项：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果只有自己写的Java程序会用到这些数据：用序列化（Se...&nbsp;&nbsp;<a href='http://www.blogjava.net/tastesnow/archive/2009/01/09/250729.html'>阅读全文</a><img src ="http://www.blogjava.net/tastesnow/aggbug/250729.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tastesnow/" target="_blank">TracyLu</a> 2009-01-09 19:16 <a href="http://www.blogjava.net/tastesnow/archive/2009/01/09/250729.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2009年 新的开始</title><link>http://www.blogjava.net/tastesnow/archive/2009/01/08/250474.html</link><dc:creator>TracyLu</dc:creator><author>TracyLu</author><pubDate>Thu, 08 Jan 2009 04:58:00 GMT</pubDate><guid>http://www.blogjava.net/tastesnow/archive/2009/01/08/250474.html</guid><wfw:comment>http://www.blogjava.net/tastesnow/comments/250474.html</wfw:comment><comments>http://www.blogjava.net/tastesnow/archive/2009/01/08/250474.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/tastesnow/comments/commentRss/250474.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tastesnow/services/trackbacks/250474.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;新的一年，新的开始。希望我和呼噜都能有更大的进步，不管是在学习，工作，还是生活中。嘻嘻 <img src="/CuteSoft_Client/CuteEditor/images/emteeth.gif" align="absMiddle" border="0"  alt="" />&nbsp; 这个博客将专门记录我学习Java的过程，希望自己能坚持下去。</p>
&nbsp;&nbsp;&nbsp;&nbsp; 目前我对Java的理解，还处于初级阶段，知道Java的基本概念，会写一些简单的程序。不过，万丈高楼平地起，相信自己坚持的话，一定能有所收获。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  <img src ="http://www.blogjava.net/tastesnow/aggbug/250474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tastesnow/" target="_blank">TracyLu</a> 2009-01-08 12:58 <a href="http://www.blogjava.net/tastesnow/archive/2009/01/08/250474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>