<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>lelong</title>
    <description></description>
    <link>http://lelong.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>Facade模式：关键特征</title>
        <author>lelong</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lelong.javaeye.com">lelong</a>&nbsp;
          链接：<a href="http://lelong.javaeye.com/blog/215597" style="color:red;">http://lelong.javaeye.com/blog/215597</a>&nbsp;
          发表时间: 2008年07月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>意图： 希望简化原有系统的使用方式，需要定义自己的接口</p>
<p>&nbsp;</p>
<p>问题： 只需要使用某个复杂系统的子集，或者，需要以一种特殊的方式与系统交互</p>
<p>&nbsp;</p>
<p>解决方案： Facade 为原有系统的客户提供了一个新的接口</p>
<p>&nbsp;</p>
<p>参与者与协作者 ： 为客户提供的一个简化接口，使系统更容易使用</p>
<p>&nbsp;</p>
<p>效果： Facade模式简化了对所需子系统的使用过程。但是，由于Facade并不完整，因此客户可能无法使用某些功能。</p>
<p>&nbsp;</p>
<p>实现： 定义一个（或多个）具备所需接口的新类</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 让新的类使用原有的系统</p>
          <br/>
          <span style="color:red;">
            <a href="http://lelong.javaeye.com/blog/215597#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 16 Jul 2008 23:28:35 +0800</pubDate>
        <link>http://lelong.javaeye.com/blog/215597</link>
        <guid>http://lelong.javaeye.com/blog/215597</guid>
      </item>
      <item>
        <title>面向对象分析</title>
        <author>lelong</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lelong.javaeye.com">lelong</a>&nbsp;
          链接：<a href="http://lelong.javaeye.com/blog/215593" style="color:red;">http://lelong.javaeye.com/blog/215593</a>&nbsp;
          发表时间: 2008年07月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>一 分析方法之功能分解 functional decomposition<br />原理： 将问题或功能分解成多个小问题或小功能，然后逐一解决</p>
<p>缺点：a.导致让一个&ldquo;主&rdquo;程序负责控制程序，主程序的责任太多（可使用委托delegation解决）。同时，引</p>
<p>起另外一个问题，低内聚weak cohesion 紧耦合tight coopling<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.应对需求变化会比较无力。模块化肯定有助于提供代码的可理解性，而容易理解将使代码更容易维护</p>
<p>，但是模块化并不总是有助于代码应对所有可能遇到的变化</p>
<p>优点：符合人类惯性思维方式，直观，代码也容易理解</p>
<p><br />但至此也就引入了对象设计方式</p>
<p>二 分析方法之二责任转移<br />1.视角 a.概念：该软件要负责什么(概念模型)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.规约：关注软件的接口，而不是实现，怎样使用软件<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.实现：代码的本身，软件怎么履行自己的责任</p>
<p>与功能分解的区别在于：用职责或责任来思考问题，而不是用功能来思考问题</p>
          <br/>
          <span style="color:red;">
            <a href="http://lelong.javaeye.com/blog/215593#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 16 Jul 2008 23:20:38 +0800</pubDate>
        <link>http://lelong.javaeye.com/blog/215593</link>
        <guid>http://lelong.javaeye.com/blog/215593</guid>
      </item>
      <item>
        <title>mysql日期和时间函数</title>
        <author>lelong</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lelong.javaeye.com">lelong</a>&nbsp;
          链接：<a href="http://lelong.javaeye.com/blog/214318" style="color:red;">http://lelong.javaeye.com/blog/214318</a>&nbsp;
          发表时间: 2008年07月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1.当前日期： SELECT CURDATE() ;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;显示：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2008-07-13</p>
<p>2.怎么在Mysql日期字段中的默认值，用一个日期函数来生成系统时间</p>
<p>TimeStamp用来自动记录数据行的创建或修改时间 </p>
<p>+---------------+----------------+ &nbsp; <br />&nbsp; 　　| &nbsp; 列类型　　　　| &nbsp; 显示格式　　　 &nbsp; | &nbsp; <br />&nbsp; 　　| &nbsp; TIMESTAMP(14) &nbsp; | &nbsp; YYYYMMDDHHMMSS &nbsp; |　 &nbsp; <br />&nbsp; 　　| &nbsp; TIMESTAMP(12) &nbsp; | &nbsp; YYMMDDHHMMSS　 &nbsp; | &nbsp; <br />&nbsp; 　　| &nbsp; TIMESTAMP(10) &nbsp; | &nbsp; YYMMDDHHMM　　 &nbsp; | &nbsp; <br />&nbsp; 　　| &nbsp; TIMESTAMP(8)　| &nbsp; YYYYMMDD　　　 &nbsp; | &nbsp; <br />&nbsp; 　　| &nbsp; TIMESTAMP(6)　| &nbsp; YYMMDD　　　　 &nbsp; | &nbsp; <br />&nbsp; 　　| &nbsp; TIMESTAMP(4)　| &nbsp; YYMM　　　　　 &nbsp; | &nbsp; <br />&nbsp; 　　| &nbsp; TIMESTAMP(2)　| &nbsp; YY　　　　　　 &nbsp; | &nbsp; <br />&nbsp; 　　+---------------+----------------+&nbsp;&nbsp; <br />3.等于当前时间，使用now()函数</p>
<p>UPDATE &nbsp; test &nbsp; SET&nbsp;&nbsp;date1=null,date2=NOW() &nbsp; WHERE &nbsp; id=3;&nbsp;&nbsp; </p>
<p>&nbsp;</p>
<p>4 格式化时间，使用DATE_FROMAT()函数</p>
<p>DATE_FORMAT(date1,'%Y-%m-%d &nbsp; %H:%i:%s') ==2002-11-14 &nbsp; 09:40:09 </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://lelong.javaeye.com/blog/214318#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 13 Jul 2008 11:23:52 +0800</pubDate>
        <link>http://lelong.javaeye.com/blog/214318</link>
        <guid>http://lelong.javaeye.com/blog/214318</guid>
      </item>
      <item>
        <title>JAVA日期加减运算 </title>
        <author>lelong</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lelong.javaeye.com">lelong</a>&nbsp;
          链接：<a href="http://lelong.javaeye.com/blog/211854" style="color:red;">http://lelong.javaeye.com/blog/211854</a>&nbsp;
          发表时间: 2008年07月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1.用java.util.Calender来实现</p>
<pre name="code" class="java">Calendar calendar=Calendar.getInstance();   
 calendar.setTime(new Date());
  System.out.println(calendar.get(Calendar.DAY_OF_MONTH));//今天的日期 
  calendar.set(Calendar.DAY_OF_MONTH,calendar.get(Calendar.DAY_OF_MONTH)+1);//让日期加1   
  System.out.println(calendar.get(Calendar.DATE));//加1之后的日期Top</pre>
<p>&nbsp;</p>
<p>2.用java.text.SimpleDateFormat和java.util.Date来实现</p>
<pre name="code" class="java">Date d=new Date();   
          SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");   
          System.out.println("今天的日期："+df.format(d));   
          System.out.println("两天前的日期：" + df.format(new Date(d.getTime() - 2 * 24 * 60 * 60 * 1000)));   
          System.out.println("三天后的日期：" + df.format(new Date(d.getTime() + 3 * 24 * 60 * 60 * 1000)));</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://lelong.javaeye.com/blog/211854#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 05 Jul 2008 13:54:07 +0800</pubDate>
        <link>http://lelong.javaeye.com/blog/211854</link>
        <guid>http://lelong.javaeye.com/blog/211854</guid>
      </item>
      <item>
        <title>JAVA中转义字符</title>
        <author>lelong</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lelong.javaeye.com">lelong</a>&nbsp;
          链接：<a href="http://lelong.javaeye.com/blog/210185" style="color:red;">http://lelong.javaeye.com/blog/210185</a>&nbsp;
          发表时间: 2008年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="bvMsg">
<div>1.八进制转义序列：\ + 1到3位5数字；范围'\000'~'\377'</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \0：空字符</div>
<div>2.Unicode转义字符：\u + 四个十六进制数字；0~65535</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp; \u0000：空字符</div>
<div>3.特殊字符：就3个</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \"：双引号</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp; \'：单引号</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp; \\：反斜线</div>
<div>4.控制字符：5个</div>
<div>&nbsp;&nbsp;</div>
</div>
<div>\' 单引号字符 <br /><br />\\ 反斜杠字符 <br /><br />\r 回车 <br /><br />\n 换行 <br /><br />\f 走纸换页 <br /><br />\t 横向跳格 <br /><br />\b 退格 <br />
<p>点的转义：. ==&gt; u002E <br />美元符号的转义：$ ==&gt; u0024 <br />乘方符号的转义：^ ==&gt; u005E <br />左大括号的转义：{ ==&gt; u007B <br />左方括号的转义：[ ==&gt; u005B <br />左圆括号的转义：( ==&gt; u0028 <br />竖线的转义：| ==&gt; u007C <br />右圆括号的转义：) ==&gt; u0029 <br />星号的转义：* ==&gt; u002A <br />加号的转义：+ ==&gt; u002B <br />问号的转义：? ==&gt; u003F <br />反斜杠的转义： ==&gt; u005C </p>
<p>&nbsp;</p>
<p>例如：</p>
<div class="bar">
<div class="tools">Java代码 <a href="http://hydex.javaeye.com/blog/156929#" title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"></a></div>
</div>
<p class="dp-highlighter">&nbsp;</p>
<pre name="code" class="java">String str2="a&amp;b&amp;c";
String strs[]=str2.split("&amp;");
for(String str:strs){
     System.out.println(str);
}</pre>
<p>&nbsp;</p>
<p>不会输出a,b,c,只有这样处理才可以：</p>
<div class="bar">
<div class="tools">Java代码 <a href="http://hydex.javaeye.com/blog/156929#" title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"></a></div>
</div>
<span>
<pre name="code" class="java">String str2="a&amp;b&amp;c";       
String strs[]=str2.split("\\u0024");       
for(String str:strs){       
    System.out.println(str);       
}   </pre>
<p class="dp-highlighter">&nbsp;</p>
</span></div>
          <br/>
          <span style="color:red;">
            <a href="http://lelong.javaeye.com/blog/210185#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Jul 2008 15:55:16 +0800</pubDate>
        <link>http://lelong.javaeye.com/blog/210185</link>
        <guid>http://lelong.javaeye.com/blog/210185</guid>
      </item>
      <item>
        <title>中文文件名附件下载解决办法</title>
        <author>lelong</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lelong.javaeye.com">lelong</a>&nbsp;
          链接：<a href="http://lelong.javaeye.com/blog/210137" style="color:red;">http://lelong.javaeye.com/blog/210137</a>&nbsp;
          发表时间: 2008年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>很简单，就如下设定：</p>
<p>&nbsp;</p>
<p>附件下载 <br />response.setContentType("application/octet-stream; CHARSET=utf8"); <br />文件名的设置 <br />response.setHeader("Content-Disposition","<span class="hilite1"><span class="hilite1"><span style="background-color: #ffff00;">attachment</span></span></span>; <span class="hilite2"><span class="hilite2"><span style="background-color: #55ff55;">filename</span></span></span>="+URLEncoder.encode(<span class="hilite2"><span class="hilite2"><span style="background-color: #55ff55;">fileName</span></span></span>,"UTF-8"));</p>
          <br/>
          <span style="color:red;">
            <a href="http://lelong.javaeye.com/blog/210137#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Jul 2008 14:10:56 +0800</pubDate>
        <link>http://lelong.javaeye.com/blog/210137</link>
        <guid>http://lelong.javaeye.com/blog/210137</guid>
      </item>
      <item>
        <title>使用java.text包格式化数字和日期</title>
        <author>lelong</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lelong.javaeye.com">lelong</a>&nbsp;
          链接：<a href="http://lelong.javaeye.com/blog/208493" style="color:red;">http://lelong.javaeye.com/blog/208493</a>&nbsp;
          发表时间: 2008年06月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">在</span><span lang="EN-US">C</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">中可以使用类似</span><span lang="EN-US">printf(&ldquo;%d %8.2f\n&rdquo;, 1001, 52.335)</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的方法实现格式化输出，可是</span><span lang="EN-US">Java</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">中的</span><span lang="EN-US">System.out.println()</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">并没有对应的功能。要格式化输出，必须使用</span><span lang="EN-US">java.text</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">包中的类来实现类似的操作（要不怎么体现面向对象的优越性呢，不过据说</span><span lang="EN-US">jdk1.5</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">准备又补上）。当然了，</span><span lang="EN-US">java.text</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">包的功能还是很强大的，奇怪的是很多书中都没有涉及，而一般谁又有工夫整天去看</span><span lang="EN-US">API</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">？</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">注意：由于这里说得很简略，因此请参照下面的</span><span lang="EN-US">Demo</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">程序。</span><span lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">格式化数字</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">在</span><span lang="EN-US">NumberFormat</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">类中为我们提供了格式化</span><span lang="EN-US">4</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">种数字的方法：整数、小数、货币和百分比，通过工厂方法</span><span lang="EN-US">getNumberInstance, getNumberIntance, getCurrencyInstance, getPercentInstance</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">方法获得相应的实例对象就行。例如我们要以字符串表示人民币</span><span lang="EN-US">88888.88</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">元，这样来写就行：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US">NumberFormat nf = NumberFormat.getCurrencyInstance();</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US">System.out.println(nf.format(88888.88));</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">定制格式化数字</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">可是对于稍微复杂一点的需求，</span><span lang="EN-US">NumberFormat</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">就满足不了了，幸好</span><span lang="EN-US">java</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">还提供了</span><span lang="EN-US">DecimalFormat</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">实现定制的格式化。要使用</span><span lang="EN-US">DecimalFormat</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">对象，必须提供给它提供一个格式化的模式</span><span lang="EN-US">(pattern)</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US">String pattern = &hellip;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US">DecimalFormat df = new DecimalFormat(pattern);</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">或者：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US">DecimalFormat df = new DecimalFormat();</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US">df. applyPattern(pattern);</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">然后就调用它的</span><span lang="EN-US">format</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">方法就行了。</span><span lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">所以关键就是这个模式怎么定义。在</span><span lang="EN-US">DecimalFormat</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">类的</span><span lang="EN-US">JavaDoc</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">中有模式的语法表示，不过很难说清楚（是我说不清楚，呵呵），请看看</span><span lang="EN-US">Demo</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">自己多试试吧。下面是模式中某些字符的含义表：</span></p>
<table class="MsoNormalTable" cellspacing="3" border="0" cellpadding="0" style="mso-cellspacing: 2.2pt; mso-padding-alt: 0cm 0cm 0cm 0cm;">
<tbody>
<tr style="mso-yfti-irow: 0;">
<td valign="top" width="58" style="width: 43.45pt; background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">字符<span lang="EN-US"></span></span></p>
</td>
<td valign="top" style="background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">含义<span lang="EN-US"></span></span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 1;">
<td valign="top" width="58" style="width: 43.45pt; background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">0 </span></p>
</td>
<td valign="top" style="background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">一位数字，这一位缺失显示为<span lang="EN-US">0。用来补零</span></span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 2;">
<td valign="top" width="58" style="background: #eeeeff; width: 43.45pt; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;"># </span></p>
</td>
<td valign="top" style="background: #eeeeff; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">一位数字<span lang="EN-US">, 这一位缺失就不显示 </span></span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 3;">
<td valign="top" width="58" style="width: 43.45pt; background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">. </span></p>
</td>
<td valign="top" style="background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">小数点，不用多说了吧<span lang="EN-US"></span></span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 4;">
<td valign="top" width="58" style="width: 43.45pt; background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">, </span></p>
</td>
<td valign="top" style="background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">千位分隔符<span lang="EN-US"></span></span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 5;">
<td valign="top" width="58" style="background: #eeeeff; width: 43.45pt; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">E </span></p>
</td>
<td valign="top" style="background: #eeeeff; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">科学计数法<span lang="EN-US"></span></span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 6; mso-yfti-lastrow: yes;">
<td valign="top" width="58" style="background: #eeeeff; width: 43.45pt; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">% </span></p>
</td>
<td valign="top" style="background: #eeeeff; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">百分比<span lang="EN-US"></span></span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">格式化日期</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">把日期转化为字符串最简单的方法就是调用</span><span lang="EN-US">Date</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">类的</span><span lang="EN-US">toString</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">或者</span><span lang="EN-US">toLocaleString</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">方法：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US">System.out.println(new Date());<span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">输出：</span><span lang="EN-US">2004-8-7 8:16:14</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">。可是如果我们想把月和日补成</span><span lang="EN-US">2</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">位不要时分秒</span><span lang="EN-US">2004-08-07</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，这就不灵了。</span><span lang="EN-US">java.text.DateFormat</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">提供了大量的工厂方法：</span><span lang="EN-US">getDateInstance(int style), getTimeInstance(int style), getDateTimeInstance(int dateStyle, int timeStyle)</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">等等。其中</span><span lang="EN-US">style</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">必须是</span><span lang="EN-US">DateFormat.LONG, DateFormat.MEDIUM, DateFormat.SHORT</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">之一。</span><span lang="EN-US">Demo</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">中的</span><span lang="EN-US">defaultDateFormat</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">方法作了一个简单的实验。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">定制格式化日期：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">同样，</span><span lang="EN-US">java.text.SimpleDateFormat</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">可以通过模式</span><span lang="EN-US">(pattern)</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">实现定制格式化：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US">String pattern = &hellip;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US">SimpleDateFormat df = new SimpleDateFormat(pattern);</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">或者：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US">SimpleDateFormat df = new SimpleDateFormat();</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US">df. applyPattern(pattern);</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">下面是</span><span lang="EN-US">SimpleDateFormat</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的</span><span lang="EN-US">javadoc</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">中的一个模式符号简表：</span></p>
<table class="MsoNormalTable" cellspacing="3" border="0" cellpadding="0" style="mso-cellspacing: 2.2pt; mso-padding-alt: 0cm 0cm 0cm 0cm;">
<tbody>
<tr style="mso-yfti-irow: 0;">
<td width="47" style="width: 34.9pt; background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">符号<span lang="EN-US"></span></span></p>
</td>
<td width="111" style="width: 83.2pt; background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">意义<span lang="EN-US"></span></span></p>
</td>
<td style="background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">合法数值<span lang="EN-US"></span></span></p>
</td>
<td style="background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">示例<span lang="EN-US"></span></span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 1;">
<td width="47" style="background: #eeeeff; width: 34.9pt; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">y </span></p>
</td>
<td width="111" style="background: #eeeeff; width: 83.2pt; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">Year </span></p>
</td>
<td style="background: #eeeeff; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;"><a href="http://blog.csdn.net/tools/jdk14docs/api/java/text/SimpleDateFormat.html#year#year">Year</a> </span></p>
</td>
<td style="background: #eeeeff; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">1996; 96 </span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 2;">
<td width="47" style="width: 34.9pt; background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">M </span></p>
</td>
<td width="111" style="width: 83.2pt; background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">Month in year </span></p>
</td>
<td style="background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;"><a href="http://blog.csdn.net/tools/jdk14docs/api/java/text/SimpleDateFormat.html#month#month">Month</a> </span></p>
</td>
<td style="background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">July; Jul; 07 </span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 3;">
<td width="47" style="width: 34.9pt; background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">d </span></p>
</td>
<td width="111" style="width: 83.2pt; background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">Day in month </span></p>
</td>
<td style="background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;"><a href="http://blog.csdn.net/tools/jdk14docs/api/java/text/SimpleDateFormat.html#number#number">Number</a> </span></p>
</td>
<td style="background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">10 </span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 4;">
<td width="47" style="background: #eeeeff; width: 34.9pt; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">a </span></p>
</td>
<td width="111" style="background: #eeeeff; width: 83.2pt; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">Am/pm marker </span></p>
</td>
<td style="background: #eeeeff; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;"><a href="http://blog.csdn.net/tools/jdk14docs/api/java/text/SimpleDateFormat.html#text#text">Text</a> </span></p>
</td>
<td style="background: #eeeeff; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">PM </span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 5;">
<td width="47" style="width: 34.9pt; background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">H </span></p>
</td>
<td width="111" style="width: 83.2pt; background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">Hour in day (0-23) </span></p>
</td>
<td style="background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;"><a href="http://blog.csdn.net/tools/jdk14docs/api/java/text/SimpleDateFormat.html#number#number">Number</a> </span></p>
</td>
<td style="background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">0 </span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 6;">
<td width="47" style="background: #eeeeff; width: 34.9pt; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">h </span></p>
</td>
<td width="111" style="background: #eeeeff; width: 83.2pt; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">Hour in am/pm (1-12) </span></p>
</td>
<td style="background: #eeeeff; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;"><a href="http://blog.csdn.net/tools/jdk14docs/api/java/text/SimpleDateFormat.html#number#number">Number</a> </span></p>
</td>
<td style="background: #eeeeff; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">12 </span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 7;">
<td width="47" style="width: 34.9pt; background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">m </span></p>
</td>
<td width="111" style="width: 83.2pt; background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">Minute in hour </span></p>
</td>
<td style="background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;"><a href="http://blog.csdn.net/tools/jdk14docs/api/java/text/SimpleDateFormat.html#number#number">Number</a> </span></p>
</td>
<td style="background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">30 </span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 8;">
<td width="47" style="background: #eeeeff; width: 34.9pt; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">s </span></p>
</td>
<td width="111" style="background: #eeeeff; width: 83.2pt; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">Second in minute </span></p>
</td>
<td style="background: #eeeeff; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;"><a href="http://blog.csdn.net/tools/jdk14docs/api/java/text/SimpleDateFormat.html#number#number">Number</a> </span></p>
</td>
<td style="background: #eeeeff; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">55 </span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 9;">
<td width="47" style="width: 34.9pt; background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">S </span></p>
</td>
<td width="111" style="width: 83.2pt; background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">Millisecond </span></p>
</td>
<td style="background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;"><a href="http://blog.csdn.net/tools/jdk14docs/api/java/text/SimpleDateFormat.html#number#number">Number</a> </span></p>
</td>
<td style="background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">978 </span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 10;">
<td width="47" style="background: #eeeeff; width: 34.9pt; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">z </span></p>
</td>
<td width="111" style="background: #eeeeff; width: 83.2pt; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">Time zone </span></p>
</td>
<td style="background: #eeeeff; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;"><a href="http://blog.csdn.net/tools/jdk14docs/api/java/text/SimpleDateFormat.html#timezone#timezone">General time zone</a> </span></p>
</td>
<td style="background: #eeeeff; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">Pacific Standard Time; PST; GMT-08:00 </span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 11; mso-yfti-lastrow: yes;">
<td width="47" style="width: 34.9pt; background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">Z </span></p>
</td>
<td width="111" style="width: 83.2pt; background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">Time zone </span></p>
</td>
<td style="background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;"><a href="http://blog.csdn.net/tools/jdk14docs/api/java/text/SimpleDateFormat.html#rfc822timezone#rfc822timezone">RFC 822 time zone</a> </span></p>
</td>
<td style="background-color: transparent; border: #d4d0c8; padding: 0cm;">
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体;">-0800 </span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">注意的是，符号的大小写意义是不同的，符号的个数也会导致输出不一样。例如用</span><span lang="EN-US">MM</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">就会把</span><span lang="EN-US">1</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">月份显示成</span><span lang="EN-US">01</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">，而用</span><span lang="EN-US">M</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">则不会补零。对于年份，两个</span><span lang="EN-US">yy</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">会只输出两位年份，</span><span lang="EN-US">yyyy</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">则会输出</span><span lang="EN-US">4</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">位年份。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">实际上，上面的类还提供了很多其他方法，特别是用于本地化</span><span lang="EN-US">(Locale)</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">定制格式化的方法，以及从字符串表示转化为相应对象的</span><span lang="EN-US">parse</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">方法，还有把格式化结果附加到一个</span><span lang="EN-US">StringBuffer</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">的方法（应该是用来提高性能）。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">最后是一个小</span><span lang="EN-US">Demo</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">和输出结果：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US">TestFormat.java</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">：</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><strong><span lang="EN-US" style="font-size: 10pt; background: white; color: #7f0055; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;">import</span></strong><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"> <span style="color: black;">java.text.*;</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><strong><span lang="EN-US" style="font-size: 10pt; background: white; color: #7f0055; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;">import</span></strong><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"> <span style="color: black;">java.util.*;</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;">&nbsp;</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><strong><span lang="EN-US" style="font-size: 10pt; background: white; color: #7f0055; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;">public</span></strong><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"> <strong><span style="color: #7f0055;">class</span></strong> <span style="color: black;">TestFormat</span> <span style="color: black;">{</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;">&nbsp;</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">static</span></strong> <strong><span style="color: #7f0055;">void</span></strong> <span style="color: black;">main(String[]</span> <span style="color: black;">args)</span> <span style="color: black;">{</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black;">defaultNumberFormat();</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black;">System.out.println();</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black;">customNumberFormat();</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black;">System.out.println();</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black;">defaultDateFormat();</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black;">System.out.println();</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;">&nbsp;</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black;">customDateFormat();</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black;">System.out.println();</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span><span style="color: black;">}</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">static</span></strong> <strong><span style="color: #7f0055;">void</span></strong> <span style="color: black;">defaultNumberFormat()</span> <span style="color: black;">{</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #7f0055;">int</span></strong> <span style="color: black;">i</span> <span style="color: black;">=</span> <span style="color: black;">123456;</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #7f0055;">double</span></strong> <span style="color: black;">x</span> <span style="color: black;">=</span> <span style="color: black;">882323.23523;</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #7f0055;">double</span></strong> <span style="color: black;">p</span> <span style="color: black;">=</span> <span style="color: black;">0.528;</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #7f0055;">double</span></strong> <span style="color: black;">c</span> <span style="color: black;">=</span> <span style="color: black;">52.83;</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;">&nbsp;</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black;">NumberFormat</span> <span style="color: black;">nf</span> <span style="color: black;">=</span> <span style="color: black;">NumberFormat.getInstance();</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black;">System.out.println(</span><span style="color: #2a00ff;">"Integer "</span> <span style="color: black;">+</span> <span style="color: black;">i</span> <span style="color: black;">+</span> <span style="color: #2a00ff;">" is displayed as "</span> <span style="color: black;">+</span> <span style="color: black;">nf.format(i));</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black;">System.out.println(</span><span style="color: #2a00ff;">"Double "</span> <span style="color: black;">+</span> <span style="color: black;">x</span> <span style="color: black;">+</span> <span style="color: #2a00ff;">" is displayed as "</span> <span style="color: black;">+</span> <span style="color: black;">nf.format(x));</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;">&nbsp;</span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black;">NumberFormat</span> <span style="color: black;">nfInt</span> <span style="color: black;">=</span> <span style="color: black;">NumberFormat.getIntegerInstance();</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black;">System.out.println(</span><span style="color: #2a00ff;">"Integer "</span> <span style="color: black;">+</span> <span style="color: black;">i</span> <span style="color: black;">+</span> <span style="color: #2a00ff;">" is displayed as "</span> <span style="color: black;">+</span> <span style="color: black;">nfInt.format(i));</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black;">NumberFormat</span> <span style="color: black;">nfNumber</span> <span style="color: black;">=</span> <span style="color: black;">NumberFormat.getNumberInstance();</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black;">System.out.println(</span><span style="color: #2a00ff;">"Double "</span> <span style="color: black;">+</span> <span style="color: black;">x</span> <span style="color: black;">+</span> <span style="color: #2a00ff;">" is displayed as "</span> <span style="color: black;">+</span> <span style="color: black;">nfNumber.format(x));</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black;">NumberFormat</span> <span style="color: black;">nfPercent</span> <span style="color: black;">=</span> <span style="color: black;">NumberFormat.getPercentInstance();</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black;">System.out.println(</span><span style="color: #2a00ff;">"Percent "</span> <span style="color: black;">+</span> <span style="color: black;">p</span> <span style="color: black;">+</span> <span style="color: #2a00ff;">" is displayed as "</span> <span style="color: black;">+</span> <span style="color: black;">nfPercent.format(p));</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black;">NumberFormat</span> <span style="color: black;">nfCurrency</span> <span style="color: black;">=</span> <span style="color: black;">NumberFormat.getCurrencyInstance();</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black;">System.out.println(</span><span style="color: #2a00ff;">"Currency "</span> <span style="color: black;">+</span> <span style="color: black;">p</span> <span style="color: black;">+</span> <span style="color: #2a00ff;">" is displayed as "</span> <span style="color: black;">+</span> <span style="color: black;">nfCurrency.format(c));</span><span style="mso-tab-count: 1;">&nbsp;&nbsp; </span><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 2;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #3f7f5f;">//</span></span><span style="font-size: 10pt; background: white; color: #3f7f5f; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'; mso-highlight: white;">这里没有涉及相应的</span><span lang="EN-US" style="font-size: 10pt; background: white; color: #3f7f5f; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;">parse</span><span style="font-size: 10pt; background: white; color: #3f7f5f; font-family: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'; mso-highlight: white;">方法</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span><span style="color: black;">}</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span lang="EN-US" style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;"><span style="mso-tab-count: 1;">&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #7f0055;">public</span></strong> <strong><span style="color: #7f0055;">static</span></strong> <strong><span style="color: #7f0055;">void</span></strong> <span style="color: black;">customNumberFormat()</span> <span style="color: black;">{</span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'; mso-font-kerning: 0pt;"></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none;"><span style="font-size: 10pt; background: white; font-family: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white;" la</p>
          <br/>
          <span style="color:red;">
            <a href="http://lelong.javaeye.com/blog/208493#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 27 Jun 2008 09:48:06 +0800</pubDate>
        <link>http://lelong.javaeye.com/blog/208493</link>
        <guid>http://lelong.javaeye.com/blog/208493</guid>
      </item>
      <item>
        <title>java 二进制兼容性 (转载)</title>
        <author>lelong</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lelong.javaeye.com">lelong</a>&nbsp;
          链接：<a href="http://lelong.javaeye.com/blog/198008" style="color:red;">http://lelong.javaeye.com/blog/198008</a>&nbsp;
          发表时间: 2008年05月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="blog_content">
<p>现在做的一个项目需要维持两个版本，一个ASP(Application service provider)版本，一个光盘软件版本，两个版本的99%的都是一样，只是在授权上有一些不同。所以维护起来，我都是先在ASP版上做修改，然后再将修改后的类直接拷贝到光盘版的相应位置，覆盖原来的类文件。这样一般来说不会有问题，可以这次突然出现了很奇怪的问题，要么就提示找不到域，要么提示找不到方法，甚是奇怪，后来查出来问题在与我对java二进制兼容性的不理解，ASP版中有一个基类类存在一个域WebApplicationContext，而在改光盘版的时候我将其泛化为ApplicationContext了。我理所当然的以为原来光盘版用的ApplicationContext，那么用他的子类WebApplicationContext应当也没问题。后来把涉及到这样类似的类全部重新覆盖了一遍问题就解决了。</p>
<p>一、概述 </p>
<p>　　现在的软件越来越依赖于不同厂商、作者开发的共享组件，组件管理也变得越来越重要。在这方面，一个极其重要的问题是类的不同版本的二进制兼容性，即一个类改变时，新版的类是否可以直接替换原来的类，却不至于损坏其他由不同厂商/作者开发的依赖于该类的组件？ </p>
<p>　　Java二进制兼容性概念的主要目标是推动Internet上软件的广泛重用，同时它还避免了大多数C++环境面临的基础类脆弱性问题&mdash;&mdash;例如，在C++中，对域（数据成员或实例变量）的访问被编译成相对于对象起始位置的偏移量，在编译时就确定，如果类加入了新的域并重新编译，偏移量随之改变，原先编译的使用老版本类的代码就不能正常执行；虚拟方法调用也存在同样的问题。 </p>
<p>　　C++环境通常采用重新编译所有引用了被修改类的代码来解决问题。在Java中，少量开发环境也采用了同样的策略，但这种策略存在诸多限制。例如，假设有人开发了一个程序P，P引用了一个外部的库L1，但P的作者没有L1的源代码；L1要用到另一个库L2。现在L2改变了，但L1无法重新编译，所以P的开发和更改也受到了限制。 </p>
<p>　　为此，Java引入了二进制兼容的概念&mdash;&mdash;如果对L2的更改是二进制兼容的，那么更改后的L2、原来的L1和现在的P能够顺利连接，不会出现任何错误。 </p>
<p>　　首先来看一个简单的例子。Authorization和Hello类分别来自两个不同的作者，Authorization提供身份验证和授权服务，Hello类要调用Authorization类。 </p>
<p>package com.author1;</p>
<p>public class Authorization {<br />　public boolean authorized(String userName) {<br />　　return true;<br />　}<br />}</p>
<p><br />package com.author2;</p>
<p>import com.author1.*;</p>
<p>class Hello {<br />　public static void main(String arg[]) {<br />　　Authorization auth = new Authorization();<br />　　if(auth.authorized("MyName"))<br />　　　System.out.println("您已经通过验证");<br />　　else<br />　　　System.out.println("您未能通过身份验证");<br />　}<br />} </p>
<p>　　现在author1发布了Authorization类的2.0版，Hello类的作者author2希望在不更改原有Hello类的情况下使用新版的Authorization类。2.0版的Authorization要比原来的复杂不少： </p>
<p>package com.author1;</p>
<p>public class Authorization {<br />　public Token authorized(String userName, String pwd) {<br />　　return null;<br />　}<br />　private boolean determineAuthorization(String userName, String pwd) {<br />　　return true;<br />　}<br />　public boolean authorized(String userName) {<br />　　return true;<br />　}<br />　public class Token { }<br />}<br />&nbsp;</p>
<p>　　作者author1承诺2.0版的Authorization类与1.0版的类二进制兼容，或者说，2.0版的Authorization类仍旧满足1.0版的Authorization类与Hello类的约定。显然，author2编译Hello类时，无论使用Authorization类的哪一个版本都不会出错&mdash;&mdash;实际上，如果仅仅是因为Authorization类升级，Hello类根本无需重新编译，同一个Hello.class可以调用任意一个Authorization.class。 </p>
<p>　　这一特性并非Java独有。UNIX系统很早就有了共享对象库（.so文件）的概念，Windows系统也有动态链接库（.dll文件）的概念，只要替换一下文件就可以将一个库改换为另一个库。就象Java的二进制兼容特性一样，名称的连接是在运行时完成，而不是在代码的编译、连接阶段完成，而因它也同样拥有Java二进制兼容性所具有的优点，例如修改代码时只需重新编译一个库，便于对程序的某一部分进行修改。但是，Java的二进制兼容性还有其独特的优势： </p>
<p>　　⑴ Java将二进制兼容性的粒度从整个库（可能包含数十、数百个类）细化到了单个的类。 </p>
<p>　　⑵ 在C/C++之类的语言中，创建共享库通常是一种有意识的行为，一个应用软件一般不会提供很多共享库，哪些代码可以共享、哪些代码不可共享都是预先规划的结果。但在Java中，二进制兼容变成了一种与生俱来的天然特性。 </p>
<p>　　⑶ 共享对象只针对函数名称，但Java二进制兼容性考虑到了重载、函数签名、返回值类型。 </p>
<p>　　⑷ Java提供了更完善的错误控制机制，版本不兼容会触发异常，但可以方便地捕获和处理。相比之下，在C/C++中，共享库版本不兼容往往引起严重问题。 <br />二、类和对象的兼容性 </p>
<p>　　二进制兼容的概念在某些方面与对象串行化的概念相似，两者的目标也有一定的重叠。串行化一个Java对象时，类的名称、域的名称被写入到一个二进制输出流，串行化到磁盘的对象可以用类的不同版本来读取，前提是该类要求的名称、域都存在，且类型一致。下表比较了二进制兼容和串行化这两个概念。 </p>
<p>&nbsp; 对象串行化 二进制兼容 <br />适用于&nbsp; 对象 类&nbsp; <br />兼容要求 类，域 类，域，方法&nbsp; <br />删除操作导致不兼容 总是 不一定&nbsp; <br />修改访问属性（public，private等）后是否兼容 是 否&nbsp; <br />　 <br />　　二进制兼容和串行化都考虑到了类的版本不断更新的问题，允许为类加入方法和域，而且纯粹的加入不会影响程序的语义；类似地，单纯的结构修改，例如重新排列域或方法，也不会引起任何问题。 </p>
<p>　　三、延迟绑定 </p>
<p>　　理解二进制兼容的关键是要理解延迟绑定（Late Binding）。延迟绑定是指Java直到运行时才检查类、域、方法的名称，而不象C/C++的编译器那样在编译期间就清除了类、域、方法的名称，代之以偏移量数值&mdash;&mdash;这是Java二进制兼容得以发挥作用的关键。 </p>
<p>　　由于采用了延迟绑定技术，方法、域、类的名称直到运行时才解析，意味着只要域、方法等的名称（以及类型）一样，类的主体可以任意替换&mdash;&mdash;当然，这是一种简化的说法，还有其他一些规则制约Java类的二进制兼容性，例如访问属性（private、public等）以及是否为abstract（如果一个方法是抽象的，那么它肯定是不可直接调用的）等，但延迟绑定机制无疑是二进制兼容的核心所在。 </p>
<p>　　只有掌握了二进制兼容的规则，才能在改写类的时候保证其他类不受到影响。下面再来看一个例子，FrodoMail和SamMail是两个Email程序： </p>
<p>abstract class Message implements Classifiable { }</p>
<p>class EmailMessage extends Message {<br />　public boolean isJunk() { return false; }<br />}</p>
<p>interface Classifiable {<br />　boolean isJunk();<br />}</p>
<p>class FrodoMail {<br />　public static void main(String a[]) {<br />　　Classifiable m = new EmailMessage();<br />　　System.out.println(m.isJunk());<br />　}<br />}</p>
<p>class SamMail {<br />　public static void main(String a[]) {<br />　　EmailMessage m = new EmailMessage();<br />　　System.out.println(m.isJunk());<br />　}<br />} </p>
<p>　　如果我们重新实现Message，不再让它实现Classifiable接口，SamMail仍能正常运行，但FrodoMail会抛出异常：java.lang.<span class="hilite1"><span style="background-color: #ffff00;">IncompatibleClassChangeError</span></span> at FrodoMail.main。这是因为SamMail不要求EmailMessage是一个Classifiable，但FrodoMail却要求EmailMessage是一个Classifiable，编译FrodoMail得到的二进制.class文件引用了Classifiable这个接口名称。符合Classifiable接口定义的方法仍旧存在，但该类却根本没有提到Classifiable这个接口。 </p>
<p>　　四、兼容规则：方法 </p>
<p>　　从二进制兼容的角度来看，一个方法由四部分构成，分别是：方法的名称，返回值类型，参数，方法是否为static。改变这四个项目中的任意一个，对JVM而言它已经变成了另一个方法。 </p>
<p>　　以&ldquo;boolean isValid()&rdquo;方法为例，如果让isValid接收一个Date参数，变成&ldquo;boolean isValid(Date when)&rdquo;，修改后的类不能直接替换原有的类，试图访问新类的isValid()方法只能得到类似下面的错误信息：java.lang.NoSuchMethodError: Ticket.isValid()Z。JVM用&ldquo;()Z&rdquo;这个符号表示方法不接受参数且返回一个boolean。关于这一问题，下文将有更详细的说明。 </p>
<p>　　JVM利用一种称为虚拟方法调度（Virtual Method Dispatch）的技术判断要调用的方法体，它根据被调用方法所在的实际实例来决定要使用的方法体，可以看作一种扩展的延迟绑定策略。 </p>
<p>　　如果该类没有提供一个名称、参数、返回值类型完全匹配的方法，它就使用从超类继承的方法。由于Java的二进制兼容性规则，这种继承实际上在运行期间确定，而不是在编译期间确定。假设有下面几个类： </p>
<p>class Poem {<br />　void perform() {<br />　　System.out.println("白日依山尽");<br />　} }</p>
<p>class ShakespearePoem extends Poem {<br />　void perform() {<br />　　System.out.println("To be or not to be.");<br />　} }</p>
<p>class Hamlet extends ShakespearePoem { } </p>
<p>　　那么， </p>
<p>Poem poem = new Hamlet();<br />poem.perform(); </p>
<p>　　将输出&ldquo;To be or not to be.&rdquo;。这是因为perform的方法体是运行时才确定的。虽然Hamlet没有提供perform的方法体，但它从ShakespearePoem继承了一个。至于为何不用Poem定义的perform方法，那是因为ShakespearePoem定义的perform已经覆盖了它。我们可以随时修改Hamlet，却无需重新编译ShakespearePoem，如下例所示： </p>
<p>class Hamlet extends ShakespearePoem {<br />　System.out.println("连一支耗子都没闹");<br />} </p>
<p>　　现在，前面的例子将输出&ldquo;连一支耗子都没闹&rdquo;。但是， </p>
<p>Poem poem = new ShakespearePoem();<br />poem.perform(); </p>
<p>　　这段代码的输出结果是&ldquo;To be or not to be.&rdquo;如果我们删除ShakespearePoem的内容，同样的代码将输出&ldquo;白日依山尽&rdquo;。 </p>
<p>　　五、兼容规则：域 </p>
<p>　　域和方法不同。删除了类的一个方法后，它有可能通过继承获得一个具有同样名称、参数的不同方法，但域不能覆盖，这使得域在二进制兼容方面的表现也有所不同。 </p>
<p>　　例如，假设有下面三个类： </p>
<p>class Language {<br />　String greeting = "你好";<br />}</p>
<p>class German extends Language {<br />　String greeting = "Guten tag";<br />}</p>
<p>class French extends Language {<br />　String greeting = "Bon jour";<br />} </p>
<p>　　则&ldquo;void test1() { System.out.println(new French().greeting); }&rdquo;的输出结果是&ldquo;Bon jour&rdquo;，但是，&ldquo;void test2() { System.out.println(((Language) new French()).greeting); }&rdquo;的输出结果是&ldquo;你好&rdquo;。这是因为，实际访问的域依赖于实例的类型。在第一个输出例子中，test1访问的是一个French对象，所以输出结果是French的问候语；但在第二个例子中，虽然实际问的是一个French对象，但由于French对象已经被定型成Language对象，所以输出结果是Language的问候语。 </p>
<p>　　如果把上例的Language改成下面的形式： </p>
<p>class Language { } </p>
<p>　　再次运行test2（不重新编译），得到的结果是一个错误信息：java.lang.NoSuchFieldError: greeting。如果重新编译test2，则出现编译错误：cannot resolve symbol,symbol : variable greeting ,location: class Language System.out.println(((Language) new French()).greeting);。test1仍能正常运行，无需重新编译，因为它不需要Language包含的greeting变量。<br />六、深入理解延迟绑定 </p>
<p>　　下面几个类用于确定今天晚餐要喝的酒以及酒的温度。 </p>
<p>class Sommelier {<br />　Wine recommend(String meal) { ... }<br />}</p>
<p>abstract class Wine {<br />　// 推荐酒的温度<br />　abstract float temperature();<br />}</p>
<p>class RedWine extends Wine {<br />　// 红酒的温度通常略高于白酒<br />　float temperature() { return 63; }<br />}</p>
<p>class WhiteWine extends Wine {<br />　float temperature() { return 47; }<br />}</p>
<p>class Bordeaux extends RedWine {<br />　float temperature() { return 64; }<br />}</p>
<p>class Riesling extends WhiteWine {<br />　// 继承WhiteWine类的温度<br />} </p>
<p>　　下面的例子利用上面的类推荐一种酒： </p>
<p>void example1() {<br />　Wine wine = sommelier.recommend("duck");<br />　float temp = wine.temperature();<br />}&nbsp; </p>
<p>　　example1的第二个调用中，对于wine对象我们唯一可以肯定的是它是一个Wine，但可以是Bordeaux，也可以是Riesling或其他。另外，我们可以肯定wine对象不可能是Wine类本身的实例，因为Wine类是一个抽象类。编译源代码，源代码中的wine.temperature()调用将变成&ldquo;invokevirtual Wine/temperature ()F&rdquo;（class文件实际包含的是该文本表示形式的二进制代码，这种文本化的指令描述方法称为Oolong方法），它表示的是一个方法调用&mdash;&mdash;一个普通的（虚拟）方法调用，而不是一个静态调用。它调用的方法是Wine对象的temperature，右边的&ldquo;()F&rdquo;参数称为签名（signature），&ldquo;()F&rdquo;这个签名中的空括号表示方法不需要输入参数，F表示返回值是一个浮点数。 </p>
<p>　　JVM执行到该语句时，它调用的不一定是Wine定义的temperature方法。实际上，在本例中，JVM不可能调用Wine定义的temperature方法，因为该temperature方法是一个虚拟方法。JVM首先检查该对象所属的类，寻找一个符合invokevirtual语句指定的名称、签名特征的方法，如果找不到，则检查该类的超类，然后是超类的超类，直至找到一个合适的方法实现为止。 </p>
<p>　　在本例中，如果实际创建的对象是一个Bordeaux，则JVM调用Bordeaux类定义的temperature()F，该temperature()F方法将返回64。如果对象是一个Riesling，JVM在Riesling类中找不到适当的方法，所以继续查找WhiteWine类，在WhiteWine类中找到了一个合适的temperature()F方法，该方法的返回值是47。 </p>
<p>　　因此，查找可用方法的过程就是沿着类的继承树通过字符串匹配寻找合适方法的过程。了解这一原理有助于理解哪些修改不至于影响二进制兼容性。 </p>
<p>　　首先，重新排列类里面的方法显然不会影响到二进制兼容性&mdash;&mdash;这在C++程序中一般是不允许的，因为C++程序利用数值性偏移量而不是名称来确定要调用的方法。延迟绑定的关键优势正是在此，如果Java也使用方法在类里面的偏移量来确定要调用的方法，必然极大地限制二进制兼容机制的发挥，即使极小的改动也可能导致大量的代码需要重新编译。 </p>
<p>　　● 说明：也许有人会认为C++的处理方式要比Java的快，理由是根据数值性偏移量寻找方法肯定要比字符串匹配快。这种说法有一定道理，但只说明了类刚刚装入时的情况，此后Java的JIT编译器处理的也是数值性偏移量，而不再靠字符串匹配的办法寻找方法，因为类装入内存之后不可能再改变，所以这时的JIT编译器根本无须顾虑到二进制兼容问题。因此，至少在方法调用这一点上，Java没有理由一定比C++慢。 </p>
<p>　　其次，还有很重要的一点是：不仅仅编译时需要检查类的继承关系，而且运行时JVM还要检查类的继承关系。 </p>
<p>　　七、重载与覆盖 </p>
<p>　　通过前面的例子应当掌握的最重要的一点是：方法匹配的依据是方法的名字和签名的文本描述。下面我们为Sommelier类加入一些有关酒杯的方法： </p>
<p>Glass fetchGlass(Wine wine) { ... }<br />Glass fetchGlass(RedWine wine) { ... }<br />Glass fetchGlass(WhiteWine wine) { ... } </p>
<p>　　再来编译下面的代码： </p>
<p>void example2() {<br />　Glass glass;<br />　Wine wine = sommelier.recommend("duck");<br />　if(wine instanceof Bordeaux)<br />　　glass = sommelier.fetchGlass((Bordeaux) wine);<br />　else<br />　　glass = sommelier.fetchGlass(wine);<br />} </p>
<p>　　这里有两个fetchGlass调用：第一个调用的参数是一个Bordeaux对象，第二个调用的参数是一个Wine对象。Java编译器为这两行代码生成的指令分别是： </p>
<p>invokevirtual Sommelier/fetchGlass (LRedWine;)LGlass;<br />invokeVirtual Sommelier/fetchGlass (LWine;)LGlass; </p>
<p>　　注意这两者的区别是编译时确定的，而不是运行时确定的。JVM用&ldquo;L&lt;类名称&gt;&rdquo;这个符号表示一个类（就象前面例子中F的作用一样），这两个方法调用的输入参数是一个Wine或RedWine，返回值是一个Glass。 </p>
<p>　　Sommelier类没有提供输入参数是Bordeaux的方法，但有一个方法的输入参数是RedWine，所以第一个调用的方法签名就用了输入参数是RedWine的方法。至于第二个调用，编译时只知道参数是一个Wine对象，所以编译后的指令使用了输入参数是Wine对象的方法。对于第二个调用，即使sommelier推荐的是一个Riesling对象，实际调用的也不会是fetchGlass(whiteWine)，而是fetchGlass(wine)，原因也一样，被调用的方法总是一个签名完全匹配的方法。 </p>
<p>　　在这个例子中，fetchGlass方法的不同定义是重载（Overload）关系，而不是覆盖（Override）关系，因为这些fetchGlass方法的签名互不相同。如果一个方法要覆盖另一个方法，那么两者必须有相同的参数和返回值类型。虚拟方法调用是在运行时查找特定的类型，只针对覆盖的方法（拥有相同的签名），而不是针对重载的方法（拥有不同的签名）。重载方法的解析在编译时完成，覆盖方法的解析则在运行时进行。 </p>
<p>　　如果删除fetchGlass(RedWine)，不重新编译，再运行example2，JVM将提示错误信息：java.lang.NoSuchMethodError: Sommelier.fetchGlass (LRedWine;)LGlass;。 </p>
<p>　　但是，删除该方法之后，编译example2仍旧可以顺利通过，不过这时两个sommelier.fetchGlass调用将生成同样的invokevirtual指令，即：invokevirtual Sommelier/fetchGlass (LWine;)LGlass;。 </p>
<p>　　如果再次放回fetchGlass(RedWine)方法，除非重新编译example2，否则fetchGlass(RedWine)不会被调用，JVM将使用fetchGlass(wine)。当传入的对象是一个Riesling时，由于同样的原因，它也不会使用fetchGlass(WhiteWine)：因为编译时根本不能确定具体的对象。，所以选用了一个更一般化的方法。 </p>
<p>　　在&ldquo;invokevirtual Wine/temperature ()F&rdquo;这个指令中，JVM没有严格坚持使用Wine对象，而是自动寻找实际实现了temperature方法的对象；但在&ldquo;invokevirtual Sommelier/fetchGlass (LRedWine;)LGlass;&rdquo;指令中，JVM却很在乎RedWine。这是为什么呢？因为第一个指令中，Wine不属于方法签名，只是用于调用之前的类型检查；而在第二个指令中，RedWine属于方法签名的一部分，JVM必须根据方法签名和方法名称来寻找要调用的方法。 </p>
<p>　　假设我们为Sommelier类加入了一个fetchGlass方法： </p>
<p>class RedWineGlass extends Glass { ... }</p>
<p>RedWineGlass fetchGlass(RedWine wine) { ... } </p>
<p>　　再来看原来编译的example2，它用&ldquo;invokevirtual Sommelier/fetchGlass (LRedWine;)LGlass;&rdquo;指令调用fetchGlass方法。新加入的方法不会自动起作用，因为RedWineGlass和Glass是两种不同的类型。但是，如果我们重新编译example2，调用Bordeaux的例子将变成&ldquo;invokevirtual Sommelier/fetchGlass (LRedWine;)LRedWineGlass;&rdquo;。 </p>
<p>　　综上所述，我们可以总结出如下Java二进制兼容性的重要原则： </p>
<p>　　⑴ 编译时，Java编译器选择最匹配的方法签名。 </p>
<p>　　⑵ 运行时，JVM查找精确匹配的方法名称和签名。相似的名称和签名将被忽略。 </p>
<p>　　⑶ 如果找不到适当的方法，JVM抛出异常，且不装入指定的类。 </p>
<p>　　⑷ 重载的方法在编译时处理，覆盖的方法在运行时处理。</p>
<p>下面转一篇java二进制兼容性的文章，希望对大家有用。</p>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://lelong.javaeye.com/blog/198008#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 28 May 2008 21:01:12 +0800</pubDate>
        <link>http://lelong.javaeye.com/blog/198008</link>
        <guid>http://lelong.javaeye.com/blog/198008</guid>
      </item>
      <item>
        <title>批处理更改IP地址，网关,DNS </title>
        <author>lelong</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lelong.javaeye.com">lelong</a>&nbsp;
          链接：<a href="http://lelong.javaeye.com/blog/187886" style="color:red;">http://lelong.javaeye.com/blog/187886</a>&nbsp;
          发表时间: 2008年04月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Echo off <br />Netsh interface IP Set Address "本地连接" Static 192.168.1.203 255.255.255.0 192.168.1.1 1<br />Netsh interface IP Set dns "本地连接" static 192.168.1.1 primary<br />Echo changed ip to office 192.168.1.203 press any key ,go on <br />Pause </p>
<p><br />@Echo off <br />Netsh interface IP Set Address "本地连接" Static 192.168.0.203 255.255.255.0 192.168.0.1 1<br />Netsh interface IP Set dns "本地连接" static 192.168.0.1 primary<br />Echo changed ip to home 192.168.0.203 press any key ,go on <br />Pause </p>
          <br/>
          <span style="color:red;">
            <a href="http://lelong.javaeye.com/blog/187886#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 29 Apr 2008 09:31:01 +0800</pubDate>
        <link>http://lelong.javaeye.com/blog/187886</link>
        <guid>http://lelong.javaeye.com/blog/187886</guid>
      </item>
      <item>
        <title>解读absolute与relative(转载)</title>
        <author>lelong</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lelong.javaeye.com">lelong</a>&nbsp;
          链接：<a href="http://lelong.javaeye.com/blog/181719" style="color:red;">http://lelong.javaeye.com/blog/181719</a>&nbsp;
          发表时间: 2008年04月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>很多朋友问过我absolute与relative怎么区分，怎么用？我们都知道absolute是绝对定位，relative是相对定位，但是这个绝对与相对是什么意思呢？绝对是什么地方的绝对，相对又是相对于什么地方而言的呢？那他们又有什么样的特性，可以做出什么样的效果呢？关于两者之间又有什么样的技巧呢？下面我们就来一一解读。</p>
<p>Absolute，CSS中的写法是：position:absolute; 他的意思是绝对定位，他是参照浏览器的左上角，配合TOP、RIGHT、BOTTOM、LEFT(下面简称TRBL)进行定位，在没有设定TRBL，默认依据父级的做标原始点为原始点。如果设定TRBL并且父级没有设定position属性，那么当前的absolute则以浏览器左上角为原始点进行定位，位置将由TRBL决定。</p>
<p><img src="http://andymao.com/andy/upload/absolute.gif" height="260" alt="" width="520" /></p>
<p>&nbsp;</p>
<p>一般来讲，网页居中的话用Absolute就容易出错，因为网页一直是随着分辨率的大小自动适应的，而Absolute则会以浏览器的左上角为原始点，不会应为分辨率的变化而变化位置。很多人出错就在于这点上出错。而网页居左其特性与Relative很相似，但是还是有本质的区别的。</p>
<p>Relative，CSS中的写法是：position:relative;&nbsp; 他的意思是<span style="color: #cc0000;">相对</span>定位，他是参照父级的原始点为原始点，无父级则以文本流的顺序在上一个元素的底部为原始点，配合TRBL进行定位，当父级内有padding等CSS属性时，当前级的原始点则参照父级内容区的原始点进行定位。</p>
<p><img src="http://andymao.com/andy/upload/relative.gif" alt="" /></p>
<p>&nbsp;</p>
<p>有时我们还需要依靠z-index来设定容器的上下关系，数值越大越在最上面，数值范围是自然数。但是z-index也不是万能的，z-index也受到了等级的限制，关于这个等级的限制请查看《<a href="http://andymao.com/andy/post/69.html"><span style="color: #000000;">无法冲破的等级</span></a>》</p>
          <br/>
          <span style="color:red;">
            <a href="http://lelong.javaeye.com/blog/181719#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 11 Apr 2008 12:34:03 +0800</pubDate>
        <link>http://lelong.javaeye.com/blog/181719</link>
        <guid>http://lelong.javaeye.com/blog/181719</guid>
      </item>
      <item>
        <title>iBATIS.NET 访问Oracle数据库问题</title>
        <author>lelong</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lelong.javaeye.com">lelong</a>&nbsp;
          链接：<a href="http://lelong.javaeye.com/blog/165572" style="color:red;">http://lelong.javaeye.com/blog/165572</a>&nbsp;
          发表时间: 2008年02月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>我在iBATIS.NET的providers.config文件里看到有三种方式连接Oracle数据库 <br />1. provider name=&quot;oracle9.2&quot; <br />2. provider name=&quot;oracle10.1&quot; <br />3. provider name=&quot;oracleClient1.0&quot; <br /><br />我目前是用第三种provider name=&quot;oracleClient1.0&quot; 安装Oracle客户端，连接Oracle数据库, 配置如下：</p><pre name="code" class="xml">  &lt;database&gt;
    &lt;provider name=&quot;oracleClient1.0&quot; /&gt;
    &lt;dataSource name=&quot;NPetstore&quot; connectionString=&quot;Data Source=itdev1;user=east;password=east&quot;/&gt;
  &lt;/database&gt;</pre><p>&nbsp;</p><p>&nbsp;</p><p>那么，使用第一方式连接数据库provider name=&quot;oracle9.2&quot; ，在connectionString里应该怎么写呢，这种方式是否就不用安装Oracle客户端吗？</p><p>&nbsp;</p><p>我在google搜索了很久都找不到答案。。。。。</p><p>&nbsp;</p><p>在下菜鸟一名，请哪位大哥指点下迷津。。。。非常感谢。。。</p><p>&nbsp;</p><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://lelong.javaeye.com/blog/165572#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 27 Feb 2008 21:15:20 +0800</pubDate>
        <link>http://lelong.javaeye.com/blog/165572</link>
        <guid>http://lelong.javaeye.com/blog/165572</guid>
      </item>
      <item>
        <title>JDBC快速入门(转载)</title>
        <author>lelong</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lelong.javaeye.com">lelong</a>&nbsp;
          链接：<a href="http://lelong.javaeye.com/blog/155879" style="color:red;">http://lelong.javaeye.com/blog/155879</a>&nbsp;
          发表时间: 2008年01月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &bull;&nbsp;本文讲述JDBC(Java Database Connectivity) API(Application Program Interface) 的基本操作。读完本篇后，您将学会如何使用JDBC API建表、插入数值、查询、检索结果、修改表属性及内容、建立填充语句(prepared statements)、事物处理(perform transactions)和捕捉异常与错误。<br />________________________________________<br />概要<br />JDBC接口允许外部对SQL数据库进行管理以及对内容进行修改操作。通过使用第三方驱动，它们允许使用SQL语句调用。而且，Java内建的JDBC具有丰富的指令集合，使用起来相当的简单和直观。<br />举个例子：您正着手写一个Java程序，需要用到与数据库交互的操作。您得使用标准库提供的指令(方法)。首先建立一个数据库的连接。然后，您使用JDBC向数据库传送SQL语句，再处理返回的结果。最后关闭数据库的连接。 <br />________________________________________<br />建立连接<br />我要从什么地方下手呢？当然了，要先在您的机器上安装Java、JDBC和DBMS（数据库）。由于我想使用Oracle数据，所以我需要找到指定的驱动。先到Oracle官方网址看看，真的有，下载地址：<a href="http://www.oracle.com/technology/global/cn/software/tech/java/sqlj_jdbc/index.html">http://www.oracle.com/technology/global/cn/software/tech/java/sqlj_jdbc/index.html</a> 。<br />正如先前所说，在对数据库操作(access)之前，必须在程序(client)与数据库(server)之间建立一个连接。<br />&bull;&nbsp;加载指定的第三方驱动<br />为何要来这一手呢？为使操作更轻便、代码复用程度更高，API常被尽可能地设计成与版本及厂商无关。由于不同的关系型数据库具有不同的形为，我们得告诉所用的驱动，这样它们才能做出正确的行为。<br />下面是加载Oracle驱动的代码：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class.forName(&quot;oracle.jdbc.driver.OracleDriver&quot;)<br />&bull;&nbsp;建立连接<br />一旦驱动被加载并处于准备连接状态，您就可以使用下面的代码建立一个连接实例：<br />&nbsp;&nbsp; Connection con = DriverManager.getConnection(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;jdbc:oracle:thin:@dbaprod1: 1521:orcl&quot;, username, passwd);<br />好，让我们一起来弄懂这里用到的术语吧。第一个字符串(string)是一个数据库的URL，包括协议(jdbc), 厂商(oracle), 驱动(thin), 服务器(dbaprod1), 端口号 (1521), 和服务器实例(orcl) 。数据库连接的用户名和密码分别为： username、 passwd。<br />完了。最后一步返回的是一个打开的连接，用来传送SQL语句与数据库进行交互操作。在上面的代码中，con就是这样的一个连接，稍后我们会用到。(注：上面代码所示范的，很可能会与您的环境不一致，请依照您的环境作必要的修改)<br />________________________________________<br />建立JDBC语句（Statement）<br />JDBC语句用于向数据库传送SQL语句。JDBC语句不同于SQL语句，它是与数据库连接密切相关的，不单是一个SQL语句。您可以把JDBC想象成一个道往数据库的通道，用来传送一个或多个SQL语句到数据库中。<br />一个活动连接需要建立一个 Statement 对象。示范如下(用到先前建立的Connection 对象con)：<br />&nbsp;&nbsp;&nbsp; Statement stmt = con.createStatement() ; <br />到此，一个Statement 对象已经存在，还差一个传送到数据库的SQL语句，下面就学到。<br />________________________________________<br />建立JDBC填充语句（PreparedStatement）<br />有时候，使用PreparedStatement对象向数据库传送SQL语句更加方便而且更有效率。有别于它的父类Statement，它只在创建的时候被赋予一个SQL语句。该条SQL语句被传送到数据库时，立刻被编译。因此，PreparedStatement语句直接绑定于通道和被编译的SQL语句上。<br />优点显而易见：如果您需要使用多个相同或相似的SQL语句（仅其中的参数不同），使用PreparedStatement只需要被编译一次并被优化。使用普通的Statement就需要多次并且是逐个地被编译。<br />PreparedStatements 同样使用Connection 的方法建立。下面的代码示范如何建立一个填充语句，并且带有三个参数。 <br />&nbsp;&nbsp; PreparedStatement prepareUpdatePrice = con.prepareStatement( <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;UPDATE Sells SET price = ? WHERE bar = ? AND beer = ?&quot;);<br />在执行PreparedStatement之前，我们需要提供相应的值去填充这些参数。这需要用到PreparedStatement类中的setXXX方法。常用的方法有：setInt, setFloat, setDouble, setString等。<br />接着上面的示例：<br />&nbsp;&nbsp; prepareUpdatePrice.setInt(1, 3);<br />&nbsp;&nbsp; prepareUpdatePrice.setString(2, &quot;Bar Of Foo&quot;);<br />&nbsp;&nbsp; prepareUpdatePrice.setString(3, &quot;BudLite&quot;);<br />________________________________________<br />执行 CREATE/INSERT/UPDATE 语句<br />DDL (data definition language) 语句，如建表，修改表结构，更新表内容都可以使用executeUpdate方法。示范如下： <br />&nbsp;&nbsp; Statement stmt = con.createStatement(); <p>&nbsp;&nbsp; stmt.executeUpdate(&quot;CREATE TABLE Sells &quot; +<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;(bar VARCHAR2(40), beer VARCHAR2(40), price REAL)&quot; );<br />&nbsp;&nbsp; stmt.executeUpdate(&quot;INSERT INTO Sells &quot; +<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;VALUES ('Bar Of Foo', 'BudLite', 2.00)&quot; );</p><p>&nbsp;&nbsp; String sqlString = &quot;CREATE TABLE Bars &quot; +<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;(name VARCHAR2(40), address VARCHAR2(80), license INT)&quot; ;<br />&nbsp;&nbsp; stmt.executeUpdate(sqlString);<br />由于SQL语句并非恰好为一个字符串（或适合写在一行），所以需要使用加号（+）连结。特别注意在字符串&quot;INSERT INTO Sells&quot;后面的空格，为的是与字符串&quot;VALUES&quot;分开。<br />当使用executeUpdate执行DDL语句，返回值总是零(zero)，当执行数据修改语句时将返回大于等零的值，即被修改的记录数。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int n = prepareUpdatePrice.executeUpdate() ;<br />________________________________________<br />执行 SELECT 语句<br />相对于前面的执行语句(DDL)，查询语句执行后返回一个结果集合，并且不改变数据库的状态。相应地使用另一个方法executeQuery，返回一个ResultSet对象：<br />&nbsp;&nbsp; String bar, beer ;<br />&nbsp;&nbsp; float price ;</p><p>&nbsp;&nbsp; ResultSet rs = stmt.executeQuery(&quot;SELECT * FROM Sells&quot;);<br />&nbsp;&nbsp; while ( rs.next() ) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bar = rs.getString(&quot;bar&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; beer = rs.getString(&quot;beer&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; price = rs.getFloat(&quot;price&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(bar + &quot; sells &quot; + beer + &quot; for &quot; + price + &quot; Dollars.&quot;);<br />&nbsp;&nbsp; }<br />查询语句返回的结果集被放在一个ResultSet实例中。我们可以访问结果集中的每一行记录(record)及每一行记录的属性。ResultSet提供一个游标(cursor)，用于访问它的每一行记录。游标开始时指示在第一条记录的前面。可以使用next方法使游标指向下一条记录，如果下一条记录存在，next方法返回真(true)，否则返回假(false)。<br />我们可以使用相应类型的getXXX方法获取某一行记录。在前面的示例中，我们用的是getString和getFloat方法访问某一列的值。我们需要提供列的名称作为方法的参数，并且注意VARCHAR2类型的bar、beer被转换成Java的String、REAL被转换成Java的float。<br />我们还可以使用列的顺序号代替列的名称来访问结果集，示范如下：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bar = rs.getString(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; price = rs.getFloat(3);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; beer = rs.getString(2);<br />________________________________________<br />访问ResultSet<br />JDBC还提供一套方法，让您得到游标当前处于结果集的位置，如getRow, isFirst, isBeforeFirst, isLast, isAfterLast。<br />这意味着游标允许自由访问结果集。默认的，游标只能向前滚动并且是只读的。当连接（Connection）建立了语句（Statement）后，您可以灵活地改变结果集（ResultSet）的滚动及更新模式。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Statement stmt = con.createStatement(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rs = stmt.executeQuery(&quot;SELECT * FROM Sells&quot;);<br />不同的选项包括： TYPE_FORWARD_ONLY、TYPE_SCROLL_INSENSITIVE和TYPE_SCROLL_SENSITIVE。您可以在需要只读游标时选用CONCUR_READ_ONLY、需要更新时选用CONCUR_UPDATABLE。默认的游标可以使用rs.next()向前滚动。使用可滚动的游标，您有更多的操作，示范如下： <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs.absolute(3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 滚动到结果集的第三行<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs.previous();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 回滚一行（第二行）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs.relative(2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 向前滚动两行（第四行）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs.relative(-3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 回滚三行（第一行）<br />________________________________________<br />事务（Transactions）<br />JDBC允许多条SQL语句作为一个事务。因此使用JDBC事务，我们能确保ACID (Atomicity, Consistency, Isolation, Durability)属性。<br />连接建立后，默认的事务模式是自动提交（auto-commit）。这使每一条SQL语句都被当作一个事务来处理。<br />我们可以关闭自动提交事务模式，如下：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con.setAutoCommit(false) ; <br />再次打开自动提交事务模式：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con.setAutoCommit(true) ; <br />一旦自动提交模式被关闭，除非您明确地使用commit()方法提交，否则每一条SQL语句都不会被提交。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con.commit() ; <br />在执行commit()方法之前，我们可以随时使用rollback()方法来回滚事务，取消之前的操作。 <br />举例如下： <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con.setAutoCommit(false);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Statement stmt = con.createStatement();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stmt.executeUpdate(&quot;INSERT INTO Sells VALUES('Bar Of Foo', 'BudLite', 1.00)&quot; );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con.rollback();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stmt.executeUpdate(&quot;INSERT INTO Sells VALUES('Bar Of Joe', 'Miller', 2.00)&quot; );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con.commit();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con.setAutoCommit(true);<br />请读者逐句理解上面的例子吧。 <br />通常，事务回滚结合Java异常机制，被用于处理(不)可预见的错误。下一节我们将介绍Java的异常机制。<br />________________________________________<br />Handling Errors with Exceptions<br />错误无处不在。为保证程序的可恢复性，让数据库不至于由于某个错误导致崩溃。事务回滚与Java的异常机制提供了很优雅的解决办法。<br />客户(program)访问服务器(database)需要获得服务器的任务错误反馈。JDBC提供了SQLException用于访问这些错误。<br />结束事务回滚，举一个异常的例子：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con.setAutoCommit(false) ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stmt.executeUpdate(&quot;CREATE TABLE Sells (bar VARCHAR2(40), &quot; +<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;&nbsp; &quot;beer VARHAR2(40), price REAL)&quot;) ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stmt.executeUpdate(&quot;INSERT INTO Sells VALUES &quot; +<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;&nbsp; &quot;('Bar Of Foo', 'BudLite', 2.00)&quot;) ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con.commit() ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con.setAutoCommit(true) ;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(SQLException ex) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(&quot;SQLException: &quot; + ex.getMessage()) ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con.rollback() ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con.setAutoCommit(true) ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />在上例中，由于beer被定义为VARHAR2（拼写错误），导致一个异常被抛出。错误的输出如下：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message:&nbsp; ORA-00902: invalid datatype<br />假如您纠正了数据类型的错误，也可能会发生空间不足的错误，使您不能够建立一个新表。</p><p>需要对照原文，请访问：<a href="http://www-db.stanford.edu/~ullman/fcdb/oracle/or-jdbc.html">http://www-db.stanford.edu/~ullman/fcdb/oracle/or-jdbc.html</a></p>
          <br/>
          <span style="color:red;">
            <a href="http://lelong.javaeye.com/blog/155879#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </desc