<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>justjavac(风之谷)</title>
    <description>一种风，只流浪在一座山谷；一道堤，只护住一湾星河。每次仰望星空，我总是闭上眼—因为最美的一颗不在天上...</description>
    <link>http://justjavac.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>生命有两层含义</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://justjavac.javaeye.com/blog/187225" style="color:red;">http://justjavac.javaeye.com/blog/187225</a>&nbsp;
          发表时间: 2008年04月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>
　　&lt;一&gt;<br />
　　你不会有那美丽的相逢，除非之前,你能忍受等待的孤独.<br />
　　你不会有那明朗的清晨，除非之前，你的睡梦能忍受黑夜的迷雾。<br />
　　你也不会赢得任何东西，除非你敢于投下赌注.<br />
　　赌注，生命的赌注,就是你的脚步!<br />
　　但是你不会找到路，除非你敢于迷路.<br />
　　因为，只有让你迷路的地方，才是你真正的出路!<br />
　　<br />
　　<br />
　　<br />
　　<br />
　　&lt;二&gt;<br />
　　有多少次此刻的离别，就有多少次彼时的相逢.<br />
　　有多少次此刻的酒醉，就有多少次彼时的痛醒.<br />
　　所以你应该理解一个人的沉默,就是一个人最多的话语.<br />
　　你也应该理解一个人的忧伤,之所以忧伤，一定是因为他不肯舍弃某些快乐.<br />
　　<br />
　　<br />
　　<br />
　　<br />
　　&lt;三&gt;<br />
　　暖一壶茶,在寒冷的冬季里,让温气升腾,但朋友，别忘了,除了炉火,还有那寒风赐予了这壶茶以温度.<br />
　　我相信，最温暖来自寒冷.我相信，最温暖,其实是对寒冷的一种谅解.<br />
　　<br />
　　<br />
　　<br />
　　<br />
　　&lt;四&gt;<br />
　　生命确实有两层-----<br />
　　一个浪打礁石，海鸟惊逃，以为是一次谋杀，<br />
　　一个浪扑上海滩，孩子欢喜，以为是大海开出了鲜花．<br />
　　同样的事物，有不同样的感受．<br />
　　所以世界是什么样的，并不重要，重要的是生命的心灵。<br />
　　世界往往是什么样子，往往取决于你的心灵是什么样子．<br />
　　莫要过分误解这个世界，请先看看自己的心灵的模样．<br />
　　<br />
　　<br />
　　<br />
　　<br />
　　<br />
　　＜五＞<br />
　　爱的方式有许多种，<br />
　　而爱是一种动机，爱的动机是诚实而纯洁的，<br />
　　但爱的方式却不可靠。<br />
　　即使你有爱，你爱着，可你爱的方式是否避免着偏执－－－<br />
　　朋友，请不要采摘那些花朵，除非你能保证，一起搬走整个森林的田野</p>
          <br/>
          <span style="color:red;">
            <a href="http://justjavac.javaeye.com/blog/187225#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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>Sun, 27 Apr 2008 08:06:39 +0800</pubDate>
        <link>http://justjavac.javaeye.com/blog/187225</link>
        <guid>http://justjavac.javaeye.com/blog/187225</guid>
      </item>
      <item>
        <title>工厂模式----易懂版(转)</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://justjavac.javaeye.com/blog/180972" style="color:red;">http://justjavac.javaeye.com/blog/180972</a>&nbsp;
          发表时间: 2008年04月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>一、引子</strong><br />         话说十年前，有一个暴发户，他家有三辆汽车——Benz奔驰、Bmw宝马、Audi奥迪，还雇了司机为他开车。不过，暴发户坐车时总是怪怪的：上Benz 车后跟司机说“开奔驰车！”，坐上Bmw后他说“开宝马车！”，坐上Audi说“开奥迪车！”。你一定说：这人有病！直接说开车不就行了？！<br />         而当把这个暴发户的行为放到我们程序设计中来时，会发现这是一个普遍存在的现象。幸运的是，这种有病的现象在OO（面向对象）语言中可以避免了。下面就以 Java语言为基础来引入我们本文的主题：工厂模式。<br /><br /><strong>二、分类</strong><br />        工厂模式主要是为创建对象提供过渡接口，以便将创建对象的具体过程屏蔽隔离起来，达到提高灵活性的目的。<br /><br />工厂模式在《Java与模式》中分为三类：<br />1）简单工厂模式（Simple Factory）<br /><br />2）工厂方法模式（Factory Method）<br /><br />3）抽象工厂模式（Abstract Factory）<br />         这三种模式从上到下逐步抽象，并且更具一般性。<br />         GOF在《设计模式》一书中将工厂模式分为两类：工厂方法模式（Factory Method）与抽象工厂模式（Abstract Factory）。将简单工厂模式（Simple Factory）看为工厂方法模式的一种特例，两者归为一类。<br /><br />两者皆可，在本文使用《Java与模式》的分类方法。下面来看看这些工厂模式是怎么来“治病”的。<br /><br /><strong>三、简单工厂模式</strong><br /><br />简单工厂模式又称静态工厂方法模式。重命名上就可以看出这个模式一定很简单。它存在的目的很简单：定义一个用于创建对象的接口。<br />   先来看看它的组成：<br /><br />     1) 工厂类角色：这是本模式的核心，含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。<br /><br />     2) 抽象产品角色：它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。<br /><br />     3) 具体产品角色：工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。<br />那么简单工厂模式怎么来使用呢？我们就以简单工厂模式来改造暴发户坐车的方式——现在暴发户只需要坐在车里对司机说句：“开车”就可以了。<br /><pre name="code" class="java">
//抽象产品角色
public interface Car{
  public void drive();
}

//具体产品角色
public class Benz implements Car{
  public void drive() {
     System.out.println("Driving Benz ");
  }
}

public class Bmw implements Car{
  public void drive() {
   System.out.println("Driving Bmw ");
  }
}
...（奥迪我就不写了）

//工厂类角色
public class Driver{
        //工厂方法.注意 返回类型为抽象产品角色
         public static Car driverCar(String s)throws Exception{
               //判断逻辑，返回具体的产品角色给Client
               if(s.equalsIgnoreCase("Benz"))
                    return new Benz();
               else if(s.equalsIgnoreCase("Bmw"))
                        return new Bmw();
                             ......   
                       else throw new Exception();
         ...

//欢迎暴发户出场......
public class Magnate{
         public static void main(String[] args){
                    try{
                          //告诉司机我今天坐奔驰                     
                              Car car = Driver.driverCar("benz");
                          //下命令：开车                           
                              car.drive();
                    ...
</pre><br />将本程序空缺的其他信息填充完整后即可运行。如果你将所有的类放在一个文件中，请不要忘记只能有一个类被声明为public。本程序在jdk1.4 下运行通过。<br />这便是简单工厂模式了。怎么样，使用起来很简单吧？那么它带来了什么好处呢？<br />        首先，使用了简单工厂模式后，我们的程序不在“有病”，更加符合现实中的情况；而且客户端免除了直接创建产品对象的责任，而仅仅负责“消费”产品（正如暴发户所为）。<br /><br />        下面我们从开闭原则（对扩展开放；对修改封闭）上来分析下简单工厂模式。当暴发户增加了一辆车的时候，只要符合抽象产品制定的合同，那么只要通知工厂类知道就可以被客户使用了。所以对产品部分来说，它是符合开闭原则的；但是工厂部分好像不太理想，因为每增加一辆车，都要在工厂类中增加相应的业务逻辑或者判断逻辑，这显然是违背开闭原则的。可想而知对于新产品的加入，工厂类是很被动的。对于这样的工厂类（在我们的例子中是为司机师傅），我们称它为全能类或者上帝类。<br />         我们举的例子是最简单的情况，而在实际应用中，很可能产品是一个多层次的树状结构。由于简单工厂模式中只有一个工厂类来对应这些产品，所以这可能会把我们的上帝累坏了，也累坏了我们这些程序员:(<br />        于是工厂方法模式作为救世主出现了。
          <br/>
          <span style="color:red;">
            <a href="http://justjavac.javaeye.com/blog/180972#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><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 09 Apr 2008 20:42:39 +0800</pubDate>
        <link>http://justjavac.javaeye.com/blog/180972</link>
        <guid>http://justjavac.javaeye.com/blog/180972</guid>
      </item>
      <item>
        <title>程序员寓言</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://justjavac.javaeye.com/blog/179601" style="color:red;">http://justjavac.javaeye.com/blog/179601</a>&nbsp;
          发表时间: 2008年04月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="quote_title"> 写道</div><div class="quote_div">    一只壁虎迷了路，这时正好有一条大鳄鱼远远地爬了过来，准备要一口吃掉它，情急之下，小壁虎上前一把抱住了鳄鱼的腿，大声喊："妈妈！"大鳄鱼一愣，立即老泪纵横："儿啊，才做半个月程序员,咋就瘦成这样了........ <br /><br /></div>
          <br/>
          <span style="color:red;">
            <a href="http://justjavac.javaeye.com/blog/179601#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 05 Apr 2008 07:27:29 +0800</pubDate>
        <link>http://justjavac.javaeye.com/blog/179601</link>
        <guid>http://justjavac.javaeye.com/blog/179601</guid>
      </item>
      <item>
        <title>初学必读：61条面向对象设计的经验原则 (转)</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://justjavac.javaeye.com/blog/178405" style="color:red;">http://justjavac.javaeye.com/blog/178405</a>&nbsp;
          发表时间: 2008年04月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          (1)所有数据都应该隐藏在所在的类的内部。<br />　　(2)类的使用者必须依赖类的共有接口，但类不能依赖它的使用者。<br /><br />　　(3)尽量减少类的协议中的消息。<br />　　(4)实现所有类都理解的最基本公有接口[例如，拷贝操作(深拷贝和浅拷贝)、相等性判断、正确输出内容、从ASCII描述解析等等]。<br /><br />　　(5)不要把实现细节(例如放置共用代码的私有函数)放到类的公有接口中。<br />　　如果类的两个方法有一段公共代码，那么就可以创建一个防止这些公共代码的私有函数。<br /><br />　　(6)不要以用户无法使用或不感兴趣的东西扰乱类的公有接口。<br /><br />　　(7)类之间应该零耦合，或者只有导出耦合关系。也即，一个类要么同另一个类毫无关系，要么只使用另一个类的公有接口中的操作。<br /><br />　　(8)类应该只表示一个关键抽象。<br /><br />　　包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包影响，则将对包中的所有类产生影响，而对其他的包不造成任何影响 .<br />　　(9)把相关的数据和行为集中放置。<br /><br />　　设计者应当留意那些通过get之类操作从别的对象中获取数据的对象。这种类型的行为暗示着这条经验原则被违反了。<br /><br />　　(10)把不相关的信息放在另一个类中(也即：互不沟通的行为)。<br /><br />　　朝着稳定的方向进行依赖.<br /><br />　　(11)确保你为之建模的抽象概念是类，而不只是对象扮演的角色。<br /><br />　　(12)在水平方向上尽可能统一地分布系统功能，也即：按照设计，顶层类应当统一地共享工作。<br /><br />　　(13)在你的系统中不要创建全能类/对象。对名字包含Driver、Manager、System、Susystem的类要特别多加小心。<br />　　规划一个接口而不是实现一个接口。<br />　　(14)对公共接口中定义了大量访问方法的类多加小心。大量访问方法意味着相关数据和行为没有集中存放。<br /><br />　　(15)对包含太多互不沟通的行为的类多加小心。<br /><br />　　这个问题的另一表现是在你的应用程序中的类的公有接口中创建了很多的get和set函数。<br /><br />　　(16)在由同用户界面交互的面向对象模型构成的应用程序中，模型不应该依赖于界面，界面则应当依赖于模型。<br /><br />　　(17)尽可能地按照现实世界建模(我们常常为了遵守系统功能分布原则、避免全能类原则以及集中放置相关数据和行为的原则而违背这条原则) 。<br /><br />　　(18)从你的设计中去除不需要的类。<br /><br />　　一般来说，我们会把这个类降级成一个属性。<br /><br />　　(19)去除系统外的类。<br /><br />　　系统外的类的特点是，抽象地看它们只往系统领域发送消息但并不接受系统领域内其他类发出的消息。<br /><br />　　(20)不要把操作变成类。质疑任何名字是动词或者派生自动词的类，特别是只有一个有意义行为的类。考虑一下那个有意义的行为是否应当迁移到已经存在或者尚未发现的某个类中。<br /><br />　　(21)我们在创建应用程序的分析模型时常常引入代理类。在设计阶段，我们常会发现很多代理没有用的，应当去除。<br /><br />　　(22)尽量减少类的协作者的数量。<br />　　一个类用到的其他类的数目应当尽量少。<br />　　(23)尽量减少类和协作者之间传递的消息的数量。<br /><br />　　(24)尽量减少类和协作者之间的协作量，也即：减少类和协作者之间传递的不同消息的数量。<br />　　(25)尽量减少类的扇出，也即：减少类定义的消息数和发送的消息数的乘积。<br /><br />　　(26)如果类包含另一个类的对象，那么包含类应当给被包含的对象发送消息。也即：包含关系总是意味着使用关系。<br />　　(27)类中定义的大多数方法都应当在大多数时间里使用大多数数据成员。<br /><br />　　(28)类包含的对象数目不应当超过开发者短期记忆的容量。这个数目常常是6。<br /><br />　　当类包含多于6个数据成员时，可以把逻辑相关的数据成员划分为一组，然后用一个新的包含类去包含这一组成员。<br />　　(29)让系统功能在窄而深的继承体系中垂直分布。<br /><br />　　(30)在实现语义约束时，最好根据类定义来实现。这常常会导致类泛滥成灾，在这种情况下，约束应当在类的行为中实现，通常是在构造函数中实现，但不是必须如此。<br /><br />　　(31)在类的构造函数中实现语义约束时，把约束测试放在构造函数领域所允许的尽量深的包含层次中。<br /><br />　　(32)约束所依赖的语义信息如果经常改变，那么最好放在一个集中式的第3方对象中。<br /><br />　　(33)约束所依赖的语义信息如果很少改变，那么最好分布在约束所涉及的各个类中。<br /><br />　　(34)类必须知道它包含什么，但是不能知道谁包含它。<br /><br />　　(35)共享字面范围(也就是被同一个类所包含)的对象相互之间不应当有使用关系。<br /><br />　　(36)继承只应被用来为特化层次结构建模。<br /><br />　　(37)派生类必须知道基类，基类不应该知道关于它们的派生类的任何信息。<br /><br />　　(38)基类中的所有数据都应当是私有的，不要使用保护数据。<br /><br />　　类的设计者永远都不应该把类的使用者不需要的东西放在公有接口中。<br />　　(39)在理论上，继承层次体系应当深一点，越深越好。<br /><br />　　(40)在实践中，继承层次体系的深度不应当超出一个普通人的短期记忆能力。一个广为接受的深度值是6。<br /><br />　　(41)所有的抽象类都应当是基类。<br /><br />　　(42)所有的基类都应当是抽象类。<br /><br />　　(43)把数据、行为和/或接口的共性尽可能地放到继承层次体系的高端。<br /><br />　　(44)如果两个或更多个类共享公共数据(但没有公共行为)，那么应当把公共数据放在一个类中，每个共享这个数据的类都包含这个类。<br /><br />　　(45)如果两个或更多个类有共同的数据和行为(就是方法)，那么这些类的每一个都应当从一个表示了这些数据和方法的公共基类继承。<br /><br />　　(46)如果两个或更多个类共享公共接口(指的是消息，而不是方法)，那么只有他们需要被多态地使用时，他们才应当从一个公共基类继承。<br /><br />　　(47)对对象类型的显示的分情况分析一般是错误的。在大多数这样的情况下，设计者应当使用多态。<br /><br />　　(48)对属性值的显示的分情况分析常常是错误的。类应当解耦合成一个继承层次结构，每个属性值都被变换成一个派生类。<br /><br />　　(49)不要通过继承关系来为类的动态语义建模。试图用静态语义关系来为动态语义建模会导致在运行时切换类型。<br /><br />　　(50)不要把类的对象变成派生类。对任何只有一个实例的派生类都要多加小心。<br /><br />　　(51)如果你觉得需要在运行时刻创建新的类，那么退后一步以认清你要创建的是对象。现在，把这些对象概括成一个类。<br /><br />　　(52)在派生类中用空方法(也就是什么也不做的方法)来覆写基类中的方法应当是非法的。<br /><br />　　(53)不要把可选包含同对继承的需要相混淆。把可选包含建模成继承会带来泛滥成灾的类。<br /><br />　　(54)在创建继承层次时，试着创建可复用的框架，而不是可复用的组件。<br /><br />　　(55)如果你在设计中使用了多重继承，先假设你犯了错误。如果没犯错误，你需要设法证明。<br /><br />　　(56)只要在面向对象设计中用到了继承，问自己两个问题：(1)派生类是否是它继承的那个东西的一个特殊类型？(2)基类是不是派生类的一部分？<br /><br />　　(57)如果你在一个面向对象设计中发现了多重继承关系，确保没有哪个基类实际上是另一个基类的派生类。<br /><br />　　(58)在面向对象设计中如果你需要在包含关系和关联关系间作出选择，请选择包含关系。<br />　　(59)不要把全局数据或全局函数用于类的对象的薄记工作。应当使用类变量或类方法。<br />　　(60)面向对象设计者不应当让物理设计准则来破坏他们的逻辑设计。但是，在对逻辑设计作出决策的过程中我们经常用到物理设计准则。<br /><br />　　(61)不要绕开公共接口去修改对象的状态。
          <br/>
          <span style="color:red;">
            <a href="http://justjavac.javaeye.com/blog/178405#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</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 Apr 2008 14:29:33 +0800</pubDate>
        <link>http://justjavac.javaeye.com/blog/178405</link>
        <guid>http://justjavac.javaeye.com/blog/178405</guid>
      </item>
      <item>
        <title>学习java的30个目标</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://justjavac.javaeye.com/blog/178394" style="color:red;">http://justjavac.javaeye.com/blog/178394</a>&nbsp;
          发表时间: 2008年04月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>1.</strong>你需要精通面向对象分析与设计(OOA/OOD)、设计模式(GOF，J2EEDP)以及综合模式。<br />你应该十分了解UML，尤其是class，object，interaction以及statediagrams。<br /><br /><strong>2.</strong>你需要学习JAVA语言的基础知识以及它的核心类库<br />collections，<br />serialization，<br />streams，<br />networking， <br />multithreading，<br />reflection，<br />event，<br />handling，<br />NIO，<br />localization，<br />以及其他 <br /><br /><strong>3.</strong>你应该了解JVM，classloaders，classreflect，以及垃圾回收的基本工作机制等。<br />你应该有能力反编译一个类文件并且明白一些基本的汇编指令。<br /><br /><strong>4.</strong>如果你将要写客户端程序，你需要学习WEB的小应用程序(applet)，<br />必需掌握GUI设计的思想和方法，以及桌面程序的Swing，AWT， SWT。<br />你还应该对UI部件的javabeans组件模式有所了解。<br />javabeans也被应用在JSP中以把业务逻辑从表现层中分离出来。<br /><br /><strong>5.</strong>你需要学习java数据库技术，如JDBC API并且会使用至少一种persistence/ORM构架，<br />例如<br />Hibernate，<br />JDO， <br />CocoBase，<br />TopLink，<br />InsideLiberator(国产JDO红工厂软件)<br />或者iBatis。<br /><br /><strong>6.</strong>你还应该了解对象关系的阻抗失配的含义，以及它是如何影响业务对象的与关系型数据库的交互，和它的运行结果，还需要掌握不同的数据库产品运用，<br />比如:<br />oracle，<br />mysql，<br />mssqlserver。<br /><br /><strong>7.</strong>你需要学习JAVA的沙盒安全模式(classloaders，bytecodeverification，managers，policyandpermissions，<br />codesigning， digitalsignatures，cryptography，certification，Kerberos，以及其他)还有不同的安全/认证 API，例如JAAS(JavaAuthenticationandAuthorizationService)，JCE (JavaCryptographyExtension)，JSSE(JavaSecureSocketExtension)，以及JGSS (JavaGeneralSecurityService)。<br /><br /><strong>8.</strong>你需要学习Servlets，JSP，以及JSTL(StandardTagLibraries)和可以选择的第三方TagLibraries。<br /><br /><strong>9.</strong>你需要熟悉主流的网页框架，<br />例如<br />JSF，<br />Struts，<br />Tapestry，<br />Cocoon，<br />WebWork，<br />以及他们下面的设计模式，如MVC/MODEL2。<br /><br /><strong>10.</strong>你需要学习如何使用及管理WEB服务器，例如tomcat，resin，Jrun，并且知道如何在其基础上扩展和维护WEB程序。<br /><br /><strong>11.</strong>你需要学习分布式对象以及远程API，例如RMI和RMI/IIOP。 <br /><strong>12.</strong>你需要掌握各种流行中间件技术标准和与java结合实现，比如Tuxedo、CROBA，当然也包括javaEE本身。<br /><br /><strong>13.</strong>你需要学习最少一种的XML API，<br />例如<br />JAXP(JavaAPIforXMLProcessing)，<br />JDOM(JavaforXMLDocumentObjectModel)，<br />DOM4J，<br />或JAXR(JavaAPIforXMLRegistries)。<br /><br /><strong>14.</strong>你应该学习如何利用JAVAAPI和工具来构建WebService。<br />例如<br />JAX-RPC(JavaAPIforXML/RPC)，<br />SAAJ (SOAPwithAttachmentsAPIforJava)，<br />JAXB(JavaArchitectureforXMLBinding)，<br />JAXM(JavaAPIforXMLMessaging)，<br />JAXR(JavaAPIforXMLRegistries)，<br />或者JWSDP(JavaWebServicesDeveloperPack)。<br /><br /><strong>15.</strong>你需要学习一门轻量级应用程序框架，<br />例如<br />Spring，<br />PicoContainer，<br />Avalon，<br />以及它们的IoC/DI风格(setter，constructor，interfaceinjection)。<br /><br /><strong>16.</strong>你需要熟悉不同的J2EE技术，<br />例如<br />JNDI(JavaNamingandDirectoryInterface)，<br />JMS (JavaMessageService)，<br />JTA/JTS(JavaTransactionAPI/JavaTransactionService)，<br />JMX (JavaManagementeXtensions)，<br />以及JavaMail。<br /><br /><strong>17.</strong>你需要学习企业级JavaBeans(EJB)以及它们的不同组件模式：<br />Stateless/StatefulSessionBeans，<br />EntityBeans(包含Bean- ManagedPersistence[BMP]<br />或者Container-ManagedPersistence[CMP]和它的EJB-QL)，<br />或者 Message-DrivenBeans(MDB)。<br /><br /><strong>18.</strong>你需要学习如何管理与配置一个J2EE应用程序服务器，<br />如<br />WebLogic，<br />JBoss等，<br /><br />并且利用它的附加服务，<br />例如<br />簇类，<br />连接池<br />以及分布式处理支援。<br /><br />你还需要了解如何在它上面封装和配置应用程序并且能够监控、调整它的性能。<br /><br /><strong>19.</strong>你需要熟悉面向方面的程序设计以及面向属性的程序设计(这两个都被很容易混淆的缩写为AOP)，以及他们的主流JAVA规格和执行。例如<br />AspectJ<br />AspectWerkz。<br /><br /><strong>20.</strong>你需要熟悉对不同有用的API和frame work等来为你服务。<br />例如 ：<br />Log4J(logging/tracing)，<br />Quartz (scheduling)，<br />JGroups(networkgroupcommunication)，<br />JCache(distributedcaching)，<br />Lucene(full-textsearch)，<br />JakartaCommons等等。<br /><br /><strong>21.</strong>如果你将要对接或者正和旧的系统或者本地平台，你需要学习JNI (JavaNativeInterface) and JCA (JavaConnectorArchitecture)。<br /><br /><strong>22.</strong>你需要熟悉JINI技术以及与它相关的分布式系统，比如掌握CROBA。<br /><br /><strong>23.</strong>你需要JavaCommunityProcess(JCP)以及他的不同JavaSpecificationRequests(JSRs)，<br />例如<br />Portlets(168)，<br />JOLAP(69)，<br />DataMiningAPI(73)，<br />等等。<br /><br /><strong>24.</strong>你应该熟练掌握一种JAVAIDE<br />例如<br />sunOne，<br />netBeans，<br />IntelliJIDEA<br />或者Eclipse。<br />(有些人更喜欢VI或EMACS来编写文件。随便你用什么了：)<br /><br /><strong>25.</strong>JAVA(精确的说是有些配置)是冗长的，它需要很多的人工代码(例如EJB)，所以你需要熟悉代码生成工具，<br />例如<br />XDoclet。<br /><br /><strong>26.</strong>你需要熟悉一种单元测试体系(JNunit)，并且学习不同的生成、部署工具(Ant，Maven)。<br /><br /><strong>27.</strong>你需要熟悉一些在JAVA开发中经常用到的软件工程过程。<br />例如<br />RUP(RationalUnifiedProcess)andAgilemethodologies。<br /><br /><strong>28.</strong>你需要能够深入了解加熟练操作和配置不同的操作系统，比如GNU/linux，sunsolaris，macOS等，做为跨平台软件的开发者。<br /><br /><strong>29.</strong>你还需要紧跟java发展的步伐，比如现在可以深入的学习javaME，以及各种java新规范，技术的运用，如新起的web富客户端技术。<br /><strong><br />30.</strong>你必需要对opensource有所了解，因为至少java的很多技术直接是靠开源来驱动发展的，如java3D技术。
          <br/>
          <span style="color:red;">
            <a href="http://justjavac.javaeye.com/blog/178394#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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</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 Apr 2008 14:15:28 +0800</pubDate>
        <link>http://justjavac.javaeye.com/blog/178394</link>
        <guid>http://justjavac.javaeye.com/blog/178394</guid>
      </item>
      <item>
        <title>一名合格的程序员需要掌握哪些技能</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://justjavac.javaeye.com/blog/178389" style="color:red;">http://justjavac.javaeye.com/blog/178389</a>&nbsp;
          发表时间: 2008年04月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>熟练掌握开发工具 </strong><br /><br />做为一名程序员至少熟练掌握两到三种开发工具的使用，这是程序员的立身之本，其中C/C++和JAVA是重点推荐的开发工具，C/C++以其高效率和高度的灵活性成为开发工具中的利器，很多系统级的软件还是用C/C编写。而JAVA的跨平台和与WEB很好的结合是JAVA的优势所在，而JAVA即其相关的技术集JAVA One很可能会成为未来的主流开发工具之一。其次，能掌握一种简便的可视化开发工具，如VB，PowerBuilder，Delphi，C Builder，则更好，这些开发工具减小了开发难度，并能够强化程序员对象模型的概念。另外，需要掌握基本的脚本语言，如shell，perl等，至少能读懂这些脚本代码。 <br /><br /><strong>熟知数据库 </strong><br /><br />为什么数据库是如此重要？作为程序员，他们自然有自己的理由：很多应用程序都是以数据库的数据为中心，而数据库的产品也有不少，其中关系型数据库仍是主流形式，所以程序员至少熟练掌握一两种数据库，对关系型数据库的关键元素要非常清楚，要熟练掌握SQL的基本语法。虽然很多数据库产品提供了可视化的数据库管理工具，但SQL是基础，是通用的数据库操作方法。如果没有机会接触商业数据库系统，可以使用免费的数据库产品是一个不错的选择，如mySQL， Postgres等。 <br /><br /><strong>对操作系统有一定的了解 </strong><br /><br />当前主流的操作系统是Windows，Linux/Unix，熟练地使用这些操作系统是必须的，但只有这些还远远不够。要想成为一个真正的编程高手，需要深入了解操作系统，了解它的内存管理机制、进程/线程调度、信号、内核对象、系统调用、协议栈实现等。Linux作为开发源码的操作系统，是一个很好的学习平台，Linux几乎具备了所有现代操作系统的特征。虽然Windows系统的内核实现机制的资料较少，但通过互联网还是能获取不少资料。只有对操作系统有一定的了解后，你会发现自己上了一个新的台阶。 <br /><br /><strong>懂得网络协议TCP/IP </strong><br /><br />在互联网如此普及的今天，如果您还没有对互联网的支撑协议TCP/IP协议栈有很好的掌握，就需要迅速补上这一课，网络技术已改变了软件运行的模式，从最早的客户/服务器结构，到今天的WEB Services，再到未来的网格计算，这一切都离不开以TCP/IP协议栈为基础的网络协议支持，所以，深入掌握TCP/IP协议是非常必要的。至少，你需要了解ISO七层协议模型，IP/UDP/TCP/HTTP等常用协议的原理和三次握手机制。 <br /><br /><strong>明白DCOM/CORBA/XML/WEB Services存在的意义 </strong><br /><br />随着技术的发展，软件与网络的无缝结合是必然趋势，软件系统的位置无关性是未来计算模式的重要特征之一，DCOM/CORBA是当前两大主流的分布计算的中间平台，DCOM是微软COM(组件对象模型)的扩展，而CORBA是OMG支持的规范。程序员需要做的不仅仅是利用商业的开发平台来开发软件，而是要理解这些技术的初衷，即为什么需要这项技术，如果你能理解了这一点，再回头看这些技术的具体实现，就如庖丁解牛，迎刃而解。XML/WebServices重要性不言而喻，XML以其结构化的表示方法和超强的表达能力被喻为互联网上的&ldquo;世界语&rdquo;，是分布计算的基石之一。 <br /><br /><strong>不要将软件工程与CMM分开</strong> <br /><br />现代大型软件系统的开发中，工程化的开发控制取代个人英雄主义，成为软件系统成功的保证，一个编程高手并不一定是一个优秀的程序员，一个优秀的程序员是将出色的编程能力和开发技巧同严格的软件工程思想有机结合，编程只是软件生命周期中的其中一环，优秀的程序员应该掌握软件开发各个阶段的基本技能，如市场分析，可行性分析，需求分析，结构设计，详细设计，软件测试等。一句话可以概括我的看法：&ldquo;创意无限，流程保证&rdquo;。 <br /><br /><strong>拥有强烈的好奇心</strong> <br /><br />什么才是一个程序员的终极武器呢，那就是强烈的好奇心和学习精神。没有比强烈的好奇心和学习精神更好的武器了，它是程序员们永攀高峰的源泉和动力所在。<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://justjavac.javaeye.com/blog/178389#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><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Apr 2008 14:10:59 +0800</pubDate>
        <link>http://justjavac.javaeye.com/blog/178389</link>
        <guid>http://justjavac.javaeye.com/blog/178389</guid>
      </item>
      <item>
        <title>java解惑 - 漂亮的火花</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://justjavac.javaeye.com/blog/175267" style="color:red;">http://justjavac.javaeye.com/blog/175267</a>&nbsp;
          发表时间: 2008年03月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>下面的程序用一个方法对字符进行了分类。这个程序会打印出什么呢？ <br />public class Classifier { <br />&nbsp;&nbsp;&nbsp; public static void main(String[] args) { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classify('n') + classify('+') + classify('2')); <br />&nbsp;&nbsp;&nbsp; } </p><p><br />&nbsp;&nbsp;&nbsp; static String classify(char ch) { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (&quot;0123456789&quot;.indexOf(ch) &gt;= 0) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &quot;NUMERAL &quot;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (&quot;abcdefghijklmnopqrstuvwxyz&quot;.indexOf(ch) &gt;= 0) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &quot;LETTER &quot;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* (Operators not supported yet) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (&quot;+-*/&amp;|!=&quot; &gt;= 0) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &quot;OPERATOR &quot;; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &quot;UNKNOWN&quot;;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;} <br />} <br /><br />如果你猜想该程序将打印LETTER UNKNOWN NUMERAL，那么你就掉进陷阱里面了。这个程序连编译都通不过。让我们再看一看相关的部分，这一次我们用语法高亮显示： </p><pre name="code" class="java">if (&quot;abcdefghijklmnopqrstuvwxyz&quot;.indexOf(ch) &gt;= 0)
             return &quot;LETTER &quot;;
        /* (Operators not supported yet)
        if (&quot;+-*/&amp;|!=&quot; &gt;= 0)
                 return &quot;OPERATOR &quot;;
        */
        return &quot;UNKNOWN&quot;;
    }
}</pre><br /><br />正如你之所见，注释在包含了字符*/的字符串内部就结束了，结果使得程序在语法上变成非法的了。我们将程序中的一部分注释出来的尝试之所以失败了，是因为字符串字面常量在注释中没有被特殊处理。 <br />更一般地讲，注释内部的文本没有以任何方式进行特殊处理[JLS 3.7]。因此，块注释不能嵌套。请考虑下面的代码段： <br /><br /><pre name="code" class="java">/* Add the numbers from 1 to n */
int sum = 0;
for (int i = 1; I &lt;= n; i++)
sum += i;</pre><br /><br />现在假设我们要将该代码段注释成为一个块注释，我们再次用粗体字突出整个注释： <br /><pre name="code" class="java">/*
/* Add the numbers from 1 to n */
int sum = 0;
for (int i = 1; I &lt;= n; i++)
sum += i;
*/</pre><br /><br />正如你之所见，我们没有能够将最初的代码段注释掉。好在所产生的代码包含了一个语法错误，因此编译器将会告诉我们代码存在着问题。 <br />你可能偶尔看到过这样的代码段，它被一个布尔表达式为常量false的if语句禁用了： <br /><br /><pre name="code" class="java">//code commented out with an if statement - doesn't always work!
if (false) {
     /* Add the numbers from 1 to n */
     int sum = 0;
     for (int i = 1; i &lt;= n; i++)
            sum += i;
}</pre><br /><br />语言规范建议将这种方式作为一种条件编译技术[JLS 14.21]，但是它不适合用来注释代码。除非要被禁用的代码是一个合法的语句序列，否则就不要使用这项技术。 <br />注释掉一个代码段的最好的方式是使用单行的注释序列。大多数IDE工具都可以自动化这个过程： <br /><br /><pre name="code" class="java">//code commented out with an if statement - doesn't always work!
//     /* Add the numbers from 1 to n */
//     int sum = 0;
//     for (int i = 1; i &lt;= n; i++)
//            sum += i;
</pre><br />总之，块注释不能可靠地注释掉代码段，应该用单行的注释序列来代替。对语言设计者来说，应该注意到可嵌套的块注释并不是一个好主意。他们强制编译器去解析块注释内部的文本，而由此引发的问题比它能够解决的问题还要多。 <p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://justjavac.javaeye.com/blog/175267#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><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>Mon, 24 Mar 2008 08:15:01 +0800</pubDate>
        <link>http://justjavac.javaeye.com/blog/175267</link>
        <guid>http://justjavac.javaeye.com/blog/175267</guid>
      </item>
      <item>
        <title>java解惑 - 编码问题</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://justjavac.javaeye.com/blog/175266" style="color:red;">http://justjavac.javaeye.com/blog/175266</a>&nbsp;
          发表时间: 2008年03月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          下面的程序从一个字节序列创建了一个字符串，然后迭代遍历字符串中的字符，并将它们作为数字打印。请描述一下程序打印出来的数字序列： <br /><pre name="code" class="java">public class StringCheese {
    public static void main(String[] args) {
        byte bytes[] = new byte[256];
        for (int i = 0; i &lt; 256; i++)
             bytes[i] = (byte)i;
        String str = new String(bytes);
        for (int i = 0, n = str.length(); i &lt; n; i++)
             System.out.println((int)str.charAt(i) + " ");
    }
}</pre><br /><br />首先，byte数组用从0到255每一个可能的byte数值进行了初始化，然后这些byte数值通过String构造器被转换成了char数值。最后，char数值被转型为int数值并被打印。打印出来的数值肯定是非负整数，因为char数值是无符号的，因此，你可能期望该程序将按顺序打印出0到255的整数。<br />如果你运行该程序，可能会看到这样的序列。但是在运行一次，可能看到的就不是这个序列了。我们在四台机器上运行它，会看到四个不同的序列，包括前面描述的那个序列。这个程序甚至都不能保证会正常终止，比打印其他任何特定字符串都要缺乏这种保证。它的行为完全是不确定的。<br /><br />这里的罪魁祸首就是String(byte[])构造器。有关它的规范描述道：“在通过解码使用平台缺省字符集的指定byte数组来构造一个新的String时，该新String的长度是字符集的一个函数，因此，它可能不等于byte数组的长度。当给定的所有字节在缺省字符集中并非全部有效时，这个构造器的行为是不确定的”[Java-API]。<br /><br />到底什么是字符集？从技术角度上讲，它是“被编码的字符集合和字符编码模式的结合物”[Java-API]。换句话说，字符集是一个包，包含了字符、表示字符的数字编码以及在字符编码序列和字节序列之间来回转换的方式。转换模式在字符集之间存在着很大的区别：某些是在字符和字节之间做一对一的映射，但是大多数都不是这样。ISO-8859-1是唯一能够让该程序按顺序打印从0到255的整数的缺省字符集，它更为大家所熟知的名字是Latin-1[ISO-8859-1]。<br /><br />J2SE运行期环境（JRE）的缺省字符集依赖于底层的操作系统和语言。如果你想知道你的JRE的缺省字符集，并且你使用的是5.0或更新的版本，那么你可以通过调用java.nio.charset.Charset.defaultCharset()来了解。如果你使用的是较早的版本，那么你可以通过阅读系统属性“file.encoding”来了解。<br /><br />幸运的是，你没有被强制要求必须去容忍各种稀奇古怪的缺省字符集。当你在char序列和byte序列之间做转换时，你可以且通常是应该显式地指定字符集。除了接受byte数字之外，还可以接受一个字符集名称的String构造器就是专为此目的而设计的。如果你用下面的构造器去替换在最初的程序中的String构造器，那么不管缺省的字符集是什么，该程序都保证能够按照顺序打印从0到255的整数：<br /><br /><br /><pre name="code" class="java">String str = new String(bytes, "ISO-8859-1");</pre><br /><br />这个构造器声明会抛出UnsupportedEncodingException异常，因此你必须捕获它，或者更适宜的方式是声明main方法将抛出它，要不然程序不能通过编译。尽管如此，该程序实际上不会抛出异常。Charset的规范要求Java平台的每一种实现都要支持某些种类的字符集，ISO-8859-1就位列其中。<br />这个谜题的教训是：每当你要将一个byte序列转换成一个String时，你都在使用某一个字符集，不管你是否显式地指定了它。如果你想让你的程序的行为是可预知的，那么就请你在每次使用字符集时都明确地指定。对API的设计者来说，提供这么一个依赖于缺省字符集的String(byte[])构造器可能并非是一个好主意。
          <br/>
          <span style="color:red;">
            <a href="http://justjavac.javaeye.com/blog/175266#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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>Mon, 24 Mar 2008 08:13:19 +0800</pubDate>
        <link>http://justjavac.javaeye.com/blog/175266</link>
        <guid>http://justjavac.javaeye.com/blog/175266</guid>
      </item>
      <item>
        <title>java解惑 - Hello world(续)</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://justjavac.javaeye.com/blog/175256" style="color:red;">http://justjavac.javaeye.com/blog/175256</a>&nbsp;
          发表时间: 2008年03月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          面的是一个合法的Java程序吗？如果是，它会打印出什么呢？ <br /><pre name="code" class="java">\u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0020\u0020\u0020
\u0063\u006c\u0061\u0073\u0073\u0020\u0055\u0067\u006c\u0079
\u007b\u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0020\u0020
\u0020\u0020\u0020\u0020\u0073\u0074\u0061\u0074\u0069\u0063
\u0076\u006f\u0069\u0064\u0020\u006d\u0061\u0069\u006e\u0028
\u0053\u0074\u0072\u0069\u006e\u0067\u005b\u005d\u0020\u0020
\u0020\u0020\u0020\u0020\u0061\u0072\u0067\u0073\u0029\u007b
\u0053\u0079\u0073\u0074\u0065\u006d\u002e\u006f\u0075\u0074
\u002e\u0070\u0072\u0069\u006e\u0074\u006c\u006e\u0028\u0020
\u0022\u0048\u0065\u006c\u006c\u006f\u0020\u0077\u0022\u002b
\u0022\u006f\u0072\u006c\u0064\u0022\u0029\u003b\u007d\u007d
</pre><br /><br />这当然是一个合法的Java程序！这不是很显而易见吗？它会打印Hello World。噢，可能是不那么明显。事实上，该程序根本让人无法理解。每当你没必要地使用了一个Unicode转义字符时，都会使你的程序的可理解性更缺失一点，而该程序将这种做法发挥到了极致。如果你很好奇，可以看看下面给出的该程序在Unicode转义字符都被转换为它们所表示的字符之后的样子： <br /><pre name="code" class="java">public 
class Ugly
{public
static
void main(
String[]
args){
System.out
.println(
“Hello w”+
“orld”);}}</pre><br /><br />下面给出了将其进行格式化整理之后的样子： <br /><pre name="code" class="java">public class Ugly {
  public static void main(String[] args){
     System.out.println("Hello w"+"orld");
  }
}</pre><br /><br />这个谜题的教训是：仅仅是因为你可以不以应有的方式去进行表达。或者说，如果你这么做会造成损害，那么就请不要这么做！更严肃地讲，这个谜题是对前面三个教训的补充：Unicode转义字符只有在你要向程序中插入用其他任何方式都无法表示的字符时才是必需的，除此之外的任何情况都不应该避免使用它们。Unicode转义字符降低了程序的清晰度，并且增加了产生bug的可能性。<br />对语言的设计者来说，也许使用Unicode转义字符来表示ASCII字符应该被定义为是非法的。这样就可以使得在谜题14、15和17（本谜题）中的程序非法，从而消除了大量的混乱。这个限制对程序员并不会造成任何困难。
          <br/>
          <span style="color:red;">
            <a href="http://justjavac.javaeye.com/blog/175256#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</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>Mon, 24 Mar 2008 08:11:20 +0800</pubDate>
        <link>http://justjavac.javaeye.com/blog/175256</link>
        <guid>http://justjavac.javaeye.com/blog/175256</guid>
      </item>
      <item>
        <title>java解惑 - Hello world</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://justjavac.javaeye.com/blog/175255" style="color:red;">http://justjavac.javaeye.com/blog/175255</a>&nbsp;
          发表时间: 2008年03月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          下面的程序是对一个老生常谈的例子做出了稍许的变化之后的版本。那么，它会打印出什么呢？ <br /><pre name="code" class="java">/**
 * Generated by the IBM IDL-to-Java compiler, version 1.0
 * from F:\TestRoot\apps\a1\units\include\PolicyHome.idl
 * Wednesday, June 17, 1998 6:44:40 o’clock AM GMT+00:00
 */
public class Test{
    public static void main(String[] args){
        System.out.print("Hell");
        System.out.println("o world");
    }
}</pre><br /><br />这个谜题看起来相当简单。该程序包含了两条语句，第一条打印Hell，而第二条在同一行打印o world，从而将两个字符串有效地连接在了一起。因此，你可能期望该程序打印出Hello world。但是很可惜，你犯了错，实际上，它根本就通不过编译。<br />问题在于注释的第三行，它包含了字符\units。这些字符以反斜杠（\）以及紧跟着的字母u开头的，而它（\u）表示的是一个Unicode转义字符的开始。遗憾的是，这些字符后面没有紧跟四个十六进制的数字，因此，这个Unicode转义字符是病构的，而编译器则被要求拒绝该程序。Unicode转义字符必须是良构的，即使是出现在注释中也是如此。<br /><br />在注释中插入一个良构的Unicode转义字符是合法的，但是我们几乎没有什么理由去这么做。程序员有时会在JavaDoc注释中使用Unicode转义字符来在文档中生成特殊的字符。 <br /><br /><pre name="code" class="java">// Unicode转义字符在JavaDoc注释中有问题的用法
/**
 * This method calls itself recursively, causing a
 * StackOverflowError to be thrown.
 * The algorithm is due to Peter von der Ah\u00E9.
 */</pre><br /><br />这项技术表示了Unicode转义字符的一种没什么用处的用法。在Javadoc注释中，应该使用HTML实体转义字符来代替Unicode转义字符： <br /><pre name="code" class="java">/**
 * This method calls itself recursively, causing a
 * StackOverflowError to be thrown.
 * The algorithm is due to Peter von der Ahé.
 */</pre><br /><br />前面的两个注释都应该是的在文档中出现的名字为“Peter der Ahé”，但是后一个注释在源文件中还是可理解的。<br />可能你会感到很诧异，在这个谜题中，问题出在注释这一信息来源自一个实际的bug报告。该程序是机器生成的，这使得我们很难追踪到问题的源头——IDL-to-Java编译器。为了避免让其他程序员也陷入此境地，在没有将Windows文件名进行预先处理，以消除的其中的反斜杠的情况下，工具应该确保不将Windows文件名置于所生成的Java源文件的注释中。<br /><br />总之，要确保字符\u不出现在一个合法的Unicode转义字符上下文之外，即使是在注释中也是如此。在机器生成的代码中要特别注意此问题。
          <br/>
          <span style="color:red;">
            <a href="http://justjavac.javaeye.com/blog/175255#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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 24 Mar 2008 08:09:40 +0800</pubDate>
        <link>http://justjavac.javaeye.com/blog/175255</link>
        <guid>http://justjavac.javaeye.com/blog/175255</guid>
      </item>
      <item>
        <title>java解惑 - 转义字符</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://justjavac.javaeye.com/blog/175254" style="color:red;">http://justjavac.javaeye.com/blog/175254</a>&nbsp;
          发表时间: 2008年03月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          下面的程序使用了两个Unicode的转义字符，它们是用其十六进制代码来表示Unicode字符。那么，这个程序会打印什么呢？ <br /><pre name="code" class="java">public class EscapeRout{
    public static void main(String[] args){
        // \u0022 是双引号的Unicode转义字符
        System.out.println("a\u0022.length()
+\u0022b".length());
    }
}</pre><br /><br /><br />对该程序的一种很肤浅的分析会认为它应该打印出26，因为在由两个双引号"a\u0022.length()+\u0022b"标识的字符串之间总共有26个字符。<br />稍微深入一点的分析会认为该程序应该打印16，因为两个Unicode转义字符每一个在源文件中都需要用6个字符来表示，但是它们只表示字符串中的一个字符。因此这个字符串应该比它的外表看其来要短10个字符。 如果你运行这个程序，就会发现事情远不是这么回事。它打印的既不是26也不是16，而是2。<br /><br />理解这个谜题的关键是要知道：Java对在字符串字面常量中的Unicode转义字符没有提供任何特殊处理。编译器在将程序解析成各种符号之前，先将Unicode转义字符转换成为它们所表示的字符[JLS 3.2]。因此，程序中的第一个Unicode转义字符将作为一个单字符字符串字面常量（"a"）的结束引号，而第二个Unicode转义字符将作为另一个单字符字符串字面常量（"b"）的开始引号。程序打印的是表达式"a".length()+"b".length()，即2。<br /><br />如果该程序的作者确实希望得到这种行为，那么下面的语句将要清楚得多：<br /><br /><br /><pre name="code" class="java">System.out.println("a".length()+"b".length());</pre><br /><br />更有可能的情况是该作者希望将两个双引号字符置于字符串字面常量的内部。使用Unicode转义字符你是不能实现这一点的，但是你可以使用转义字符序列来实现[JLS 3.10.6]。表示一个双引号的转义字符序列是一个反斜杠后面紧跟着一个双引号（\”）。如果将最初的程序中的Unicode转义字符用转义字符序列来替换，那么它将打印出所期望的16：<br /><br /><pre name="code" class="java">System.out.println("a\".length()+\"b".length());</pre><br /><br />许多字符都有相应的转义字符序列，包括单引号（\'）、换行（\n）、制表符（\t）和反斜线（\\）。你可以在字符字面常量和字符串字面常量中使用转义字符序列。<br />实际上，你可以通过使用被称为八进制转义字符的特殊类型的转义字符序列，将任何ASCII字符置于一个字符串字面常量或一个字符字面常量中，但是最好是尽可能地使用普通的转义字符序列。<br /><br />普通的转义字符序列和八进制转义字符都比Unicode转义字符要好得多，因为与Unicode转义字符不同，转义字符序列是在程序被解析为各种符号之后被处理的。<br /><br />ASCII是字符集的最小公共特性集，它只有128个字符，但是Unicode有超过65,000个字符。一个Unicode转义字符可以被用来在只使用ASCII字符的程序中插入一个Unicode字符。一个Unicode转义字符精确地等价于它所表示的字符。<br /><br />Unicode转义字符被设计为用于在程序员需要插入一个不能用源文件字符集表示的字符的情况。它们主要用于将非ASCII字符置于标识符、字符串字面常量、字符字面常量以及注释中。偶尔地，Unicode转义字符也被用来在看起来颇为相似的数个字符中明确地标识其中的某一个，从而增加程序的清晰度。<br /><br />总之，在字符串和字符字面常量中要优先选择的是转义字符序列，而不是Unicode转义字符。Unicode转义字符可能会因为它们在编译序列中被处理得过早而引起混乱。不要使用Unicode转义字符来表示ASCII字符。在字符串和字符字面常量中，应该使用转义字符序列；对于除这些字面常量之外的情况，应该直接将ASCII字符插入到源文件中。
          <br/>
          <span style="color:red;">
            <a href="http://justjavac.javaeye.com/blog/175254#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><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>Mon, 24 Mar 2008 08:08:09 +0800</pubDate>
        <link>http://justjavac.javaeye.com/blog/175254</link>
        <guid>http://justjavac.javaeye.com/blog/175254</guid>
      </item>
      <item>
        <title>java解惑 - ABC</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://justjavac.javaeye.com/blog/175253" style="color:red;">http://justjavac.javaeye.com/blog/175253</a>&nbsp;
          发表时间: 2008年03月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          下面的程序将打印什么呢？ <br /><pre name="code" class="java">public class ABC{
    public static void main(String[] args){
        String letters = "ABC";
        char[] numbers = {'1', '2', '3'};
        System.out.println(letters + " easy as " + numbers);
    }
}</pre><br /><br />可能大家希望这个程序打印出ABC easy as 123。遗憾的是，它没有。如果你运行它，就会发现它打印的是诸如ABC easy as [C@16f0472之类的东西。为什么这个输出会如此丑陋？<br />尽管char是一个整数类型，但是许多类库都对其进行了特殊处理，因为char数值通常表示的是字符而不是整数。例如，将一个char数值传递给println方法会打印出一个Unicode字符而不是它的数字代码。字符数组受到了相同的特殊处理：println的char[]重载版本会打印出数组所包含的所有字符，而String.valueOf和StringBuffer.append的char[]重载版本的行为也是类似的。<br /><br />然而，字符串连接操作符在这些方法中没有被定义。该操作符被定义为先对它的两个操作数执行字符串转换，然后将产生的两个字符串连接到一起。对包括数组在内的对象引用的字符串转换定义如下[JLS 15.18.1.1]：<br /><br />如果引用为null，它将被转换成字符串"null"。否则，该转换的执行就像是不用任何参数调用该引用对象的toString方法一样；但是如果调用toString方法的结果是null，那么就用字符串"null"来代替。<br /><br />那么，在一个非空char数组上面调用toString方法会产生什么样的行为呢？数组是从Object那里继承的toString方法[JLS 10.7]，规范中描述到：“返回一个字符串，它包含了该对象所属类的名字，'@'符号，以及表示对象散列码的一个无符号十六进制整数”[Java-API]。有关Class.getName的规范描述到：在char[]类型的类对象上调用该方法的结果为字符串"[C"。将它们连接到一起就形成了在我们的程序中打印出来的那个丑陋的字符串。<br /><br />有两种方法可以订正这个程序。你可以在调用字符串连接操作之前，显式地将一个数组转换成一个字符串：<br /><br /><br /><pre name="code" class="java">System.out.println(letters + " easy as " +
                       String.valueOf(numbers));
</pre><br />或者，你可以将System.out.println调用分解为两个调用，以利用println的char[]重载版本：<br /><br /><pre name="code" class="java">System.out.print(letters + " easy as ");
System.out.println(numbers);</pre><br /><br />请注意，这些订正只有在你调用了valueOf和println方法正确的重载版本的情况下，才能正常运行。换句话说，它们严格依赖于数组引用的编译期类型。 <br />下面的程序说明了这种依赖性。看起来它像是所描述的第二种订正方式的具体实现，但是它产生的输出却与最初的程序所产生的输出一样丑陋，因为它调用的是println的Object重载版本，而不是char[]重载版本。<br /><br /><br /><pre name="code" class="java">class ABC2{
   public static void main(String[] args){
       String letters = "ABC";
       Object numbers = new char[] { '1', '2', '3' };
       System.out.print(letters + " easy as ");
       System.out.println(numbers); 
   }
}</pre><br /><br />总之，char数组不是字符串。要想将一个char数组转换成一个字符串，就要调用String.valueOf(char[])方法。某些类库中的方法提供了对char数组的类似字符串的支持，通常是提供一个Object版本的重载方法和一个char[]版本的重载方法，而之后后者才能产生我们想要的行为。<br />对语言设计者的教训是：char[]类型可能应该覆写toString方法，使其返回数组中包含的字符。更一般地讲，数组类型可能都应该覆写toString方法，使其返回数组内容的一个字符串表示。
          <br/>
          <span style="color:red;">
            <a href="http://justjavac.javaeye.com/blog/175253#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><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><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 24 Mar 2008 08:05:08 +0800</pubDate>
        <link>http://justjavac.javaeye.com/blog/175253</link>
        <guid>http://justjavac.javaeye.com/blog/175253</guid>
      </item>
      <item>
        <title>java解惑 - 最后的笑声</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://justjavac.javaeye.com/blog/175252" style="color:red;">http://justjavac.javaeye.com/blog/175252</a>&nbsp;
          发表时间: 2008年03月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          下面的程序将打印出什么呢？ <br /><br /><pre name="code" class="java">public class LastLaugh{
    public static void main(String[] args){
        System.out.print("H"+"a");
        System.out.print('H'+'a');
    }
}</pre><br /><br />你可能会认为这个程序将打印HaHa。该程序看起来好像是用两种方式连接了H和a，但是你所见为虚。如果你运行这个程序，就会发现它打印的是Ha169。那么，为什么它会产生这样的行为呢？<br /><br />正如我们所期望的，第一个对System.out.print的调用打印的是Ha：它的参数是表达式"H"+"a"，显然它执行的是一个字符串连接。而第二个对System.out.print的调用就是另外一回事了。问题在于'H'和'a'是字符型字面常量，因为这两个操作数都不是字符串类型的，所以 + 操作符执行的是加法而不是字符串连接。<br /><br />编译器在计算常量表达式'H'+'a'时，是通过我们熟知的拓宽原始类型转换将两个具有字符型数值的操作数（'H'和'a'）提升为int数值而实现的。从char到int的拓宽原始类型转换是将16位的char数值零扩展到32位的int。对于'H'，char数值是72，而对于'a'，char数值是97，因此表达式'H'+'a'等价于int常量72 + 97，或169。<br /><br />站在语言的立场上，若干个char和字符串的相似之处是虚幻的。语言所关心的是，char是一个无符号16位原始类型整数——仅此而已。对类库来说就不尽如此了，类库包含了许多可以接受char参数，并将其作为Unicode字符处理的方法。<br /><br />那么你应该怎样将字符连接在一起呢？你可以使用这些类库。例如，你可以使用一个字符串缓冲区： <br /><br /><pre name="code" class="java">StringBuffer sb = new StringBuffer();
sb.append('H');
sb.append('a');
System.out.println(sb);</pre><br /><br />这么做可以正常运行，但是显得很丑陋。其实我们还是有办法去避免这种方式所产生的拖沓冗长的代码。 你可以通过确保至少有一个操作数为字符串类型，来强制 + 操作符去执行一个字符串连接操作，而不是一个加法操作。这种常见的惯用法用一个空字符串（""）作为一个连接序列的开始，如下所示： <br /><br /><pre name="code" class="java">System.out.println("" + 'H' + 'a');</pre><br /><br />这种惯用法可以确保子表达式都被转型为字符串。尽管这很有用，但是多少有一点难看，而且它自身可能会引发某些混淆。你能猜到下面的语句将会打印出什么吗？如果你不能确定，那么就试一下： <br /><br /><pre name="code" class="java">System.out.print("2 + 2 = " + 2+2);</pre><br /><br />如果使用的是JDK 5.0，你还可以使用<br /><br /><pre name="code" class="java">System.out.printf("%c%c", 'H', 'a');</pre><br /><br />总之，使用字符串连接操作符使用格外小心。+ 操作符当且仅当它的操作数中至少有一个是String类型时，才会执行字符串连接操作；否则，它执行的就是加法。如果要连接的没有一个数值是字符串类型的，那么你可以有几种选择： <br /><br />预置一个空字符串； <br />将第一个数值用String.valueOf显式地转换成一个字符串； <br />使用一个字符串缓冲区； <br />或者如果你使用的JDK 5.0，可以用printf方法。 <br />这个谜题还包含了一个给语言设计者的教训。操作符重载，即使在Java中只在有限的范围内得到了支持，它仍然会引起混淆。为字符串连接而重载 + 操作符可能就是一个已铸成的错误。
          <br/>
          <span style="color:red;">
            <a href="http://justjavac.javaeye.com/blog/175252#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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</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>Mon, 24 Mar 2008 08:03:29 +0800</pubDate>
        <link>http://justjavac.javaeye.com/blog/175252</link>
        <guid>http://justjavac.javaeye.com/blog/175252</guid>
      </item>
      <item>
        <title>java解惑 - 半斤八两(二)</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://justjavac.javaeye.com/blog/175251" style="color:red;">http://justjavac.javaeye.com/blog/175251</a>&nbsp;
          发表时间: 2008年03月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          与上一个例子相反，如果我们给出的关于变量x和i的声明是如下的合法语句： <br /><pre name="code" class="java">x = x + i;</pre><br /><br />但是，它并不是： <br /><pre name="code" class="java">x += i;</pre><br /><br />乍一看，这个谜题可能看起来与前面一个谜题相同。但是请放心，它们并不一样。这两个谜题在哪一条语句必是合法的，以及哪一条语句必是不合法的方面，正好相反。<br />就像前面的谜题一样，这个谜题也依赖于有关复合赋值操作符的规范中的细节。二者的相似之处就此打住。基于前面的谜题，你可能会想：符合赋值操作符比简单赋值操作符的限制要少一些。在一般情况下，这是对的，但是有这么一个领域，在其中简单赋值操作符会显得更宽松一些。<br /><br />复合赋值操作符要求两个操作数都是原始类型的，例如int，或包装了的原始类型，例如Integer，但是有一个例外：如果在+=操作符左侧的操作数是String类型的，那么它允许右侧的操作数是任意类型，在这种情况下，该操作符执行的是字符串连接操作。简单赋值操作符（=）允许其左侧的是对象引用类型，这就显得要宽松许多了：你可以使用它们来表示任何你想要表示的内容，只要表达式的右侧与左侧的变量是赋值兼容的即可。<br /><br />你可以利用这一差异来解决该谜题。要想用 += 操作符来执行字符串连接操作，你就必须将左侧的变量声明为String类型。通过使用直接赋值操作符，字符串连接的结果可以存放到一个Object类型的变量中。<br /><br />为了说得具体一些，并提供一个解决方案给这个谜题，假设我们在该谜题的两个赋值表达式之前有下面这些声明： <br /><br /><pre name="code" class="java">Object x = "Buy ";
String i = "Effective Java!";</pre><br /><br />简单赋值是合法的，因为 x + i 是String类型的，而String类型又是与Object赋值兼容的： <br /><pre name="code" class="java">x = x + i;</pre><br /><br />复合赋值是非法的，因为左侧是一个Object引用类型，而右侧是一个String类型： <br /><pre name="code" class="java">x += i;</pre><br /><br />这个谜题对程序员来说几乎算不上什么教训。对语言设计者来说，加法的复合赋值操作符应该在右侧是String类型的情况下，允许左侧是Object类型。这项修改将根除这个谜题所展示的违背直觉的行为。
          <br/>
          <span style="color:red;">
            <a href="http://justjavac.javaeye.com/blog/175251#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><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>Mon, 24 Mar 2008 08:01:45 +0800</pubDate>
        <link>http://justjavac.javaeye.com/blog/175251</link>
        <guid>http://justjavac.javaeye.com/blog/175251</guid>
      </item>
      <item>
        <title>java解惑 - 半斤八两(一)</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://justjavac.javaeye.com/blog/175250" style="color:red;">http://justjavac.javaeye.com/blog/175250</a>&nbsp;
          发表时间: 2008年03月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我们给出一个对变量x和i的声明即可，它肯定是一个合法的语句： <br /><pre name="code" class="java">x += i;</pre><br /><br />但是，它并不是： <br /><pre name="code" class="java">x = x + i;</pre><br /><br />许多程序员都会认为该迷题中的第一个表达式（x += i）只是第二个表达式（x = x + i）的简写方式。但是这并不十分准确。这两个表达式都被称为赋值表达式。第二条语句使用的是简单赋值操作符（=），而第一条语句使用的是复合赋值操作符。（复合赋值操作符包括 +=、-=、*=、/=、%=、&lt;&lt;=、>>=、>>>=、&=、^=和|=）Java语言规范中讲到，复合赋值 E1 op= E2等价于简单赋值E1 = (T)((E1)op(E2))，其中T是E1的类型，除非E1只被计算一次。<br />换句话说，复合赋值表达式自动地将它们所执行的计算的结果转型为其左侧变量的类型。如果结果的类型与该变量的类型相同，那么这个转型不会造成任何影响。然而，如果结果的类型比该变量的类型要宽，那么复合赋值操作符将悄悄地执行一个窄化原始类型转换。因此，我们有很好的理由去解释为什么在尝试着执行等价的简单赋值可能会产生一个编译错误。<br /><br />为了说得具体一些，并提供一个解决方案给这个谜题，假设我们在该谜题的两个赋值表达式之前有下面这些声明： <br /><br /><pre name="code" class="java">short x = 0;
int i = 123456;</pre><br /><br />复合赋值编译将不会产生任何错误： <br /><pre name="code" class="java">x += i; // 包含了一个隐藏的转型！</pre><br /><br />你可能期望x的值在这条语句执行之后是123,456，但是并非如此l，它的值是-7,616。int类型的数值123456对于short来说太大了。自动产生的转型悄悄地把int数值的高两位给截掉了。这也许就不是你想要的了。<br />相对应的简单赋值是非法的，因为它试图将int数值赋值给short变量，它需要一个显式的转型： <br /><br /><pre name="code" class="java">x = x + i; // 不要编译——“可能会丢掉精度”</pre><br /><br />这应该是明显的，复合赋值表达式可能是很危险的。为了避免这种令人不快的突袭，请不要将复合赋值操作符作用于byte、short或char类型的变量上。在将复合赋值操作符作用于int类型的变量上时，要确保表达式右侧不是long、float或double类型。在将复合赋值操作符作用于float类型的变量上时，要确保表达式右侧不是double类型。这些规则足以防止编译器产生危险的窄化转型。<br />总之，复合赋值操作符会悄悄地产生一个转型。如果计算结果的类型宽于变量的类型，那么所产生的转型就是一个危险的窄化转型。这样的转型可能会悄悄地丢弃掉精度或数量值。对语言设计者来说，也许让复合赋值操作符产生一个不可见的转型本身就是一个错误；对于在复合赋值中的变量类型比计算结果窄的情况，也许应该让其非法才对。
          <br/>
          <span style="color:red;">
            <a href="http://justjavac.javaeye.com/blog/175250#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><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><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 24 Mar 2008 08:00:12 +0800</pubDate>
        <link>http://justjavac.javaeye.com/blog/175250</link>
        <guid>http://justjavac.javaeye.com/blog/175250</guid>
      </item>
      <item>
        <title>java解惑 - 条件运算符</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://justjavac.javaeye.com/blog/175249" style="color:red;">http://justjavac.javaeye.com/blog/175249</a>&nbsp;
          发表时间: 2008年03月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这个谜题将测试你对条件操作符的掌握程度，这个操作符有一个更广为人知的名字：问号冒号操作符。下面的程序将会打印出什么呢？ <br /><pre name="code" class="java">public class DosEquis{
	public static void main(String[] args){
		char x = 'X';
		int i = 0;
		System.out.println(true ? x : 0); 
		System.out.println(false ? i : x); 
	}
}</pre><br /><br />这个程序由两个变量声明和两个print语句构成。第一个print语句计算条件表达式(true ? x : 0)并打印出结果，这个结果是char类型变量x的值’X’。而第二个print语句计算表达式(false ? i : x)并打印出结果，这个结果还是依旧是’X’的x，因此这个程序应该打印XX。然而，如果你运行该程序，你就会发现它打印出来的是X88。这种行为看起来挺怪的。第一个print语句打印的是X，而第二个打印的却是88。它们的不同行为说明了什么呢？<br />答案就在规范有关条件表达式部分的一个阴暗的角落里。请注意在这两个表达式中，每一个表达式的第二个和第三个操作数的类型都不相同：x是char类型的，而0和i都是int类型的。就像在谜题5的解答中提到的，混合类型的计算会引起混乱，而这一点比在条件表达式中比在其它任何地方都表现得更明显。你可能考虑过，这个程序中两个条件表达式的结果类型是相同的，就像它们的操作数类型是相同的一样，尽管操作数的顺序颠倒了一下，但是实际情况并非如此。<br /><br />确定条件表达式结果类型的规则过于冗长和复杂，很难完全记住它们，但是其核心就是一下三点：<br /><br /><br />如果第二个和第三个操作数具有相同的类型，那么它就是条件表达式的类型。换句话说，你可以通过绕过混合类型的计算来避免大麻烦。<br /><br />如果一个操作数的类型是T，T表示byte、short或char，而另一个操作数是一个int类型的常量表达式，它的值是可以用类型T表示的，那么条件表达式的类型就是T。<br /><br />否则，将对操作数类型运用二进制数字提升，而条件表达式的类型就是第二个和第三个操作数被提升之后的类型。<br />2、3两点对本谜题是关键。在程序的两个条件表达式中，一个操作数的类型是char，另一个的类型是int。在两个表达式中，int操作数都是0，它可以被表示成一个char。然而，只有第一个表达式中的int操作数是常量（0），而第二个表达式中的int操作数是变量（i）。因此，第2点被应用到了第一个表达式上，它返回的类型是char，而第3点被应用到了第二个表达式上，其返回的类型是对int和char运用了二进制数字提升之后的类型，即int。<br /><br />条件表达式的类型将确定哪一个重载的print方法将被调用。对第一个表达式来说，PrintStream.print(char)将被调用，而对第二个表达式来说，PrintStream.print(int)将被调用。前一个重载方法将变量x的值作为Unicode字符（X）来打印，而后一个重载方法将其作为一个十进制整数（88）来打印。至此，谜题被解开了。<br /><br />总之，通常最好是在条件表达式中使用类型相同的第二和第三操作数。否则，你和你的程序的读者必须要彻底理解这些表达式行为的复杂规范。<br /><br />对语言设计者来说，也许可以设计一个牺牲掉了部分灵活性，但是增加了简洁性的条件操作符。例如，要求第二和第三操作数必须就有相同的类型，这看起来就很合理。或者，条件操作符可以被定义为对常量没有任何特殊处理。为了让这些选择对程序员来说更加容易接受，可以提供用来表示所有原始类型字面常量的语法。这也许确实是一个好注意，因为它增加了语言的一致性和完备性，同时又减少了对转型的需求。
          <br/>
          <span style="color:red;">
            <a href="http://justjavac.javaeye.com/blog/175249#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><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>Mon, 24 Mar 2008 07:57:57 +0800</pubDate>
        <link>http://justjavac.javaeye.com/blog/175249</link>
        <guid>http://justjavac.javaeye.com/blog/175249</guid>
      </item>
      <item>
        <title>java解惑 - 奇数性</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://justjavac.javaeye.com/blog/175247" style="color:red;">http://justjavac.javaeye.com/blog/175247</a>&nbsp;
          发表时间: 2008年03月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          下面的方法意图确定它那唯一的参数是否是一个奇数。这个方法能够正确运转吗？ <br /><pre name="code" class="java">public static boolean isOdd(int i){
	return i % 2 == 1;
}</pre><br /><br />奇数可以被定义为被2整除余数为1的整数。表达式 i % 2 计算的是 i 整除 2 时所产生的余数，因此看起来这个程序应该能够正确运转。遗憾的是，它不能；它在四分之一的时间里返回的都是错误的答案。<br />为什么是四分之一？因为在所有的 int 数值中，有一半都是负数，而 isOdd 方法对于对所有负奇数的判断都会失败。在任何负整数上调用该方法都回返回 false ，不管该整数是偶数还是奇数。<br /><br />这是 Java 对取余操作符（%）的定义所产生的后果。该操作符被定义为对于所有的 int 数值 a 和所有的非零 int 数值 b，都满足下面的恒等式： <br /><br /><pre name="code" class="java">(a / b) * b + (a % b) == a</pre><br /><br />换句话说，如果你用b整除a，将商乘以b，然后加上余数，那么你就得到了最初的值 a 。该恒等式具有正确的含义，但是当与 Java 的截尾整数整除操作符相结合时，它就意味着：当取余操作返回一个非零的结果时，它与左操作数具有相同的正负符号。<br />当 i 是一个负奇数时，i % 2 等于-1而不是1， 因此 isOdd 方法将错误地返回 false。为了防止这种意外，请测试你的方法在为每一个数值型参数传递负数、零和正数数值时，其行为是否正确。<br /><br />这个问题很容易订正。只需将 i % 2 与0而不是与1比较，并且反转比较的含义即可： <br /><br /><pre name="code" class="java">public static boolean isOdd(int i){
	return i % 2 != 0;
}</pre><br /><br />如果你正在在一个性能临界（performance-critical）环境中使用isOdd方法，那么用位操作符AND（&）来替代取余操作符会显得更好： <br /><pre name="code" class="java">public static boolean isOdd(int i){
	return (i & 1) != 0;
}</pre><br /><br />总之，无论你何时使用到了取余操作符，都要考虑到操作数和结果的符号。该操作符的行为在其操作数非负时是一目了然的，但是当一个或两个操作数都是负数时，它的行为就不那么显而易见了。
          <br/>
          <span style="color:red;">
            <a href="http://justjavac.javaeye.com/blog/175247#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 24 Mar 2008 07:55:07 +0800</pubDate>
        <link>http://justjavac.javaeye.com/blog/175247</link>
        <guid>http://justjavac.javaeye.com/blog/175247</guid>
      </item>
      <item>
        <title>变态的C程序(二)_高精度阶乘</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://justjavac.javaeye.com/blog/171562" style="color:red;">http://justjavac.javaeye.com/blog/171562</a>&nbsp;
          发表时间: 2008年03月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="c">#include&lt;stdio.h>
#define BITS 500 /*不小于结果的位数*/
long R,a,y,_[(BITS+11)/6]={!!BITS,!!BITS},_1=!!BITS;int main(int __){
return~-__?y?__>a?printf("%06ld",__[_-a]),main(~-__):0:(_1&lt;=*_||__++&lt;a&&(_1=!(R=0))
?R+=_[_1]*__,_[_1]=R%1000000l,R/=1000000l,_1++==*_&&R&&++*_:(__=*_+a,
y+=printf("%ld",_[__---a])),main(__)):(scanf("%ld",&a),a&lt;0?printf("error"):
(a&lt;(printf("a! =\n"),2)
?printf("1"):main(!0&lt;&lt;1)));}</pre><br /><br />符合C99标准，在TC2、VS2005、MinGW上通过
          <br/>
          <span style="color:red;">
            <a href="http://justjavac.javaeye.com/blog/171562#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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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, 15 Mar 2008 08:54:04 +0800</pubDate>
        <link>http://justjavac.javaeye.com/blog/171562</link>
        <guid>http://justjavac.javaeye.com/blog/171562</guid>
      </item>
      <item>
        <title>变态的C程序(-)</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://justjavac.javaeye.com/blog/171560" style="color:red;">http://justjavac.javaeye.com/blog/171560</a>&nbsp;
          发表时间: 2008年03月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="c">#include &lt;stdio.h>
main(t,_,a)char *a;{return!0&lt;t?t&lt;3?main(-79,-13,a+main(-87,1-_,
main(-86,0,a+1)+a)):1,t&lt;_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_&lt;13?
main(2,_+1,"%s %d %d\n"):9:16:t&lt;0?t&lt;-72?main(_,t,
"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#\
;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l \
q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# \
){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' \
iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \
;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# \
}'+}##(!!/")
:t&lt;-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1)
:0&lt;t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a,
"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}
</pre><br /><br />P.S附上我的运行结果：<br /><br />On the first day of Christmas my true love gave to me<br />a partridge in a pear tree.<br /><br />On the second day of Christmas my true love gave to me<br />two turtle doves<br />and a partridge in a pear tree.<br /><br />On the third day of Christmas my true love gave to me<br />three french hens, two turtle doves<br />and a partridge in a pear tree.<br /><br />On the fourth day of Christmas my true love gave to me<br />four calling birds, three french hens, two turtle doves<br />and a partridge in a pear tree.<br /><br />On the fifth day of Christmas my true love gave to me<br />five gold rings;<br />four calling birds, three french hens, two turtle doves<br />and a partridge in a pear tree.<br /><br />On the sixth day of Christmas my true love gave to me<br />six geese a-laying, five gold rings;<br />four calling birds, three french hens, two turtle doves<br />and a partridge in a pear tree.<br /><br />On the seventh day of Christmas my true love gave to me<br />seven swans a-swimming,<br />six geese a-laying, five gold rings;<br />four calling birds, three french hens, two turtle doves<br />and a partridge in a pear tree.<br /><br />On the eigth day of Christmas my true love gave to me<br />eight maids a-milking, seven swans a-swimming,<br />six geese a-laying, five gold rings;<br />four calling birds, three french hens, two turtle doves<br />and a partridge in a pear tree.<br /><br />On the ninth day of Christmas my true love gave to me<br />nine ladies dancing, eight maids a-milking, seven swans a-swimming,<br />six geese a-laying, five gold rings;<br />four calling birds, three french hens, two turtle doves<br />and a partridge in a pear tree.<br /><br />On the tenth day of Christmas my true love gave to me<br />ten lords a-leaping,<br />nine ladies dancing, eight maids a-milking, seven swans a-swimming,<br />six geese a-laying, five gold rings;<br />four calling birds, three french hens, two turtle doves<br />and a partridge in a pear tree.<br /><br />On the eleventh day of Christmas my true love gave to me<br />eleven pipers piping, ten lords a-leaping,<br />nine ladies dancing, eight maids a-milking, seven swans a-swimming,<br />six geese a-laying, five gold rings;<br />four calling birds, three french hens, two turtle doves<br />and a partridge in a pear tree.<br /><br />On the twelfth day of Christmas my true love gave to me<br />twelve drummers drumming, eleven pipers piping, ten lords a-leaping,<br />nine ladies dancing, eight maids a-milking, seven swans a-swimming,<br />six geese a-laying, five gold rings;<br />four calling birds, three french hens, two turtle doves<br />and a partridge in a pear tree.
          <br/>
          <span style="color:red;">
            <a href="http://justjavac.javaeye.com/blog/171560#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><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><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 15 Mar 2008 08:46:42 +0800</pubDate>
        <link>http://justjavac.javaeye.com/blog/171560</link>
        <guid>http://justjavac.javaeye.com/blog/171560</guid>
      </item>
      <item>
        <title>一个很牛的计算pi的c程序</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://justjavac.javaeye.com/blog/171558" style="color:red;">http://justjavac.javaeye.com/blog/171558</a>&nbsp;
          发表时间: 2008年03月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="c">#include   
#include   

long a=10000, b, c=2800, d, e, f[2801], g;  

main()  
{  
  for(;b-c;)  
    f[b++]=a/5;  
  for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)  
    for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);  
}</pre> <br /><br />计算结果：  <br />3141592653589793238462643383279502884197169399375105820974944592307816406<br />2862089986280348253421170679821480865132823066470938446095505822317253594<br />0812848111745028410270193852110555964462294895493038196442881097566593344<br />6128475648233786783165271201909145648566923460348610454326648213393607260<br />2491412737245870066063155881748815209209628292540917153643678925903600113<br />3053054882046652138414695194151160943305727036575959195309218611738193261<br />1793105118548074462379962749567351885752724891227938183011949129833673362<br />4406566430860213949463952247371907021798609437027705392171762931767523846<br />7481846766940513200056812714526356082778577134275778960917363717872146844<br />0901224953430146549585371050792279689258923542019956112129021960864034418<br />1598136297747713099605187072113499999983729780499510597317328160963185
          <br/>
          <span style="color:red;">
            <a href="http://justjavac.javaeye.com/blog/171558#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 15 Mar 2008 08:37:19 +0800</pubDate>
        <link>http://justjavac.javaeye.com/blog/171558</link>
        <guid>http://justjavac.javaeye.com/blog/171558</guid>
      </item>
      <item>
        <title>因为你是男人 - 崔晓柏</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://justjavac.javaeye.com/blog/170640" style="color:red;">http://justjavac.javaeye.com/blog/170640</a>&nbsp;
          发表时间: 2008年03月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>因为你是男人</strong><br /><br />       当母亲带着疲惫的微笑将你捧给世界，你已经是一座高山，是一片大海了。性别交给你一副重担，指给你一条路，对你说：走吧，你这男子汉！于是你便要长一副铮铮铁骨，把脚下坚实的土地踏得咚咚作响，去完成你的使命、你的光荣、你的答卷。 <br /><br />        当洪水涌来的时候，你要退在最后；当大火燃烧的时候，你却要扑在前边。因为你是男人，你就应该有一副侠肝义胆！ <br /><br />        当朋友成功的时候，你要大碗喝酒；与女友分手时，要真诚地说声道歉。因为你是男人，你就应该如此气壮心宽。 <br /><br />        因为你是男人，所以，对女儿你应是一棵结满故事的大树，对妻子你应是一片金色的沙滩，对父母更该是一座物产丰富的大山。 <br /><br />        因为你是男人，一生就要有所成就。不懒惰，不侥幸，不虚荣，不欺骗，不流泪，不妒嫉，不后悔，不自卑，不献媚，不投机，不唯利是图，不    抱怨，男人就应该堂堂正正、磊磊落落、风度翩翩。 <br /><br />        做个好男人也是一项事业啊。一个民族仅有女人的光荣是不够的，阴盛阳衰对每个男人来说都应该觉得行秽自惭。 <br /><br />        也许你很矮，但好男人博大的胸怀才情会使你顶天立地；也许你很弱，但好男人坚定的意志品格将赋予你狭义铁肩；也许你恶疾缠身，但好男人的字典里根本没有伤残。 <br /><br />        男人，光荣的性别。这光荣的全部内涵就在于去承担责任和义务做出牺牲和奉献。做个好男人吧！你别无选择，因为你已经是个男人了。
          <br/>
          <span style="color:red;">
            <a href="http://justjavac.javaeye.com/blog/170640#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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 12 Mar 2008 20:56:58 +0800</pubDate>
        <link>http://justjavac.javaeye.com/blog/170640</link>
        <guid>http://justjavac.javaeye.com/blog/170640</guid>
      </item>
      <item>
        <title>因为你是男人</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://justjavac.javaeye.com/blog/170633" style="color:red;">http://justjavac.javaeye.com/blog/170633</a>&nbsp;
          发表时间: 2008年03月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div style="text-align: center"><span style="font-size: x-large;">因为你是男人</span>
</div>
<div style="text-align: center">                                            <strong>      崔晓柏</strong>
<img src="../../../images/smiles/icon_arrow.gif" alt="" />
</div>
<div style="text-align: center"> </div>
<p><br />
<br />
<span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当母亲带着疲惫的微笑将你捧给世界，你已经是一座高山，是一片大海了。性别交给你一副重担，指给你一条路，对你说：走吧，你这男子汉！于是你便要长一副铮铮铁骨，把脚下坚实的土地踏得咚咚作响，去完成你的使命、你的光荣、你的答卷。 <br />
<br />
<br />
&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; 当洪水涌来的时候，你要退在最后；当大火燃烧的时候，你却要扑在前边。因为你是男人，你就应该有一副侠肝义胆！ <br />
<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; 当朋友成功的时候，你要大碗喝酒；与女友分手时，要真诚地说声道歉。因为你是男人，你就应该如此气壮心宽。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因为你是男人，所以，对女儿你应是一棵结满故事的大树，对妻子你应是一片金色的沙滩，对父母更该是一座物产丰富的大山。 <br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; 因为你是男人，一生就要有所成就。不懒惰，不侥幸，不虚荣，不欺骗，不流泪，不妒嫉，不后悔，不自卑，不献媚，不投机，不唯利是图，不&nbsp;&nbsp;&nbsp; 抱怨，男人就应该堂堂正正、磊磊落落、风度翩翩。 <br />
<br />
<br />
&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; 做个好男人也是一项事业啊。一个民族仅有女人的光荣是不够的，阴盛阳衰对每个男人来说都应该觉得行秽自惭。 <br />
<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; 也许你很矮，但好男人博大的胸怀才情会使你顶天立地；也许你很弱，但好男人坚定的意志品格将赋予你狭义铁肩；也许你恶疾缠身，但好男人的字典里根本没有伤残。 <br />
<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; 男人，光荣的性别。这光荣的全部内涵就在于去承担责任和义务做出牺牲和奉献。做个好男人吧！你别无选择，因为你已经是个男人了。</span>
</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://justjavac.javaeye.com/blog/170633#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><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><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 12 Mar 2008 20:02:03 +0800</pubDate>
        <link>http://justjavac.javaeye.com/blog/170633</link>
        <guid>http://justjavac.javaeye.com/blog/170633</guid>
      </item>
      <item>
        <title>一对IT情侣的对话</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://justjavac.javaeye.com/blog/170311" style="color:red;">http://justjavac.javaeye.com/blog/170311</a>&nbsp;
          发表时间: 2008年03月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="color: indigo">男，就职于一家IT媒体。 女，就职于一家IT公司。</span> <br />   <br />女：亲爱的，最近我发现你情绪低落，反应速度大大降低，是不是头脑里碎片太多，要不要我帮你整理一下？<br />    <br />男：我也说不清楚，我觉得越来越与同事不兼容了。   <br /> <br />女：也许这与你和他们配置有关系，你们办公室好像就你一个是从外地毕业分到北京的。    <br /><br />男：这不是主要原因。有时，他们谈得正热闹时，我一插话就死机。<br />    <br />女：难道你谈了什么非法话题？    <br /><br />男：不是我非法，他们尽谈论一些行业应用话题，什么汽车啦，房子啦，三陪啦。我觉得他们的话题版本大低，应该升级。   <br /> <br />女：你应该学会向下兼容。  <br />  <br />男：这是一个迅速更新换代的社会，向下兼容未免成本太高。而且，还造成很大的资源浪费。我倒认为他们应该扩充内存。 <br />   <br />女：你知道吗，亲爱的，有些事情并不是简单的内存升级所能解决的，关键问题在于头脑的运行速度和缓存大小。   <br /> <br />男：他们的处理速度并不比我慢。他们总是不同的话题切换来切换去，但每次都没有结果。 <br />   <br />女：难道你对这种同时打开多个话题窗口的方式不习惯吗？现代社会完全能够支持这种多任务话题系统。    <br /><br />男：但为什么我要么插不上话，要么一插就死机呢？    <br /><br />女：他们不会对你设屏幕保护吧？    <br /><br />男：我真的很想浏览一下他们的大脑，看看每天他们都有什么，可惜我不知道入口地址。  <br />  <br />女：你干吗不用搜索引擎对他们每天谈话的关键词进行搜索,他们说IT人才,你就搜索”软件客”？    <br /><br />男：这样未免有黑客的嫌疑。   <br /> <br />女：亲爱的，看来你真的需要提高你的知识刷新频率。对了，还有你衣服的墙纸颜色，你不能总是使用标准衣服墙纸。    <br /><br />男：我很希望每次与同事的谈话都从我这点击开始，我甚至希望能把这种谈话的初始化条件粘贴到以前的朋友圈子中去。    <br /><br />女：我得提醒你，一次开发并不是一定能到处运行。  <br />  <br />男：不，我不是那个意思，我只是想在社交中寻求更好的稳定性。  <br />  <br />女：我很高兴你能改变你的伙伴策略，我会很快给你做一张寒暄启动盘。但是，在我们安全退出这次谈话任务前，难道你不想对我的嘴唇做定期扫描吗？    <br /><br />男：嗨！亲爱的，我差点忘了。（扫描进行中......）扫描中发现一个小小的辣椒错误，重试还是取消？    <br /><br />女：忽略！
          <br/>
          <span style="color:red;">
            <a href="http://justjavac.javaeye.com/blog/170311#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</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, 11 Mar 2008 22:04:35 +0800</pubDate>
        <link>http://justjavac.javaeye.com/blog/170311</link>
        <guid>http://justjavac.javaeye.com/blog/170311</guid>
      </item>
      <item>
        <title>IT行业的搞笑瞬间</title>
        <author>justjavac</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justjavac.javaeye.com">justjavac</a>&nbsp;
          链接：<a href="http://justjavac.javaeye.com/blog/170310" style="color:red;">http://justjavac.javaeye.com/blog/170310</a>&nbsp;
          发表时间: 2008年03月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          导读：《Computerworld》网站10月17日评出了IT史上10大最尴尬瞬间，其中包括比尔·盖茨遭遇Windows 98蓝屏死机、索尼BMG版权保护软件引起消费者反感等。下面就是这10大尴尬瞬间的简介： <br /><br />　　1、比尔·盖茨遭遇Windows 98蓝屏死机 <br /><br />　　与Windows 3.1相比，Windows 95提供了更为出色的用户界面，但其功能及稳定性还有待完善。微软对此表示，Windows 98的稳定性将大幅提高。然而Windows 98的蓝屏死机现象仍然严重。最令人尴尬的是，在1998年举办的COMDEX/Spring主题演讲中，盖茨在演示Windows 98亮点之一的USB功能时，系统出现严重故障，并最终导致蓝屏死机现象。 <br /><br />　　2、鲍尔默摇身变“舞猴” <br /><br />　　在2001年举行的微软员工聚会上，CEO史蒂夫·鲍尔默在台上手舞足蹈，随着节奏强劲的音乐满场乱跳狂喊半分钟，近乎疯狂，为此他获得了“舞猴(Monkey Boy)”的绰号。数天后，鲍尔默对自己当时所作所为懊悔不已。他这样做是为了显示自己风趣的一面，还是为了缓解工作压力？人们或许永远不会知道答案。 <br /><br />　　3、Vista语音识别功能闹笑话 <br /><br />　　盖茨曾预测，今后语音识别功能的使用频度将赶上键盘输入。但在2006年举行的一场Windows Vista语音识别功能演示过程中，显示屏上显示微软高管所说的话语中，几乎每个单词都存在拼写错误。 <br /><br />　　4、IBM高管伪造履历 <br /><br />　　作为IBM莲花(Lotus)开发部门主管，杰夫·帕波斯(Jeff Papows)无疑有着很强的执行能力。然而在他1999年提交的履历中，却存在不少夸大事实之处。帕波斯声称自己曾获得海军陆战队上校军衔并担任过作战直升机飞行员，但实际上他只负责空中运输控制事务，军衔为海军上尉。他还声称自己获得某名牌大学工商管理哲学博士学位，而实际上他只获得一所函授