﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-&lt;font color="red"&gt;JRen&lt;/font&gt;&lt;font color="lightgreen"&gt;大鹏一曰同风起，扶摇直上九万里&lt;/font&gt;-随笔分类-Java</title><link>http://www.blogjava.net/liaojiyong/category/11433.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 05 Jun 2007 06:59:54 GMT</lastBuildDate><pubDate>Tue, 05 Jun 2007 06:59:54 GMT</pubDate><ttl>60</ttl><item><title>能为你的程序锦上添花的几种程序结构（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/06/05/122123.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Tue, 05 Jun 2007 05:26:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/06/05/122123.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/122123.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/06/05/122123.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/122123.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/122123.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一."用到再说"结构.如果有一个类有一个集合成员,可以在为此成员添加元素时再把具体集合建立起来,以免浪费空间和时间.例:&nbsp;1&nbsp;public&nbsp;class&nbsp;Company{&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;List&nbsp;members=null;&nbsp;3&nbsp;&nbsp;...&nbsp;&nbsp;<a href='http://www.blogjava.net/liaojiyong/archive/2007/06/05/122123.html'>阅读全文</a><img src ="http://www.blogjava.net/liaojiyong/aggbug/122123.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-06-05 13:26 <a href="http://www.blogjava.net/liaojiyong/archive/2007/06/05/122123.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java虚拟机运行机制(转)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119762.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 24 May 2007 08:46:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119762.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/119762.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/119762.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/119762.html</trackback:ping><description><![CDATA[<font face=Verdana>JVM(Java虚拟机)一种用于计算设备的规范，可用不同的方式（软件或硬件）加以实现。编译虚拟机的指令集与编译微处理器的指令集非常类似。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。&nbsp;</font>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上，就能保证经过编译的任何Java代码能够在该系统上运行。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。</p>
<p><strong>一、Java虚拟机(JVM)概述</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.为什么要使用Java虚拟机</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.谁需要了解Java虚拟机</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java虚拟机是Java语言底层实现的基础,对Java语言感兴趣的人都应对Java虚拟机有个大概的了解。这有助于理解Java语言的一些性质,也有助于使用Java语言。对于要在特定平台上实现Java虚拟机的软件人员,Java语言的编译器作者以及要用硬件芯片实现Java虚拟机的人来说,则必须深刻理解Java虚拟机的规范。另外,如果你想扩展Java语言,或是把其它语言编译成Java语言的字节码,你也需要深入地了解Java虚拟机。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.Java虚拟机支持的数据类型</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java虚拟机支持Java语言的基本数据类型如下:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte://1字节有符号整数的补码&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short://2字节有符号整数的补码&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int://4字节有符号整数的补码&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long://8字节有符号整数的补码&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float://4字节IEEE754单精度浮点数&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double://8字节IEEE754双精度浮点数&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char://2字节无符号Unicode字符</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;几乎所有的Java类型检查都是在编译时完成的。上面列出的原始数据类型的数据在Java执行时不需要用硬件标记。操作这些原始数据类型数据的字节码(指令)本身就已经指出了操作数的数据类型,例如iadd、ladd、fadd和dadd指令都是把两个数相加,其操作数类型别是int、long、float和double。虚拟机没有给boolean(布尔)类型设置单独的指令。boolean型的数据是由integer指令,包括integer返回来处理的。boolean型的数组则是用byte数组来处理的。虚拟机使用IEEE754格式的浮点数。不支持IEEE格式的较旧的计算机,在运行Java数值计算程序时,可能会非常慢。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;虚拟机支持的其它数据类型包括:&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;object//对一个Javaobject(对象)的4字节引用&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnAddress//4字节,用于jsr/ret/jsr-w/ret-w指令&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注:Java数组被当作object处理。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;虚拟机的规范对于object内部的结构没有任何特殊的要求。在Sun公司的实现中,对object的引用是一个句柄,其中包含一对指针:一个指针指向该object的方法表,另一个指向该object的数据。用Java虚拟机的字节码表示的程序应该遵守类型规定。Java虚拟机的实现应拒绝执行违反了类型规定的字节码程序。Java虚拟机由于字节码定义的限制似乎只能运行于32位地址空间的机器上。但是可以创建一个Java虚拟机,它自动地把字节码转换成64位的形式。从Java虚拟机支持的数据类型可以看出,Java对数据类型的内部格式进行了严格规定,这样使得各种Java虚拟机的实现对数据的解释是相同的,从而保证了Java的与平台无关性和可&nbsp;<br>移植性。</p>
<p><br><strong>二、Java虚拟机JVM规格描述</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JVM的设计目标是提供一个基于抽象规格描述的计算机模型，为解释程序开发人员提很好的灵活性，同时也确保Java代码可在符合该规范的任何系统上运行。JVM对其实现的某些方面给出了具体的定义，特别是对Java可执行代码，即字节码(Bytecode)的格式给出了明确的规格。这一规格包括操作码和操作数的语法和数值、标识符的数值表示方式、以及Java类文件中的Java对象、常量缓冲池在JVM的存储映象。这些定义为JVM解释器开发人员提供了所需的信息和开发环境。Java的设计者希望给开发人员以随心所欲使用Java的自由。&nbsp;　　　　JVM定义了控制Java代码解释执行和具体实现的五种规格，它们是：&nbsp;　　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*JVM指令系统&nbsp;　　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*JVM寄存器&nbsp;　　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*JVM栈结构&nbsp;　　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*JVM碎片回收堆&nbsp;　　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*JVM存储区&nbsp;</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.1JVM指令系统&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JVM指令系统同其他计算机的指令系统极其相似。Java指令也是由&nbsp;操作码和操作数两部分组成。操作码为8位二进制数，操作数进紧随在操作码的后面，其长度根据需要而不同。操作码用于指定一条指令操作的性质（在这里我们采用汇编符号的形式进行说明），如iload表示从存储器中装入一个整数，anewarray表示为一个新数组分配空间，iand表示两个整数的"与"，ret用于流程控制，表示从对某一方法的调用中返回。当长度大于8位时，操作数被分为两个以上字节存放。JVM采用了"big&nbsp;endian"的编码方式来处理这种情况，即高位bits存放在低字节中。这同&nbsp;Motorola及其他的RISC&nbsp;CPU采用的编码方式是一致的，而与Intel采用的"little&nbsp;endian&nbsp;"的编码方式即低位bits存放在低位字节的方法不同。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java指令系统是以Java语言的实现为目的设计的，其中包含了用于调用方法和监视多先程系统的指令。Java的8位操作码的长度使得JVM最多有256种指令，目前已使用了160多种操作码。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.2JVM指令系统&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所有的CPU均包含用于保存系统状态和处理器所需信息的寄存器组。如果虚拟机定义较多的寄存器，便可以从中得到更多的信息而不必对栈或内存进行访问，这有利于提高运行速度。然而，如果虚拟机中的寄存器比实际CPU的寄存器多，在实现虚拟机时就会占用处理器大量的时间来用常规存储器模拟寄存器，这反而会降低虚拟机的效率。针对这种情况，JVM只设置了4个最为常用的寄存器。它们是：&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc程序计数器&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;optop操作数栈顶指针&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame当前执行环境指针&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vars指向当前执行环境中第一个局部变量的指针&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所有寄存器均为32位。pc用于记录程序的执行。optop,frame和vars用于记录指向Java栈区的指针。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.3JVM栈结构&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;作为基于栈结构的计算机，Java栈是JVM存储信息的主要方法。当JVM得到一个Java字节码应用程序后，便为该代码中一个类的每一个方法创建一个栈框架，以保存该方法的状态信息。每个栈框架包括以下三类信息：&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;局部变量&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;执行环境&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;操作数栈</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;局部变量用于存储一个类的方法中所用到的局部变量。vars寄存器指向该变量表中的第一个局部变量。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;执行环境用于保存解释器对Java字节码进行解释过程中所需的信息。它们是：上次调用的方法、局部变量指针和操作数栈的栈顶和栈底指针。执行环境是一个执行一个方法的控制中心。例如：如果解释器要执行iadd(整数加法)，首先要从frame寄存器中找到当前执行环境，而后便从执行环境中找到操作数栈，从栈顶弹出两个整数进行加法运算，最后将结果压入栈顶。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;操作数栈用于存储运算所需操作数及运算的结果。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.4JVM碎片回收堆&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java类的实例所需的存储空间是在堆上分配的。解释器具体承担为类实例分配空间的工作。解释器在为一个实例分配完存储空间后，便开始记录对该实例所占用的内存区域的使用。一旦对象使用完毕，便将其回收到堆中。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在Java语言中，除了new语句外没有其他方法为一对象申请和释放内存。对内存进行释放和回收的工作是由Java运行系统承担的。这允许Java运行系统的设计者自己决定碎片回收的方法。在SUN公司开发的Java解释器和Hot&nbsp;Java环境中，碎片回收用后台线程的方式来执行。这不但为运行系统提供了良好的性能，而且使程序设计人员摆脱了自己控制内存使用的风险。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.5JVM存储区&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JVM有两类存储区：常量缓冲池和方法区。常量缓冲池用于存储类名称、方法和字段名称以及串常量。方法区则用于存储Java方法的字节码。对于这两种存储区域具体实现方式在JVM规格中没有明确规定。这使得Java应用程序的存储布局必须在运行过程中确定，依赖于具体平台的实现方式。<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JVM是为Java字节码定义的一种独立于具体平台的规格描述，是Java平台独立性的基础。目前的JVM还存在一些限制和不足，有待于进一步的完善，但无论如何，JVM的思想是成功的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对比分析：如果把Java原程序想象成我们的C++原程序，Java原程序编译后生成的字节码就相当于C++原程序编译后的80x86的机器码（二进制程序文件），JVM虚拟机相当于80x86计算机系统,Java解释器相当于80x86CPU。在80x86CPU上运行的是机器码，在Java解释器上运行的是Java字节码。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java解释器相当于运行Java字节码的&#8220;CPU&#8221;,但该&#8220;CPU&#8221;不是通过硬件实现的，而是用软件实现的。Java解释器实际上就是特定的平台下的一个应用程序。只要实现了特定平台下的解释器程序，Java字节码就能通过解释器程序在该平台下运行，这是Java跨平台的根本。当前，并不是在所有的平台下都有相应Java解释器程序，这也是Java并不能在所有的平台下都能运行的原因，它只能在已实现了Java解释器程序的平台下运行。</p>
<p><br><strong>三、Java虚拟机JVM的体系结构</strong>&nbsp;</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;刚才已经提到，JVM可以由不同的厂商来实现。由于厂商的不同必然导致JVM在实现上的一些不同，然而JVM还是可以实现跨平台的特性，这就要归功于设计JVM时的体系结构了。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们知道，一个JVM实例的行为不光是它自己的事，还涉及到它的子系统、存储区域、数据类型和指令这些部分，它们描述了JVM的一个抽象的内部体系结构，其目的不光规定实现JVM时它内部的体系结构，更重要的是提供了一种方式，用于严格定义实现时的外部行为。每个JVM都有两种机制，一个是装载具有合适名称的类(类或是接口)，叫做类装载子系统；另外的一个负责执行包含在已装载的类或接口中的指令，叫做运行引擎。每个JVM又包括方法区、堆、Java栈、程序计数器和本地方法栈这五个部分，这几个部分和类装载机制与运行引擎机制一起组成的体系结构图为：&nbsp;</p>
<p align=center><img src="http://www.itisedu.com/manage/Upload/image/200642610323548.jpg" border=0><br>图3JVM的体系结构&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JVM的每个实例都有一个它自己的方法域和一个堆，运行于JVM内的所有的线程都共享这些区域；当虚拟机装载类文件的时候，它解析其中的二进制数据所包含的类信息，并把它们放到方法域中；当程序运行的时候，JVM把程序初始化的所有对象置于堆上；而每个线程创建的时候，都会拥有自己的程序计数器和Java栈，其中程序计数器中的值指向下一条即将被执行的指令，线程的Java栈则存储为该线程调用Java方法的状态；本地方法调用的状态被存储在本地方法栈，该方法栈依赖于具体的实现。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面分别对这几个部分进行说明。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;执行引擎处于JVM的核心位置，在Java虚拟机规范中，它的行为是由指令集所决定的。尽管对于每条指令，规范很详细地说明了当JVM执行字节码遇到指令时，它的实现应该做什么，但对于怎么做却言之甚少。Java虚拟机支持大约248个字节码。每个字节码执行一种基本的CPU运算,例如,把一个整数加到寄存器,子程序转移等。Java指令集相当于Java程序的汇编语言。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java指令集中的指令包含一个单字节的操作符,用于指定要执行的操作,还有0个或多个操作数,提供操作所需的参数或数据。许多指令没有操作数,仅由一个单字节的操作符构成。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;虚拟机的内层循环的执行过程如下:&nbsp;</p>
<p>&nbsp;</p>
<p>do{&nbsp;</p>
<p>取一个操作符字节;&nbsp;</p>
<p>根据操作符的值执行一个动作;&nbsp;</p>
<p>}while(程序未结束)&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于指令系统的简单性,使得虚拟机执行的过程十分简单,从而有利于提高执行的效率。指令中操作数的数量和大小是由操作符决定的。如果操作数比一个字节大,那么它存储的顺序是高位字节优先。例如,一个16位的参数存放时占用两个字节,其值为:&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第一个字节*256+第二个字节字节码。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;指令流一般只是字节对齐的。指令tableswitch和lookup是例外,在这两条指令内部要求强制的4字节边界对齐。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于本地方法接口，实现JVM并不要求一定要有它的支持，甚至可以完全没有。Sun公司实现Java本地接口(JNI)是出于可移植性的考虑，当然我们也可以设计出其它的本地接口来代替Sun公司的JNI。但是这些设计与实现是比较复杂的事情，需要确保垃圾回收器不会将那些正在被本地方法调用的对象释放掉。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java的堆是一个运行时数据区,类的实例(对象)从中分配空间，它的管理是由垃圾回收来负责的:不给程序员显式释放对象的能力。Java不规定具体使用的垃圾回收算法,可以根据系统的需求使用各种各样的算法。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java方法区与传统语言中的编译后代码或是Unix进程中的正文段类似。它保存方法代码(编译后的java代码)和符号表。在当前的Java实现中,方法代码不包括在垃圾回收堆中,但计划在将来的版本中实现。每个类文件包含了一个Java类或一个Java界面的编译后的代码。可以说类文件是Java语言的执行代码文件。为了保证类文件的平台无关性,Java虚拟机规范中对类文件的格式也作了详细的说明。其具体细节请参考Sun公司的Java虚拟机规范。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java虚拟机的寄存器用于保存机器的运行状态,与微处理器中的某些专用寄存器类似。Java虚拟机的寄存器有四种:&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc:&nbsp;Java程序计数器；&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;optop:&nbsp;指向操作数栈顶端的指针；&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame:&nbsp;指向当前执行方法的执行环境的指针；。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vars:&nbsp;指向当前执行方法的局部变量区第一个变量的指针。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在上述体系结构图中，我们所说的是第一种，即程序计数器，每个线程一旦被创建就拥有了自己的程序计数器。当线程执行Java方法的时候，它包含该线程正在被执行的指令的地址。但是若线程执行的是一个本地的方法，那么程序计数器的值就不会被定义。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java虚拟机的栈有三个区域:局部变量区、运行环境区、操作数区。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;局部变量区&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;每个Java方法使用一个固定大小的局部变量集。它们按照与vars寄存器的字偏移量来寻址。局部变量都是32位的。长整数和双精度浮点数占据了两个局部变量的空间,却按照第一个局部变量的索引来寻址。(例如,一个具有索引n的局部变量,如果是一个双精度浮点数,那么它实际占据了索引n和n+1所代表的存储空间)虚拟机规范并不要求在局部变量中的64位的值是64位对齐的。虚拟机提供了把局部变量中的值装载到操作数栈的指令,也提供了把操作数栈中的值写入局部变量的指令。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;运行环境区&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在运行环境中包含的信息用于动态链接,正常的方法返回以及异常捕捉。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;动态链接&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;运行环境包括对指向当前类和当前方法的解释器符号表的指针,用于支持方法代码的动态链接。方法的class文件代码在引用要调用的方法和要访问的变量时使用符号。动态链接把符号形式的方法调用翻译成实际方法调用,装载必要的类以解释还没有定义的符号,并把变量访问翻译成与这些变量运行时的存储结构相应的偏移地址。动态链接方法和变量使得方法中使用的其它类的变化不会影响到本程序的代码。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;正常的方法返回&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果当前方法正常地结束了,在执行了一条具有正确类型的返回指令时,调用的方法会得到一个返回值。执行环境在正常返回的情况下用于恢复调用者的寄存器,并把调用者的程序计数器增加一个恰当的数值,以跳过已执行过的方法调用指令,然后在调用者的执行环境中继续执行下去。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;异常捕捉&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;异常情况在Java中被称作Error(错误)或Exception(异常),是Throwable类的子类,在程序中的原因是:①动态链接错,如无法找到所需的class文件。②运行时错,如对一个空指针的引用。程序使用了throw语句。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当异常发生时,Java虚拟机采取如下措施:&nbsp;</p>
<p>&#167;&nbsp;检查与当前方法相联系的catch子句表。每个catch子句包含其有效指令范围,能够处理的异常类型,以及处理异常的代码块地址。&nbsp;</p>
<p>&#167;&nbsp;与异常相匹配的catch子句应该符合下面的条件:造成异常的指令在其指令范围之内,发生的异常类型是其能处理的异常类型的子类型。如果找到了匹配的catch子句,那么系统转移到指定的异常处理块处执行;如果没有找到异常处理块,重复寻找匹配的catch子句的过程,直到当前方法的所有嵌套的catch子句都被检查过。&nbsp;</p>
<p>&#167;&nbsp;由于虚拟机从第一个匹配的catch子句处继续执行,所以catch子句表中的顺序是很重要的。因为Java代码是结构化的,因此总可以把某个方法的所有的异常处理器都按序排列到一个表中,对任意可能的程序计数器的值,都可以用线性的顺序找到合适的异常处理块,以处理在该程序计数器值下发生的异常情况。&nbsp;</p>
<p>&#167;&nbsp;如果找不到匹配的catch子句,那么当前方法得到一个"未截获异常"的结果并返回到当前方法的调用者,好像异常刚刚在其调用者中发生一样。如果在调用者中仍然没有找到相应的异常处理块,那么这种错误将被传播下去。如果错误被传播到最顶层,那么系统将调用一个缺省的异常处理块。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;操作数栈区&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;机器指令只从操作数栈中取操作数,对它们进行操作,并把结果返回到栈中。选择栈结构的原因是:在只有少量寄存器或非通用寄存器的机器(如Intel486)上,也能够高效地模拟虚拟机的行为。操作数栈是32位的。它用于给方法传递参数,并从方法接收结果,也用于支持操作的参数,并保存操作的结果。例如,iadd指令将两个整数相加。相加的两个整数应该是操作数栈顶的两个字。这两个字是由先前的指令压进堆栈的。这两个整数将从堆栈弹出、相加,并把结果压回到操作数栈中。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;每个原始数据类型都有专门的指令对它们进行必须的操作。每个操作数在栈中需要一个存储位置,除了long和double型,它们需要两个位置。操作数只能被适用于其类型的操作符所操作。例如,压入两个int类型的数,如果把它们当作是一个long类型的数则是非法的。在Sun的虚拟机实现中,这个限制由字节码验证器强制实行。但是,有少数操作(操作符dupe和swap),用于对运行时数据区进行操作时是不考虑类型的。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本地方法栈，当一个线程调用本地方法时，它就不再受到虚拟机关于结构和安全限制方面的约束，它既可以访问虚拟机的运行期数据区，也可以使用本地处理器以及任何类型的栈。例如，本地栈是一个C语言的栈，那么当C程序调用C函数时，函数的参数以某种顺序被压入栈，结果则返回给调用函数。在实现Java虚拟机时，本地方法接口使用的是C语言的模型栈，那么它的本地方法栈的调度与使用则完全与C语言的栈相同。&nbsp;</p>
<p><strong>四、Java虚拟机JVM的运行过程</strong>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上面对虚拟机的各个部分进行了比较详细的说明，下面通过一个具体的例子来分析它的运行过程。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;虚拟机通过调用某个指定类的方法main启动，传递给main一个字符串数组参数，使指定的类被装载，同时链接该类所使用的其它的类型，并且初始化它们。例如对于程序：&nbsp;</p>
<p>class&nbsp;HelloApp&nbsp;</p>
<p>{&nbsp;</p>
<p>public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;</p>
<p>{&nbsp;</p>
<p>System.out.println("Hello&nbsp;World!");&nbsp;</p>
<p>for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;args.length;&nbsp;i++&nbsp;)&nbsp;</p>
<p>{&nbsp;</p>
<p>System.out.println(args);&nbsp;</p>
<p>}&nbsp;</p>
<p>}&nbsp;</p>
<p>}&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译后在命令行模式下键入：&nbsp;java&nbsp;HelloApp&nbsp;run&nbsp;virtual&nbsp;machine&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将通过调用HelloApp的方法main来启动java虚拟机，传递给main一个包含三个字符串"run"、"virtual"、"machine"的数组。现在我们略述虚拟机在执行HelloApp时可能采取的步骤。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;开始试图执行类HelloApp的main方法，发现该类并没有被装载，也就是说虚拟机当前不包含该类的二进制代表，于是虚拟机使用ClassLoader试图寻找这样的二进制代表。如果这个进程失败，则抛出一个异常。类被装载后同时在main方法被调用之前，必须对类HelloApp与其它类型进行链接然后初始化。链接包含三个阶段：检验，准备和解析。检验检查被装载的主类的符号和语义，准备则创建类或接口的静态域以及把这些域初始化为标准的默认值，解析负责检查主类对其它类或接口的符号引用，在这一步它是可选的。类的初始化是对类中声明的静态初始化函数和静态域的初始化构造方法的执行。一个类在初始化之前它的父类必须被初始化。整个过程如下：&nbsp;</p>
<p align=center><br><img src="http://www.itisedu.com/manage/Upload/image/200642610233917.jpg" border=0><br>图4：JAVA虚拟机的运行过程&nbsp;</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/119762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-05-24 16:46 <a href="http://www.blogjava.net/liaojiyong/archive/2007/05/24/119762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK6的新特性(转)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119684.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 24 May 2007 03:47:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119684.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/119684.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119684.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/119684.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/119684.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: SystemTray类在JDK6中 ,AWT新增加了两个类:Desktop和SystemTray,前者可以用来打开系统默认浏览器浏览指定的URL,打开系统默认邮件客户端给指定的邮箱发邮件,用默认应用程序打开或编辑文件(比如,用记事本打开以txt为后缀名的文件),用系统默认的打印机打印文档;后者可以用来在系统托盘区创建一个托盘程序.下面代码演示了Desktop和SystemTray的用法./****...&nbsp;&nbsp;<a href='http://www.blogjava.net/liaojiyong/archive/2007/05/24/119684.html'>阅读全文</a><img src ="http://www.blogjava.net/liaojiyong/aggbug/119684.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-05-24 11:47 <a href="http://www.blogjava.net/liaojiyong/archive/2007/05/24/119684.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>求两时间点之间日期差的简洁方法（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/05/16/117843.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 16 May 2007 06:54:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/05/16/117843.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/117843.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/05/16/117843.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/117843.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/117843.html</trackback:ping><description><![CDATA[<p><font size=3>原来以为，求两个时间之日期差应该不是问题，直到有一天...。 我曾经辅导过的一位开发员向我求教，我还不以为很难，尝试用</font><font size=3>Calendar/GregorianCalendar类来计算，看起来代码太复杂，放弃。苦想半小时，最后想出一句话，写出来在MSN上发给他。当时的感觉路子很野</font><font size=3>，上不了台面。这句话也是下面要介绍的简洁方法。<br>再后来，我的一位前同事发来邮件，说起网上一大牛发布的blog，是一个牛人数落Java标准库的，挺有意思。需求很简单：有两个Date型的变量</font><font size=3>(a, b)，如何计算两者相隔的天数？你有简单的解决方案吗？（据这个牛人说，还是很麻烦的哦）<br>看了大牛的方法，暗地思忖：既然Java标准库不能解决，我的方法不是很简单吗？！我的底气腾腾往上涨。</font></p>
<p><font size=3>====<br>我的方法：<br></font></p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;differ(Date&nbsp;date1,&nbsp;Date&nbsp;date2)&nbsp;<br><img id=_44_218_Open_Image onclick="this.style.display='none'; document.getElementById('_44_218_Open_Text').style.display='none'; document.getElementById('_44_218_Closed_Image').style.display='inline'; document.getElementById('_44_218_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_44_218_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_44_218_Closed_Text').style.display='none'; document.getElementById('_44_218_Open_Image').style.display='inline'; document.getElementById('_44_218_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=_44_218_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_44_218_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">return&nbsp;date1.getTime()&nbsp;/&nbsp;(24*60*60*1000)&nbsp;-&nbsp;date2.getTime()&nbsp;/&nbsp;(24*60*60*1000);&nbsp;</span><span style="COLOR: #008000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;date2.getTime()&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">86400000</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;date1.getTime()&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">86400000</span><span style="COLOR: #000000">;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">用立即数，减少乘法计算的开销</span><span style="COLOR: #008000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">&nbsp;</span></div>
</div>
<p>&nbsp;</p>
<p><font size=3>问题分析：求日期差，重要的是时间对象的日期部分，与时分秒没有关系。所以问题的关键是过滤掉时分秒，保留日期部分。干的活象低通滤波器</font><font size=3>，滤掉高频杂波，保留低频信号。<br>解决思路：一天的秒数是24*60*60*1000=86400000=Senconds。时间对象date1.getTime()是自1970年1月1日零点以来的秒数，用它整除以Seconds</font><font size=3>，就得到自1970年1月1日以来的天数。注意这里用的是整除符号，时分秒被过滤掉了。对date2也施行同样的操作，得到date2的天数。date2的天</font><font size=3>数减去date1的天数，所得结果就是日期差。<br>举例来说，用最简单的例子，假设date1等于1970年1月5日15点整，date2等于1970年1月6日14点整。date1整除以seconds的结果是4，date2整除以</font><font size=3>seconds的结果是5，date2与date1相差5-4=1天，与我们的预期相符。</font></p>
<p><font size=3>====<br>我的同事Kun给出了方法：获取二者的milliseconds相减，然后/24/60/60。<br>这个方法应该是不正确的。因为秒数相减，得到的是二者的时间差，并没有滤掉时分秒。<br>计算结果：用刚才的例子验算一下，date2.getTime() - date1.getTime() 等于相当于23小时的秒数，再整除以seconds，结果是0天，与预期的1</font><font size=3>天不相符。<br>Kun的方法与正确方法的区别在于：先做减法，还是先做整除法。</font></p>
<p><br><font size=3>====<br>同事在网上找到的方法：<br></font></p>
<font size=3>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">SimpleDateFormat&nbsp;myFormatter&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;SimpleDateFormat(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">yyyy-MM-dd</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>java.util.Date&nbsp;date</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;myFormatter.parse(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">2003-05-1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>java.util.Date&nbsp;mydate</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;myFormatter.parse(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">1899-12-30</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;&nbsp;day</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(date.getTime()</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">mydate.getTime())</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">24</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">60</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">60</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>out.println(day);</span></div>
</div>
<p><br>结果应该是正确的，它根本就没有时分秒，有了时分秒与Kun的方法等价。不过用起来会很麻烦，因为要先得到字符串的日期，才能用它。</p>
<p><font size=3>====<br>最后看看大牛的方法：<br>大牛博客地址：</font><a href="http://blog.csdn.net/rmartin/archive/2006/12/22/1452867.aspx"><font color=#3468a4 size=3><u>http://blog.csdn.net/rmartin/archive/2006/12/22/1452867.aspx</u></font></a></p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><u><font color=#3468a4><img id=_53_456_Open_Image onclick="this.style.display='none'; document.getElementById('_53_456_Open_Text').style.display='none'; document.getElementById('_53_456_Closed_Image').style.display='inline'; document.getElementById('_53_456_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_53_456_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_53_456_Closed_Text').style.display='none'; document.getElementById('_53_456_Open_Image').style.display='inline'; document.getElementById('_53_456_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top></font></u><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;daysBetween(Date&nbsp;now,&nbsp;Date&nbsp;returnDate)&nbsp;</span><span id=_53_456_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_53_456_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Calendar&nbsp;cNow&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Calendar.getInstance();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Calendar&nbsp;cReturnDate&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Calendar.getInstance();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cNow.setTime(now);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cReturnDate.setTime(returnDate);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;setTimeToMidnight(cNow);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;setTimeToMidnight(cReturnDate);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;todayMs&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;cNow.getTimeInMillis();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;returnMs&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;cReturnDate.getTimeInMillis();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;intervalMs&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;todayMs&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;returnMs;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;millisecondsToDays(intervalMs);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img id=_509_561_Open_Image onclick="this.style.display='none'; document.getElementById('_509_561_Open_Text').style.display='none'; document.getElementById('_509_561_Closed_Image').style.display='inline'; document.getElementById('_509_561_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_509_561_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_509_561_Closed_Text').style.display='none'; document.getElementById('_509_561_Open_Image').style.display='inline'; document.getElementById('_509_561_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;millisecondsToDays(</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;intervalMs)&nbsp;</span><span id=_509_561_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_509_561_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)&nbsp;(intervalMs&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">86400</span><span style="COLOR: #000000">));<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img id=_616_739_Open_Image onclick="this.style.display='none'; document.getElementById('_616_739_Open_Text').style.display='none'; document.getElementById('_616_739_Closed_Image').style.display='inline'; document.getElementById('_616_739_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_616_739_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_616_739_Closed_Text').style.display='none'; document.getElementById('_616_739_Open_Image').style.display='inline'; document.getElementById('_616_739_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;setTimeToMidnight(Calendar&nbsp;calendar)&nbsp;</span><span id=_616_739_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_616_739_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;calendar.set(Calendar.HOUR_OF_DAY,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;calendar.set(Calendar.MINUTE,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;calendar.set(Calendar.SECOND,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span></div>
</div>
<p>&nbsp;</p>
<p><font size=3>看起来很复杂吧，没有求证过，应该是正确的吧！</font></p>
</font>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/117843.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-05-16 14:54 <a href="http://www.blogjava.net/liaojiyong/archive/2007/05/16/117843.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>代码发现的问题及解决方案（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/05/16/117840.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 16 May 2007 06:48:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/05/16/117840.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/117840.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/05/16/117840.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/117840.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/117840.html</trackback:ping><description><![CDATA[<font size=2>===<br>* 错误代码:* 正确代码：</font>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img id=_31_37_Open_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_31_37_Open_Text').style.display='none'; document.getElementById('_31_37_Closed_Image').style.display='inline'; document.getElementById('_31_37_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_31_37_Closed_Image style="DISPLAY: inline" onclick="this.style.display='none'; document.getElementById('_31_37_Closed_Text').style.display='none'; document.getElementById('_31_37_Open_Image').style.display='inline'; document.getElementById('_31_37_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(((String)rs[</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">]).equals(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">))</span><span id=_31_37_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: inline; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_31_37_Open_Text style="DISPLAY: none"><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #008000">//<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #000000">}</span></span></div>
</div>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img id=_29_35_Open_Image onclick="this.style.display='none'; document.getElementById('_29_35_Open_Text').style.display='none'; document.getElementById('_29_35_Closed_Image').style.display='inline'; document.getElementById('_29_35_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_29_35_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_29_35_Closed_Text').style.display='none'; document.getElementById('_29_35_Open_Image').style.display='inline'; document.getElementById('_29_35_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">.equals((String)rs[</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">]))</span><span id=_29_35_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_29_35_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #008000">//<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #000000">}</span></span></div>
</div>
<p><br>* 原因：rs[4]可能为null值，导致空对象引用，抛出异常。</p>
<p><br><font size=2>===<br>代码优化</font></p>
<p><font size=2>* 原代码：</font><font size=2>* 替换为：<br>cpvo.setProdType(StaticParameters.getProductType(rs[4]));</font></p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img id=_31_60_Open_Image onclick="this.style.display='none'; document.getElementById('_31_60_Open_Text').style.display='none'; document.getElementById('_31_60_Closed_Image').style.display='inline'; document.getElementById('_31_60_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_31_60_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_31_60_Closed_Text').style.display='none'; document.getElementById('_31_60_Open_Image').style.display='inline'; document.getElementById('_31_60_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(((String)rs[</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">]).equals(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">))</span><span id=_31_60_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_31_60_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;cpvo.setProdType(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">通用产品</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img id=_98_127_Open_Image onclick="this.style.display='none'; document.getElementById('_98_127_Open_Text').style.display='none'; document.getElementById('_98_127_Closed_Image').style.display='inline'; document.getElementById('_98_127_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_98_127_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_98_127_Closed_Text').style.display='none'; document.getElementById('_98_127_Open_Image').style.display='inline'; document.getElementById('_98_127_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(((String)rs[</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">]).equals(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">S</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">))</span><span id=_98_127_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_98_127_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;cpvo.setProdType(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">解决方案</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;cpvo.setProdType((String)rs[</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">]);</span></div>
</div>
<p>&nbsp;</p>
<p><font size=2>定义类StaticParameters，参见文件StaticParameters.java。<br>其他静态参数有类似问题，例如：绑定标志。</font></p>
<p><font size=2>* 代码：</font></p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.util.HashMap;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.util.Map;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;StaticParameters<br><img id=_79_510_Open_Image onclick="this.style.display='none'; document.getElementById('_79_510_Open_Text').style.display='none'; document.getElementById('_79_510_Closed_Image').style.display='inline'; document.getElementById('_79_510_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_79_510_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_79_510_Closed_Text').style.display='none'; document.getElementById('_79_510_Open_Image').style.display='inline'; document.getElementById('_79_510_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=_79_510_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_79_510_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;Map&nbsp;productTypes&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br><img id=_132_175_Open_Image onclick="this.style.display='none'; document.getElementById('_132_175_Open_Text').style.display='none'; document.getElementById('_132_175_Closed_Image').style.display='inline'; document.getElementById('_132_175_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_132_175_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_132_175_Closed_Text').style.display='none'; document.getElementById('_132_175_Open_Image').style.display='inline'; document.getElementById('_132_175_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span id=_132_175_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_132_175_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">初始化静态参数集合</span><span style="COLOR: #008000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;initProductTypes();&nbsp;&nbsp;&nbsp;&nbsp;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;initProductTypes()<br><img id=_220_361_Open_Image onclick="this.style.display='none'; document.getElementById('_220_361_Open_Text').style.display='none'; document.getElementById('_220_361_Closed_Image').style.display='inline'; document.getElementById('_220_361_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_220_361_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_220_361_Closed_Text').style.display='none'; document.getElementById('_220_361_Open_Image').style.display='inline'; document.getElementById('_220_361_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</span><span id=_220_361_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_220_361_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(productTypes&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br><img id=_252_357_Open_Image onclick="this.style.display='none'; document.getElementById('_252_357_Open_Text').style.display='none'; document.getElementById('_252_357_Closed_Image').style.display='inline'; document.getElementById('_252_357_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_252_357_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_252_357_Closed_Text').style.display='none'; document.getElementById('_252_357_Open_Image').style.display='inline'; document.getElementById('_252_357_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</span><span id=_252_357_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_252_357_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;productTypes&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;HashMap();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;productTypes.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">通用产品</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;productTypes.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">S</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">解决方案</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;String&nbsp;getProductType(String&nbsp;code)<br><img id=_415_508_Open_Image onclick="this.style.display='none'; document.getElementById('_415_508_Open_Text').style.display='none'; document.getElementById('_415_508_Closed_Image').style.display='inline'; document.getElementById('_415_508_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_415_508_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_415_508_Closed_Text').style.display='none'; document.getElementById('_415_508_Open_Image').style.display='inline'; document.getElementById('_415_508_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</span><span id=_415_508_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_415_508_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;String&nbsp;value&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(String)&nbsp;productTypes.get(code);&nbsp;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;value&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">&nbsp;code&nbsp;:&nbsp;value;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span></div>
</div>
<br><br>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/117840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-05-16 14:48 <a href="http://www.blogjava.net/liaojiyong/archive/2007/05/16/117840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>serialVersionUID</title><link>http://www.blogjava.net/liaojiyong/archive/2007/05/16/117831.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 16 May 2007 06:21:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/05/16/117831.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/117831.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/05/16/117831.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/117831.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/117831.html</trackback:ping><description><![CDATA[serialVersionUID&nbsp;用来表明类的不同版本间的兼容性。如果你修改了此类,&nbsp;要修改此值。否则以前用老版本的类序列化的类恢复时会出错。<br>　　<br>　　在JDK中，可以利用JDK的bin目录下的serialver.exe工具产生这个serialVersionUID，对于Test.class，执行命令：serialver&nbsp;Test。
<p>　　为了在反序列化时，确保类版本的兼容性，最好在每个要序列化的类中加入private&nbsp;static&nbsp;final&nbsp;long&nbsp;serialVersionUID这个属性，具体数值自己定义。这样，即使某个类在与之对应的对象已经序列化出去后做了修改，该对象依然可以被正确反序列化。否则，如果不显式定义该属性，这个属性值将由JVM根据类的相关信息计算，而修改后的类的计算结果与修改前的类的计算结果往往不同，从而造成对象的反序列化因为类版本不兼容而失败。</p>
<p>　　不显式定义这个属性值的另一个坏处是，不利于程序在不同的JVM之间的移植。因为不同的编译器实现该属性值的计算策略可能不同，从而造成虽然类没有改变，但是因为JVM不同，出现因类版本不兼容而无法正确反序列化的现象出现。</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/117831.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-05-16 14:21 <a href="http://www.blogjava.net/liaojiyong/archive/2007/05/16/117831.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最弱智的搜索字符串算法</title><link>http://www.blogjava.net/liaojiyong/archive/2007/04/27/114091.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 27 Apr 2007 07:12:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/04/27/114091.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/114091.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/04/27/114091.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/114091.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/114091.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000">&nbsp;liaojiyong.net.blogjava.impl;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_39_77_Open_Image onclick="this.style.display='none'; Codehighlighter1_39_77_Open_Text.style.display='none'; Codehighlighter1_39_77_Closed_Image.style.display='inline'; Codehighlighter1_39_77_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_39_77_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_39_77_Closed_Text.style.display='none'; Codehighlighter1_39_77_Open_Image.style.display='inline'; Codehighlighter1_39_77_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_39_77_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</span><span id=Codehighlighter1_39_77_Open_Text><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;</span><span style="COLOR: #808080">@author</span><span style="COLOR: #008000">&nbsp;liaojy<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;下午03:03:35<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_102_970_Open_Image onclick="this.style.display='none'; Codehighlighter1_102_970_Open_Text.style.display='none'; Codehighlighter1_102_970_Closed_Image.style.display='inline'; Codehighlighter1_102_970_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_102_970_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_102_970_Closed_Text.style.display='none'; Codehighlighter1_102_970_Open_Image.style.display='inline'; Codehighlighter1_102_970_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;FindSubStringImpl</span><span id=Codehighlighter1_102_970_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_102_970_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_147_680_Open_Image onclick="this.style.display='none'; Codehighlighter1_147_680_Open_Text.style.display='none'; Codehighlighter1_147_680_Closed_Image.style.display='inline'; Codehighlighter1_147_680_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_147_680_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_147_680_Closed_Text.style.display='none'; Codehighlighter1_147_680_Open_Image.style.display='inline'; Codehighlighter1_147_680_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;find(String&nbsp;sub,&nbsp;String&nbsp;main)&nbsp;</span><span id=Codehighlighter1_147_680_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_147_680_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">[]&nbsp;s&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;sub.toCharArray();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">[]&nbsp;m&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;main.toCharArray();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;subLength&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;sub.length();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;mainLength&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;main.length();<br><img id=Codehighlighter1_319_664_Open_Image onclick="this.style.display='none'; Codehighlighter1_319_664_Open_Text.style.display='none'; Codehighlighter1_319_664_Closed_Image.style.display='inline'; Codehighlighter1_319_664_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_319_664_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_319_664_Closed_Text.style.display='none'; Codehighlighter1_319_664_Open_Image.style.display='inline'; Codehighlighter1_319_664_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;mainLength;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;</span><span id=Codehighlighter1_319_664_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_319_664_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(m[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;s[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">])<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;mainLength&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;m[i]&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;s[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">])<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br><img id=Codehighlighter1_418_438_Open_Image onclick="this.style.display='none'; Codehighlighter1_418_438_Open_Text.style.display='none'; Codehighlighter1_418_438_Closed_Image.style.display='inline'; Codehighlighter1_418_438_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_418_438_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_418_438_Closed_Text.style.display='none'; Codehighlighter1_418_438_Open_Image.style.display='inline'; Codehighlighter1_418_438_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(i&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;mainLength)&nbsp;</span><span id=Codehighlighter1_418_438_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_418_438_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;t&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;i;<br><img id=Codehighlighter1_493_660_Open_Image onclick="this.style.display='none'; Codehighlighter1_493_660_Open_Text.style.display='none'; Codehighlighter1_493_660_Closed_Image.style.display='inline'; Codehighlighter1_493_660_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_493_660_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_493_660_Closed_Text.style.display='none'; Codehighlighter1_493_660_Open_Image.style.display='inline'; Codehighlighter1_493_660_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;j&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;subLength;&nbsp;j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;</span><span id=Codehighlighter1_493_660_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_493_660_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(t&nbsp;</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">&nbsp;mainLength)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_589_610_Open_Image onclick="this.style.display='none'; Codehighlighter1_589_610_Open_Text.style.display='none'; Codehighlighter1_589_610_Closed_Image.style.display='inline'; Codehighlighter1_589_610_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_589_610_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_589_610_Closed_Text.style.display='none'; Codehighlighter1_589_610_Open_Image.style.display='inline'; Codehighlighter1_589_610_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;((m[t]&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;s[j])&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;(j&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;subLength&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">))&nbsp;</span><span id=Codehighlighter1_589_610_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_589_610_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;i;<br><img id=Codehighlighter1_637_655_Open_Image onclick="this.style.display='none'; Codehighlighter1_637_655_Open_Text.style.display='none'; Codehighlighter1_637_655_Closed_Image.style.display='inline'; Codehighlighter1_637_655_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_637_655_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_637_655_Closed_Text.style.display='none'; Codehighlighter1_637_655_Open_Image.style.display='inline'; Codehighlighter1_637_655_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;((m[t]&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;s[j]))&nbsp;</span><span id=Codehighlighter1_637_655_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_637_655_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_684_777_Open_Image onclick="this.style.display='none'; Codehighlighter1_684_777_Open_Text.style.display='none'; Codehighlighter1_684_777_Closed_Image.style.display='inline'; Codehighlighter1_684_777_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_684_777_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_684_777_Closed_Text.style.display='none'; Codehighlighter1_684_777_Open_Image.style.display='inline'; Codehighlighter1_684_777_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_684_777_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</span><span id=Codehighlighter1_684_777_Open_Text><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="COLOR: #808080">@param</span><span style="COLOR: #008000">&nbsp;args<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="COLOR: #808080">@throws</span><span style="COLOR: #008000">&nbsp;InstantiationException<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="COLOR: #808080">@throws</span><span style="COLOR: #008000">&nbsp;IllegalAccessException<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_873_968_Open_Image onclick="this.style.display='none'; Codehighlighter1_873_968_Open_Text.style.display='none'; Codehighlighter1_873_968_Closed_Image.style.display='inline'; Codehighlighter1_873_968_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_873_968_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_873_968_Closed_Text.style.display='none'; Codehighlighter1_873_968_Open_Image.style.display='inline'; Codehighlighter1_873_968_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000">&nbsp;InstantiationException,&nbsp;IllegalAccessException&nbsp;</span><span id=Codehighlighter1_873_968_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_873_968_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(FindSubStringImpl.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">.newInstance().find(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">liao</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">maliaoinjiyong</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/114091.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-04-27 15:12 <a href="http://www.blogjava.net/liaojiyong/archive/2007/04/27/114091.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java1.5泛型指南中文版(Java1.5 Generic Tutorial) （转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/04/25/113577.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 25 Apr 2007 09:20:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/04/25/113577.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/113577.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/04/25/113577.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/113577.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/113577.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Java1.5泛型指南中文版(Java1.5 Generic Tutorial)英文版pdf下载链接：http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&...&nbsp;&nbsp;<a href='http://www.blogjava.net/liaojiyong/archive/2007/04/25/113577.html'>阅读全文</a><img src ="http://www.blogjava.net/liaojiyong/aggbug/113577.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-04-25 17:20 <a href="http://www.blogjava.net/liaojiyong/archive/2007/04/25/113577.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java文件操作大全（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105724.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 23 Mar 2007 01:46:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105724.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/105724.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105724.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/105724.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/105724.html</trackback:ping><description><![CDATA[
		<p>文件的建立/检查与删除 <br />&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;文件的建立、检查与删除&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath(""); <br />//out.println(path); <br />File f=new File(path,"File.txt"); <br />//out.println(f); <br />//out.println(f.exists()); </p>
		<p>if(f.exists()){//检查File.txt是否存在 <br />f.delete();//删除File.txt文件 <br />out.println(path + " <a href="file://\\File.txt">\\File.txt</a> 存在，已删除。"); <br />}else{ <br />f.createNewFile();//在当前目录下建立一个名为File.txt的文件 <br />out.println(path + " <a href="file://\\File.txt">\\File.txt</a> 不存在，已建立。");//输出目前所在的目录路径 <br />} <br />%&gt; </p>
		<p>
				<br />　　目录的建立/检查与删除 </p>
		<p>&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;目录的建立/检查与删除&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath(""); <br />path=path + " <a href="file://\\Sub&quot;;//">\\Sub";//</a> 将要建立的目录路径 <br />File d=new File(path);//建立代表Sub目录的File对象，并得到它的一个引用 <br />if(d.exists()){//检查Sub目录是否存在 <br />d.delete(); <br />out.println("Sub目录存在，已删除"); <br />}else{ <br />d.mkdir();//建立Sub目录 <br />out.println("Sub目录不存在，已建立"); <br />} <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; </p>
		<p>
				<br />　　如何在JSP中处理虚拟目录 </p>
		<p>
				<br />&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;JSP中如何处理虚拟目录&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />取得虚拟目录对应的磁盘路径&lt;br&gt; <br />Web站点主目录的位置为&lt;font color=#ff0000&gt;&lt;%=request.getRealPath("/")%&gt;&lt;/font&gt;&lt;br&gt; <br />JSP网页所在的目录位置&lt;font color=#ff0000&gt;&lt;%=request.getRealPath("./")%&gt;&lt;/font&gt;&lt;br&gt; <br />JSP网页所在目录上一层目录的位置&lt;font color=#ff0000&gt;&lt;%=request.getRealPath("../")%&gt;&lt;/font&gt;&lt;br&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; </p>
		<p>
				<br />　文件属性的取得 <br />&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.util.Date,java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;文件属性的取得&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("/"); <br />File f=new File(path,"ReadData.txt"); <br />if(f.exists()){ <br />%&gt; <br />&lt;%=f.getName()%&gt;的属性如下：&lt;br&gt;&lt;br&gt; <br />文件长度为：&lt;%=f.length()%&gt; <br />&lt;%=f.isFile()?"是文件":"不是文件"%&gt;&lt;br&gt; <br />&lt;%=f.isDirectory()?"是目录":"不是目录"%&gt;&lt;br&gt; <br />&lt;%=f.canRead()?"可读取":"不可读取"%&gt;&lt;br&gt; <br />&lt;%=f.canWrite()?"可写入":"不可写入"%&gt;&lt;br&gt; <br />&lt;%=f.isHidden()?"是隐藏文件":"不是隐藏文件"%&gt;&lt;br&gt; <br />文件的最后修改日期为：&lt;%=new Date(f.lastModified())%&gt;&lt;br&gt; <br />&lt;% <br />}else{ <br />f.createNewFile();//在当前目录下建立一个名为ReaData.txt的文件 <br />%&gt; <br />&lt;%=f.getName()%&gt;的属性如下：&lt;br&gt;&lt;br&gt; <br />文件长度为：&lt;%=f.length()%&gt; <br />&lt;%=f.isFile()?"是文件":"不是文件"%&gt;&lt;br&gt; <br />&lt;%=f.isDirectory()?"是目录":"不是目录"%&gt;&lt;br&gt; <br />&lt;%=f.canRead()?"可读取":"不可读取"%&gt;&lt;br&gt; <br />&lt;%=f.canWrite()?"可写入":"不可写入"%&gt;&lt;br&gt; <br />&lt;%=f.isHidden()?"是隐藏文件":"不是隐藏文件"%&gt;&lt;br&gt; <br />文件的最后修改日期为：&lt;%=new Date(f.lastModified())%&gt;&lt;br&gt; <br />&lt;% <br />} <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt;<br /> <br />　　取出目录中文件的方法 </p>
		<p>&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;取出目录中文件的方法--列出目录中的文件&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("/"); <br />File d=new File(path);//建立当前目录中文件的File对象 <br />File list[]=d.listFiles();//取得代表目录中所有文件的File对象数组 <br />out.println("&lt;font color=#ff0000&gt;" + path + "目录下的文件：&lt;/font&gt;&lt;br&gt;"); <br />for(int i=0;i&lt;list.length;i++){ <br />if(list&lt;I&gt;.isFile()){ <br />out.println(list&lt;I&gt;.getName() + "&lt;br&gt;"); <br />} <br />} <br />out.println("&lt;br&gt;&lt;font color=#ff0000&gt;" + path + "目录下的目录：&lt;/font&gt;&lt;br&gt;"); <br />for(int i=0;i&lt;list.length;i++){ <br />if(list&lt;I&gt;.isDirectory()){ <br />out.println(list&lt;I&gt;.getName() + "&lt;br&gt;"); <br />} <br />} <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; </p>
		<p>
				<br />判断是否为空白文件 <br />&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;判断是否为空白文件&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("/"); <br />out.println(path); <br />FileReader fr=new FileReader(path + " <a href="file://\\AtEnd.txt&quot;);//">\\AtEnd.txt");//</a> 建立FileReader对象，并实例化为fr <br />//对FileReader类生成的对象使用read()方法，可以从字符流中读取下一个字符。 <br />if(fr.read()==-1)//判断是否已读到文件的结尾 <br />{ <br />out.print("AtEnd.txt文件中没有数据&lt;br&gt;"); <br />}else{ <br />out.println("AtEnd.txt文件中有数据"); <br />} <br />fr.close(); <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; <br />    &lt;B&gt;读取所有的文件数据&lt;/B&gt; <br />&lt;ccid_nobr&gt; <br />&lt;table width="400" border="1" cellspacing="0" cellpadding="2" <br />bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"&gt; <br />&lt;tr&gt; <br />&lt;td bgcolor="e6e6e6" class="code" style="font-size:9pt"&gt; <br />&lt;pre&gt;&lt;ccid_code&gt; &lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*,java.lang.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;读取所有的文件数据&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("."); <br />FileReader fr=new FileReader(path + " <a href="file://\\ReadData.txt">\\ReadData.txt</a> "); <br />//关键在于读取过程中，要判断所读取的字符是否已经到了文件的末尾， <br />并且这个字符是不是文件中的断行符，即判断该字符值是否为13。 <br />int c=fr.read();//从文件中读取一个字符 <br />//判断是否已读到文件结尾 <br />while(c!=-1){ <br />out.print((char)c);//输出读到的数据 <br />c=fr.read();//从文件中继续读取数据 <br />if(c==13){//判断是否为断行字符 <br />out.print("&lt;br&gt;");//输出分行标签 <br />fr.skip(1);//略过一个字符 <br />//c=fr.read();//读取一个字符 <br />} <br />} <br />fr.close(); <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; <br />　　一行一行读取数据 <br />&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;文件读取&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("");//取得当前目录的路径 <br />FileReader fr=new FileReader(path + " <a href="file://\\file\\inc\\t.txt&quot;);//">\\file\\inc\\t.txt");//</a> 建立FileReader对象，并实例化为fr <br />BufferedReader br=new BufferedReader(fr);//建立BufferedReader对象，并实例化为br <br />String Line=br.readLine();//从文件读取一行字符串 <br />//判断读取到的字符串是否不为空 <br />while(Line!=null){ <br />out.println(Line + "&lt;br&gt;");//输出从文件中读取的数据 <br />Line=br.readLine();//从文件中继续读取一行数据 <br />} <br />br.close();//关闭BufferedReader对象 <br />fr.close();//关闭文件 <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; </p>
		<p>　略过文件中的字符不读取 <br />&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;略过字节不读取&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("."); <br />FileReader fr=new FileReader(path + " <a href="file://\\ReadData.txt">\\ReadData.txt</a> "); <br />fr.skip(2);//跳过2个字节 <br />int c=fr.read();//读取一个字节 <br />while(c!=-1){ <br />out.print((char)c); <br />c=fr.read(); <br />} <br />fr.close(); <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; <br />　　将数据写入文件 <br />&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;将数据写入文件&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("."); <br />FileWriter fw=new FileWriter(path + " <a href="file://\\WriteData.txt&quot;);//">\\WriteData.txt");//</a> 建立FileWriter对象，并实例化fw <br />//将字符串写入文件 <br />fw.write("大家好！"); <br />fw.write("本书是《JSP编程技巧》"); <br />fw.write("请多多指教！"); <br />fw.write("email:stride@sina.com"); <br />fw.close(); </p>
		<p>FileReader fr=new FileReader(path + " <a href="file://\\WriteData.txt">\\WriteData.txt</a> "); <br />BufferedReader br=new BufferedReader(fr);//建立BufferedReader对象，并实例化为br <br />String Line=br.readLine(); <br />//读取一行数据 <br />out.println(Line + "&lt;br&gt;"); <br />br.close();//关闭BufferedReader对象 <br />fr.close(); <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; <br />　　将写入文件的数据分行 <br />&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;将写入文件的数据分行&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("."); <br />FileWriter fw=new FileWriter(path + " <a href="file://\\WriteData.txt">\\WriteData.txt</a> "); <br />BufferedWriter bw=new BufferedWriter(fw); <br />bw.write("大家好！"); <br />bw.write("本书是《JSP编程技巧》。"); <br />bw.newLine();//断行 <br />bw.write("请多多指教！"); <br />bw.newLine();//断行 <br />bw.write("email: <a href="mailto:stride@sina.com">stride@sina.com</a> "); <br />bw.flush();//将数据更新至文件 <br />fw.close();//关闭文件流 <br />out.println("写入文件内容为：&lt;br&gt;"); <br />FileReader fr=new FileReader(path + " <a href="file://\\WriteData.txt">\\WriteData.txt</a> "); <br />BufferedReader br=new BufferedReader(fr); <br />String Line=br.readLine();//读取一行数据 <br />while(Line!=null){ <br />out.println(Line + "&lt;br&gt;"); <br />Line=br.readLine(); <br />} <br />fr.close(); <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; <br />　　如何将数据追加写入到文件 <br />&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;将写入文件的数据分行&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("."); <br />RandomAccessFile rf=new RandomAccessFile(path + " <a href="file://\\WriteData.txt&quot;,&quot;rw">\\WriteData.txt","rw</a> "); <br />//定义一个类RandomAccessFile的对象，并实例化 <br />rf.seek(rf.length());//将指针移动到文件末尾 <br />rf.writeBytes("\nAppend a line to the file!"); <br />rf.close();//关闭文件流 <br />out.println("写入文件内容为：&lt;br&gt;"); <br />FileReader fr=new FileReader(path + " <a href="file://\\WriteData.txt">\\WriteData.txt</a> "); <br />BufferedReader br=new BufferedReader(fr);//读取文件的BufferedRead对象 <br />String Line=br.readLine(); <br />while(Line!=null){ <br />out.println(Line + "&lt;br&gt;"); <br />Line=br.readLine(); <br />} <br />fr.close();//关闭文件 <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt; <br /></p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/105724.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-03-23 09:46 <a href="http://www.blogjava.net/liaojiyong/archive/2007/03/23/105724.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JFreeChat的介绍 （转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105722.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 23 Mar 2007 01:43:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105722.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/105722.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105722.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/105722.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/105722.html</trackback:ping><description><![CDATA[
		<strong>一、简介</strong>
		<br />JFreeChart(<a href="http://www.jfree.org/"><font color="#000000">http://www.jfree.org/</font></a>) 是一个开源的 JAVA 项目，它主要用来开发各种各样的图表，这些图表包括：饼图、柱状图 ( 普通柱状图以及堆栈柱状图 ) 、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。在这些不同式样的图表上可以满足目前商业系统的要求。 JFreeChart 是一种基于 JAVA 语言的图表开发技术。 JFreeChart 可用于 Servlet 、 JSP 、 Applet 、 Java Appication 环境中，通过 JDBC 可动态显示任何数据库数据，结合 Itext 可以输出至 PDF 文件。<br /><strong>二、JFreeChart获取</strong><br />JFreeChart 是JFreeChart公司在开源网站SourceForge.net上的一个项目，该公司的主要产品有如下： <br />1.JFreeReport ：报表解决工具 <br />2.JFreeChart:Java 图形解决方案（Application/Applet/Servlet/Jsp） <br />3.JCommon ：JFreeReport和JFreeChart的公共类库 <br />4.JFreeDesigner ：JFreeReport的报表设计工具 <br />我们可以从jfree官方网站上获取最新版本和相关资料， <br />获取地址：<a href="http://www.jfree.org/"><font color="#000000">http://www.jfree.org/</font></a><br />当前最新版本：jfreechart-1.0.3.zip。<br />三<strong>、JFreeChart配置安装</strong><br />1 、解压jfreechart-1.0.3.zip.到指定位置，其中source是jfreechart的源码，jfreechart-1.0.3-demo.jar 是例子程序，可以先运行一下看看各种效果。 <br />2 、为了配置成功，我们需要关注的文件有如下三个： <br />设置classpath。加入下面三个jar包。 <br />jfreechart-1.0.3.jar 、jcommon-1.0.8.jar、gnujaxp.jar  <br />至此jfreechart的配置就完成了 。<br /><strong>四、JFreeChart功能介绍 </strong><br />JFreeChart 目前是最好的java图形解决方案，基本能够解决目前的图形方面的需求，主要包括如下几个方面： <br />pie charts (2D and 3D) ：饼图（平面和立体） <br />bar charts (regular and stacked, with an optional 3D effect) ：柱状图 <br />line and area charts ：曲线图 <br />scatter plots and bubble charts <br />time series, high/low/open/close charts and candle stick charts ：时序图 <br />combination charts ：复合图 <br />Pareto charts <br />Gantt charts ：甘特图 <br />wind plots, meter charts and symbol charts <br />wafer map charts <br />( 态图表,饼图(二维和三维) , 柱状图 ( 水平,垂直),线图,点图,时间变化图,甘特图, 股票行情图,混和图, 温度计图, 刻度图等常用商用图表) <br />图形可以导出成PNG和JPEG格式，同时还可以与PDF和EXCEL关联 <br />JFreeChart 核心类库介绍： <br />研究jfreechart源码发现源码的主要由两个大的包组成：org.jfree.chart,org.jfree.data。其中前者主要与图形 <br />本身有关，后者与图形显示的数据有关。具体研究如果大家有兴趣的话可以自己研究 。 <br />核心类主要有： <br />org.jfree.chart.JFreeChart ：图表对象，任何类型的图表的最终表现形式都是在该对象进行一些属性的定制。JFreeChart引擎本身提供了一个工厂类用于创建不同类型的图表对象 <br />org.jfree.data.category.XXXDataSet: 数据集对象，用于提供显示图表所用的数据。根据不同类型的图表对应着很多类型的数据集对象类 <br />org.jfree.chart.plot.XXXPlot ：图表区域对象，基本上这个对象决定着什么样式的图表，创建该对象的时候需要Axis、Renderer以及数据集对象的支持 <br />org.jfree.chart.axis.XXXAxis ：用于处理图表的两个轴：纵轴和横轴 <br />org.jfree.chart.render.XXXRender ：负责如何显示一个图表对象 <br />org.jfree.chart.urls.XXXURLGenerator: 用于生成Web图表中每个项目的鼠标点击链接 <br />XXXXXToolTipGenerator: 用于生成图象的帮助提示，不同类型图表对应不同类型的工具提示类 。<br /><br />参考地址：<br /><br /><a href="http://ltc603.javaeye.com/blog/30207"><font color="#000000">http://ltc603.javaeye.com/blog/30207</font></a><br /><a href="http://blog.sina.com.cn/u/405da78d010000ap"><font color="#000000">http://blog.sina.com.cn/u/405da78d010000ap</font></a><br /><a href="/Alpha/archive/2007/01/13/93569.html"><font color="#000000">http://www.blogjava.net/Alpha/archive/2007/01/13/93569.html</font></a> <br /><img src ="http://www.blogjava.net/liaojiyong/aggbug/105722.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-03-23 09:43 <a href="http://www.blogjava.net/liaojiyong/archive/2007/03/23/105722.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>StringTokenizer(字符串分隔解析类型) （转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105720.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 23 Mar 2007 01:41:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105720.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/105720.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/105720.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/105720.html</trackback:ping><description><![CDATA[
		<strong>java.util.StringTokenizer<br /><br />功效:</strong>将字符串以定界符为界，分析为一个个的token（可理解为单词），定界符可以自己指定。 <br /><br /><br /><span style="COLOR: blue">１、构造函数。<br /><br /></span>1. <span style="COLOR: green">StringTokenizer(String str)</span> ：构造一个用来解析str的StringTokenizer对象。java默认的分隔符是“空格”、“制表符(‘\t’)”、“换行符(‘\n’)”、“回车符(‘\r’)”。<br />2. <span style="COLOR: green">StringTokenizer(String str, String delim) </span>：构造一个用来解析str的StringTokenizer对象，并提供一个指定的分隔符。如new StringTokenizer("A|001:B|002:C|003","<font style="BACKGROUND-COLOR: #ff0000">:"</font>);<br />3. <span style="COLOR: green">StringTokenizer(String str, String delim, boolean returnDelims) </span>：构造一个用来解析str的StringTokenizer对象，并提供一个指定的分隔符，同时，指定是否返回分隔符。<br /><span style="COLOR: blue">２、方法。</span><br /><span style="COLOR: red">说明：<br />1. 所有方法均为public；<br />2. 书写格式：［修饰符］　&lt;返回类型&gt; &lt;方法名（［参数列表］）<br /><br /></span>1. <span style="COLOR: green">int countTokens() </span>：返回nextToken方法被调用的次数。如果采用构造函数1和2，返回的就是分隔符数量(例2)。<br />2. <span style="COLOR: green">boolean hasMoreTokens() </span>：返回是否还有分隔符。<br />3. <span style="COLOR: green">boolean hasMoreElements() </span>：结果同2。<br />4. <span style="COLOR: green">String nextToken()</span> ：返回从当前位置到下一个分隔符的字符串。<br />5. <span style="COLOR: green">Object nextElement() </span>：结果同4。<br />6. <span style="COLOR: green">String nextToken(String delim)</span> ：与4类似，以指定的分隔符返回结果。<br /><span style="COLOR: blue">3、例子。() split 与 StringTokenizer 的萧萧区别!<br /></span><br />import java.util.StringTokenizer;<br />public class StringTokenizerDemo<br />{<br />   public static void main(String args[])<br />  {<br />      String str="100|66,55:200|567,90:102|43,54";<br />      String abc="A|B|C|D";<br />      StringTokenizer strToke=new StringTokenizer(str,":");//默认不打印分隔符<br />      //StringTokenizer strToke=new StringTokenizer(str,":",true);//打印分隔符<br />      //StringTokenizer strToke=new StringTokenizer(str,":",false);//不打印分隔符<br />      int size=strToke.countTokens();//3 &amp; 5<br />      System.out.println("strToke count = "+size);<br />     while(strToke.hasMoreElements())<br />    {<br />       System.out.println(strToke.nextToken());<br />       //System.out.println(strToke.nextElement()); //效果同上<br />     }<br />     //String[] str_abc=str.split("<a href="file://\\|&quot;);//" temp_href="file://\\|&quot;);//"><font color="#000000">\\|");//</font></a>结果与StringTokenizer一样<br />     String[] str_abc=str.split("|");//得到不同的结果<br />     for(int i=0;i&lt;str_abc.length;i++)<br />     {<br />        System.out.println(str_abc[i]);<br />     }<br />  }<br />} <img src ="http://www.blogjava.net/liaojiyong/aggbug/105720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-03-23 09:41 <a href="http://www.blogjava.net/liaojiyong/archive/2007/03/23/105720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Java调用存储过程的总结 （转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105718.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 23 Mar 2007 01:40:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105718.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/105718.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105718.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/105718.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/105718.html</trackback:ping><description><![CDATA[概述： <br />         JDBC中的java.sql.CallableStatement 对象为所有的 DBMS 提供了一种以标准形式调用已储存过程的方法。已储存过程储存在数据库中。对已储存过程的调用是 CallableStatement对象所含的内容。这种调用是用一种换码语法来写的，有两种形式：一种形式带结果参，另一种形式不带结果参数。结果参数是一种输出 (OUT) 参数，是已储存过程的返回值。两种形式都可带有数量可变的输入（IN 参数）、输出（OUT 参数）或输入和输出（INOUT 参数）的参数。问号将用作参数的占位符。 <br />　　在 JDBC 中调用已储存过程的语法如下所示。注意，方括号表示其间的内容是可选项；方括号本身并不是语法的组成部份。 <br /><br />{call 过程名[(?, ?, ...)]} <br /><br /><br />返回结果参数的过程的语法为： <br /><br />{? = call 过程名[(?, ?, ...)]} <br /><br />不带参数的已储存过程的语法类似： <br /><br />{call 过程名} <br /><br />　　通常，创建 CallableStatement 对象的人应当知道所用的 DBMS 是支持已储存过程的，并且知道这些过程都是些什么。然而，如果需要检查，多种DatabaseMetaData 方法都可以提供这样的信息。例如，如果 DBMS 支持已储存过程的调用，则supportsStoredProcedures 方法将返回 true，而getProcedures 方法将返回对已储存过程的描述。CallableStatement 继承 Statement 的方法（它们用于处理一般的 SQL 语句），还继承了 PreparedStatement 的方法（它们用于处理 IN 参）。 <br /><br />　　CallableStatement 中定义的所有方法都用于处理 OUT 参数或 INOUT 参数的输出部分：注册 OUT 参数的 JDBC 类型（一般 SQL 类型）、从这些参数中检索结果，或者检查所返回的值是否为 JDBC NULL。 <br /><br />　　1、创建 CallableStatement 对象 <br /><br />　　CallableStatement 对象是用 Connection 方法 prepareCall 创建的。下例创建 CallableStatement 的实例， 其中含有对已储存过程 getTestData 调用。该过程有两个变量，但不含结果参数： <br /><br />      CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}"); <br /><br />　　其中?占位符为IN、OUT还是INOUT参数，取决于已储存过程getTestData。 <br /><br />　　2、IN和OUT参数 <br /><br />　　将IN参数传给 CallableStatement 对象是通过 setXXX 方法完成的。该方法继承自 PreparedStatement。所传入参数的类型决定了所用的setXXX方法（例如，用 setFloat 来传入 float 值等）。 <br /><br />　　如果已储存过程返回 OUT 参数，则在执行 CallableStatement 对象以前必须先注册每个 OUT 参数的 JDBC 类型（这是必需的，因为某些 DBMS 要求 JDBC 类型）。注册 JDBC 类型是用 registerOutParameter 方法来完成的。语句执行完后，CallableStatement 的 getXXX 方法将取回参数值。正确的 getXXX 方法是为各参数所注册的 JDBC 类型所对应的 Java 类型。换言之， registerOutParameter 使用的是 JDBC 类型（因此它与数据库返回的 JDBC 类型匹配），而 getXXX 将之转换为 Java 类型。 <br /><br />　　作为示例，下述代码先注册 OUT 参数，执行由 cstmt 所调用的已储存过程，然后检索在 OUT 参数中返回的值。方法 getByte 从第一个 OUT 参数中取出一个 Java 字节，而 getBigDecimal 从第二个 OUT 参数中取出一个 BigDecimal 对象（小数点后面带三位数）： <br /><br />CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}"); <br />cstmt.registerOutParameter(1, java.sql.Types.TINYINT); <br />cstmt.registerOutParameter(2, java.sql.Types.DECIMAL, 3); <br />cstmt.executeQuery(); <br />byte x = cstmt.getByte(1); <br />java.math.BigDecimal n = cstmt.getBigDecimal(2, 3); <br /><br />CallableStatement 与 ResultSet 不同，它不提供用增量方式检索大 OUT 值的特殊机制。 <br /><br /><br />3、INOUT参数 <br /><br />　　既支持输入又接受输出的参数（INOUT 参数）除了调用 registerOutParameter 方法外，还要求调用适当的 setXXX 方法（该方法是从 PreparedStatement 继承来的）。setXXX 方法将参数值设置为输入参数，而 registerOutParameter 方法将它的 JDBC 类型注册为输出参数。setXXX 方法提供一个 Java 值，而驱动程序先把这个值转换为 JDBC 值，然后将它送到数据库中。这种 IN 值的 JDBC 类型和提供给 registerOutParameter 方法的 JDBC 类型应该相同。然后，要检索输出值，就要用对应的 getXXX 方法。例如，Java 类型为byte 的参数应该使用方法 setByte 来赋输入值。应该给registerOutParameter 提供类型为 TINYINT 的 JDBC 类型，同时应使用 getByte 来检索输出值。 <br /><br />　　下例假设有一个已储存过程 reviseTotal，其唯一参数是 INOUT 参数。方法setByte 把此参数设为 25，驱动程序将把它作为 JDBC TINYINT 类型送到数据库中。接着，registerOutParameter 将该参数注册为 JDBC TINYINT。执行完该已储存过程后，将返回一个新的 JDBC TINYINT 值。方法 getByte 将把这个新值作为 Java byte 类型检索。 <br /><br />CallableStatement cstmt = con.prepareCall("{call reviseTotal(?)}"); <br />cstmt.setByte(1, 25); <br />cstmt.registerOutParameter(1, java.sql.Types.TINYINT); <br />cstmt.executeUpdate(); <br />byte x = cstmt.getByte(1); <br /><br /><br />4、先检索结果，再检索 OUT 参数 <br /><br />　　由于某些 DBMS 的限制，为了实现最大的可移植性，建议先检索由执行CallableStatement 对象所产生的结果，然后再用 CallableStatement.getXXX 方法来检索 OUT 参数。如果 CallableStatement 对象返回多个 ResultSet 对象（通过调用 execute 方法），在检索 OUT 参数前应先检索所有的结果。这种情况下，为确保对所有的结果都进行了访问，必须对 Statement 方法 getResultSet、getUpdateCount 和getMoreResults 进行调用，直到不再有结果为止。 <br /><br />　　检索完所有的结果后，就可用 CallableStatement.getXXX 方法来检索 OUT 参数中的值。 <br /><br />5、检索作为OUT参数的NULL值 <br /><br />　　返回到 OUT 参数中的值可能会是JDBC NULL。当出现这种情形时，将对 JDBC NULL 值进行转换以使 getXXX 方法所返回的值为 null、0 或 false，这取决于getXXX 方法类型。对于 ResultSet 对象，要知道0或false是否源于JDBCNULL的唯一方法，是用方法wasNull进行检测。如果 getXXX 方法读取的最后一个值是 JDBC NULL，则该方法返回 true，否则返回 flase。<br />6、具体使用举例<br />  改天在写了... <img src ="http://www.blogjava.net/liaojiyong/aggbug/105718.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-03-23 09:40 <a href="http://www.blogjava.net/liaojiyong/archive/2007/03/23/105718.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Log4j的介绍（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105716.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 23 Mar 2007 01:35:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105716.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/105716.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105716.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/105716.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/105716.html</trackback:ping><description><![CDATA[一、前言：<br />     log4j (<a href="http://jakarta.apache.org/log4j/"><font color="#000000">http://jakarta.apache.org/log4j/</font></a>)是一个开放源码项目，是广泛使用的以Java编写的日志记录包。由于log4j出色的表现,当时在log4j完成时，log4j开发组织曾建议sun在jdk1.4中用log4j取代jdk1.4 的日志工具类，但当时jdk1.4已接近完成，所以sun拒绝使用log4j，当在java开发中实际使用最多的还是log4j,人们遗忘了sun的日志工具类.。它的一个独有特性包括在类别中继承的概念。通过使用类别层次结构，这样就减少了日志记录输出量，并将日志记录的开销降到最低。<br />   <br />     它允许开发者控制以任意间隔输出哪些日志语句。通过使用外部配置文件，完全可以在运行时进行配置。几乎每个大的应用程序都包括其自己的日志记录或跟踪 API。经验表明日志记录是开发周期中的重要组成部分。同样，日志记录提供一些优点。首先，它可以提供运行应用程序的确切 上下文。一旦插入到代码中，生成日志记录输出就不需要人为干涉。其次，日志输出可以保存到永久媒体中以便以后研究。最后，除了在开发阶段中使用，十分丰富的日志记录包还可以用作审计工具。 
<p>    依照该规则，在 1996 年初，EU SEMPER（欧洲安全电子市场）项目就决定编写自己的跟踪 API。 在无数次改进、几次具体化和许多工作之后，该 API 已经演变成 log4j，一种流行的 Java 日志记录包。  这个包按 IBM 公共许可证分发，由开放源码权威机构认证。</p><p>    日志记录有其自己的缺点。它会降低应用程序的速度。如果太详细，它可能会使屏幕滚动变得看不见。  为了减低这些影响，log4j 被设计成快速且灵活的。由于应用程序很少将日志记录当作是主要功能，  log4j API 力争易于了解和使用。<br />     log4j，它可以控制以任意间隔输出哪些日志语句。</p><p>二、主要组件</p><p>1、根类别（在类别层次结构的顶部，即全局性的日志级别）<br /> <br />配置根Logger，其语法为：</p><p>log4j.rootLogger = [ level ] , appenderName, appenderName, ...</p><p>level 是日志记录的类别<br />appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。 </p><p>类别level 为 OFF、FATAL、ERROR、WARN、INFO、DEBUG、log、ALL或自定义的优先级。<br />og4j常用的优先级FATAL&gt;ERROR&gt;WARN&gt;INFO&gt;DEBUG<br />配置根Logger，其语法为：<br />log4j.rootLogger = [ level ] , appenderName, appenderName, …<br />如果为log4j.rootLogger=WARN，则意味着只有WARN,ERROR,FATAL被输出，DEBUG,INFO将被屏蔽掉。</p><p>举例：log4j.rootCategory=INFO,stdout,Runlog,Errorlog<br />根日志类别为INFO，DEBUG将被屏蔽，其他的将被输出。 stdout,Runlog,Errorlog分别为3个输出目的地。</p><p> 2、常用输出格式</p><p> -X号:X信息输出时左对齐；<br /> %p:日志信息级别<br /> %d{}:日志信息产生时间<br /> %c:日志信息所在地（类名）<br /> %m:产生的日志具体信息<br /> %n:输出日志信息换行<br /> 举例：<br />log4j.appender.stdout.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n<br />log4j.appender.Runlog.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n<br />log4j.appender.Errorlog.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n</p><p>3、布局<br />使用的输出布局，其中log4j提供4种布局：<br />org.apache.log4j.HTMLLayout（以HTML表格形式布局）<br />org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br />org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br />org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息） </p><p>举例：<br />输出格式为HTML表格<br />log4j.appender.stdout.layout=org.apache.log4j.HTMLLayout</p><p>输出格式为可以灵活地指定布局模式<br />log4j.appender.stdout.layout=org.apache.log4j.PatternLayout</p><p>输出格式为包含日志信息的级别和信息字符串<br />log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout</p><p>输出格式为包含日志产生的时间、线程、类别等等信息<br />log4j.appender.stdout.layout=org.apache.log4j.TTCCLayout</p><p><br />4、目的地</p><p>配置日志信息输出目的地Appender，其语法为</p><p><br />log4j.appender.appenderName = fully.qualified.name.of.appender.class<br />log4j.appender.appenderName.option1 = value1<br />...<br />log4j.appender.appenderName.option = valueN<br />appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。 </p><p>log4j支持的输出目的地：<br />org.apache.log4j.ConsoleAppender 控制台<br />org.apache.log4j.FileAppender 文件<br />org.apache.log4j.DailyRollingFileAppender 每天产生一个日志文件<br />org.apache.log4j.RollingFileAppender （文件大小到达指定尺寸的时候产生一个新的文件），<br />org.apache.log4j.WriterAppender （将日志信息以流格式发送到任意指定的地方） <br />org.apache.log4j.net.SMTPAppender 邮件<br />org.apache.log4j.jdbc.JDBCAppender 数据库<br />其他如：GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等</p><p>举例：</p><p><br />输出到控制台<br />log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender（指定输出到控制台）<br />log4j.appender.Threshold=DEBUG（指定输出类别）<br />log4j.appender.CONSOLE.Target=System.out<br />log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout（指定输出布局）<br />log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n（指定输出格式）</p><p>输出到文件</p><p>   log4j.appender.FILE=org.apache.log4j.FileAppender（指定输出到文件）<br />   log4j.appender.FILE.File=file.log（指定输出的路径及文件名）<br />   log4j.appender.FILE.Append=false<br />   log4j.appender.FILE.layout=org.apache.log4j.PatternLayout（指定输出的布局）<br />   log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n（指定输出的格式）</p><p>输出到文件（轮换"日志文件",当日志文件达到指定大小时，该文件就被关闭并备份，然后创建一个新的日志文件）</p><p>  log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender（指定输出到文件）<br />  log4j.appender.ROLLING_FILE.Threshold=ERROR（指定输出类别）<br />  log4j.appender.ROLLING_FILE.File=rolling.log（指定输出的路径及文件名）<br />  log4j.appender.ROLLING_FILE.Append=true<br />  log4j.appender.ROLLING_FILE.MaxFileSize=10KB（指定输出到文件的大小）<br />  log4j.appender.ROLLING_FILE.MaxBackupIndex=1<br />  log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout（指定采用输出布局）<br />  log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n（指定采用输出格式）</p><p>输出到Socket<br /> log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender（指定输出到Socket）<br /> log4j.appender.SOCKET.RemoteHost=localhost（远程主机）<br /> log4j.appender.SOCKET.Port=5001（远程主机端口）<br /> log4j.appender.SOCKET.LocationInfo=true<br /> log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout（布局）<br /> log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n（输出格式）</p><p>输出到邮件<br />log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender（指定输出到邮件）<br /> log4j.appender.MAIL.Threshold=FATAL<br /> log4j.appender.MAIL.BufferSize=10<br /> <a href="mailto:log4j.appender.MAIL.From=chunkyo@163.com"><font color="#000000">log4j.appender.MAIL.From=chunkyo@163.com</font></a>（发件人）<br /> log4j.appender.MAIL.SMTPHost=mail.hollycrm.com（SMTP服务器）<br /> log4j.appender.MAIL.Subject=Log4J Message<br /> <a href="mailto:log4j.appender.MAIL.To=chunkyo@163.com"><font color="#000000">log4j.appender.MAIL.To=chunkyo@163.com</font></a>（收件人）<br /> log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout（布局）<br /> log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n（格式）</p><p> </p><p>输出到数据库<br /> log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender（指定输出到数据库）<br /> log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test（指定数据库URL）<br /> log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver（指定数据库driver）<br /> log4j.appender.DATABASE.user=root（指定数据库用户）<br /> log4j.appender.DATABASE.password=root（指定数据库用户密码）<br /> log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')（组织SQL语句）<br /> log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout（布局）<br /> log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n（格式）</p><p>5、日志类别补充<br />有时我们需要对某个特定的部分指定有别于根类别的日志类别，可以指定某个包的优先级<br />如：<br />  log4j.category.com.neusoft.mbip.dm.util=ERROR ，其中com.neusoft.mbip.dm.util为我们需要特别指定日志类别的部分。<br />  <br />  或者可以指定输出文件的优先级<br />  log4j.appender.Errorlog.Threshold=ERROR<br />  <br />三、 常用log4j配置  </p><p>常用log4j配置，一般可以采用两种方式，.properties和.xml,下面举两个简单的例子：</p><p>1、log4j.properties</p><p>### 设置org.zblog域对应的级别INFO,DEBUG,WARN,ERROR和输出地A1，A2 ##<br />log4j.category.org.zblog=ERROR,A1 <br />log4j.category.org.zblog=INFO,A2 </p><p>log4j.appender.A1=org.apache.log4j.ConsoleAppender <br />### 设置输出地A1，为ConsoleAppender(控制台) ##<br />log4j.appender.A1.layout=org.apache.log4j.PatternLayout <br />### 设置A1的输出布局格式PatterLayout,(可以灵活地指定布局模式）##<br />log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n <br />### 配置日志输出的格式##</p><p>log4j.appender.A2=org.apache.log4j.RollingFileAppender <br />### 设置输出地A2到文件（文件大小到达指定尺寸的时候产生一个新的文件）##<br />log4j.appender.A2.File=E:/study/log4j/zhuwei.html <br />### 文件位置##<br />log4j.appender.A2.MaxFileSize=500KB <br />### 文件大小##<br />log4j.appender.A2.MaxBackupIndex=1 <br />log4j.appender.A2.layout=org.apache.log4j.HTMLLayout <br />##指定采用html方式输出</p><p>2、log4j.xml</p><p>&lt;?xml version="1.0" encoding="GB2312" ?&gt;<br />&lt;!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"&gt;</p><p>&lt;log4j:configuration xmlns:log4j="<a href="http://jakarta.apache.org/log4j/"><font color="#000000">http://jakarta.apache.org/log4j/</font></a>"&gt;</p><p>&lt;appender name="org.zblog.all" class="org.apache.log4j.RollingFileAppender"&gt;<br />&lt;!-- 设置通道ID:org.zblog.all和输出方式：org.apache.log4j.RollingFileAppender --&gt;<br />    &lt;param name="File" value="E:/study/log4j/all.output.log" /&gt;&lt;!-- 设置File参数：日志输出文件名 --&gt;<br />    &lt;param name="Append" value="false" /&gt;&lt;!-- 设置是否在重新启动服务时，在原有日志的基础添加新日志 --&gt;<br />    &lt;layout class="org.apache.log4j.PatternLayout"&gt;<br />        &lt;param name="ConversionPattern" value="%p (%c:%L)- %m%n" /&gt;&lt;!-- 设置输出文件项目和格式 --&gt;<br />    &lt;/layout&gt;<br />&lt;/appender&gt;</p><p>&lt;appender name="org.zblog.zcw" class="org.apache.log4j.RollingFileAppender"&gt;<br />    &lt;param name="File" value="E:/study/log4j/zhuwei.output.log" /&gt;<br />    &lt;param name="Append" value="true" /&gt;<br />    &lt;param name="MaxFileSize" value="10240" /&gt; &lt;!-- 设置文件大小 --&gt;<br />    &lt;layout class="org.apache.log4j.PatternLayout"&gt;<br />        &lt;param name="ConversionPattern" value="%p (%c:%L)- %m%n" /&gt;<br />    &lt;/layout&gt;<br />&lt;/appender&gt;</p><p>&lt;logger name="zcw.log"&gt; &lt;!-- 设置域名限制，即zcw.log域及以下的日志均输出到下面对应的通道中 --&gt;<br />    &lt;level value="debug" /&gt;&lt;!-- 设置级别 --&gt;<br />    &lt;appender-ref ref="org.zblog.zcw" /&gt;&lt;!-- 与前面的通道id相对应 --&gt;<br />&lt;/logger&gt;</p><p>&lt;root&gt; &lt;!-- 设置接收所有输出的通道 --&gt;<br />    &lt;appender-ref ref="org.zblog.all" /&gt;&lt;!-- 与前面的通道id相对应 --&gt;<br />&lt;/root&gt;</p><p>&lt;/log4j:configuration&gt;</p><p><br />3、配置文件加载方法：</p><p>import org.apache.log4j.Logger;<br />import org.apache.log4j.PropertyConfigurator;<br />import org.apache.log4j.xml.DOMConfigurator;</p><p>public class Log4jApp {<br />    public static void main(String[] args) {<br />        DOMConfigurator.configure("E:/study/log4j/log4j.xml");//加载.xml文件<br />        //PropertyConfigurator.configure("E:/study/log4j/log4j.properties");//加载.properties文件</p><p>        Logger log=Logger.getLogger("org.zblog.test");<br />        log.info("测试");<br />    }<br />}</p><p>4、项目使用log4j<br />在web应用中，可以将配置文件的加载放在一个单独的servlet中，并在web.xml中配置该servlet在应用启动时候加载。<br />对于在多人项目中，可以给每一个人设置一个输出通道，这样在每个人在构建Logger时，用自己的域名称，让调试信<br />息输出到自己的log文件中。</p><p>四、log4j配置举例（properties）</p><p>#log4j.rootLogger = [ level ] , appenderName, appenderName, <br />#类别level 为 OFF、FATAL、ERROR、WARN、INFO、DEBUG、log、ALL或自定义的优先级<br />#Log4j常用的优先级FATAL&gt;ERROR&gt;WARN&gt;INFO&gt;DEBUG</p><p>#stdout为控制台 ，Errorlog为错误记录日志 ，<br />log4j.rootCategory=INFO,stdout,Runlog,Errorlog</p><p><br />#输出的appender的格式为<br />#log4j.appender.appenderName = fully.qualified.name.of.appender.class <br />#log4j.appender.appenderName.option1 = value1 <br />#log4j.appender.appenderName.option = valueN <br />#Log4j中appender支持的输出<br />#org.apache.log4j.ConsoleAppender 控制台<br />#org.apache.log4j.FileAppender 文件<br />#org.apache.log4j.DailyRollingFileAppender 每天产生一个日志文件<br />#org.apache.log4j.RollingFileAppender （文件大小到达指定尺寸的时候产生一个新的文件），<br />#org.apache.log4j.WriterAppender （将日志信息以流格式发送到任意指定的地方） <br />#org.apache.log4j.net.SMTPAppender 邮件<br />#org.apache.log4j.jdbc.JDBCAppender 数据库</p><p>＃定义输出的形式<br />log4j.appender.stdout=org.apache.log4j.ConsoleAppender<br />log4j.appender.Runlog=org.apache.log4j.DailyRollingFileAppender<br />log4j.appender.Errorlog=org.apache.log4j.DailyRollingFileAppender</p><p><br />#可以指定输出文件的优先级<br />log4j.appender.Errorlog.Threshold=ERROR</p><p>#指定输出的文件<br />log4j.appender.Runlog.File=D:\\UserInfoSyn\\WebRoot\\WEB-INF\\runlog\\runlog.log <br />log4j.appender.Errorlog.File=D:\\UserInfoSyn\\WebRoot\\WEB-INF\\errorlog\\errorlog.log </p><p><br />#Log4j的layout布局<br />#org.apache.log4j.HTMLLayout 以HTML表格形式布局<br />#org.apache.log4j.PatternLayout 可以灵活地指定布局模式<br />#org.apache.log4j.SimpleLayout  包含日志信息的级别和信息字符串<br />#org.apache.log4j.TTCCLayout    包含日志产生的时间、线程、类别等等信息</p><p>log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<br />log4j.appender.Runlog.layout=org.apache.log4j.PatternLayout<br />log4j.appender.Errorlog.layout=org.apache.log4j.PatternLayout</p><p>#输出格式,log4j javadoc org.apache.log4j.PatternLayout <br />#-X号:X信息输出时左对齐；<br />#%p:日志信息级别<br /># %d{}:日志信息产生时间<br /># %c:日志信息所在地（类名）<br /># %m:产生的日志具体信息<br /># %n:%n:输出日志信息换行<br />log4j.appender.stdout.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n<br />log4j.appender.Runlog.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n<br />log4j.appender.Errorlog.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n</p><p>#指定某个包的优先级 <br />log4j.category.com.neusoft.mbip.dm.util=ERROR</p><p><br />#示例<br />###################<br /># Console Appender<br />###################<br />#log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender<br />#log4j.appender.Threshold=DEBUG<br />#log4j.appender.CONSOLE.Target=System.out<br />#log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout<br />#log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n<br />#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n</p><p><br />#####################<br /># File Appender<br />#####################<br />#log4j.appender.FILE=org.apache.log4j.FileAppender<br />#log4j.appender.FILE.File=file.log<br />#log4j.appender.FILE.Append=false<br />#log4j.appender.FILE.layout=org.apache.log4j.PatternLayout<br />#log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n<br /># Use this layout for LogFactor 5 analysis</p><p>########################<br /># Rolling File????? RollingFileAppender??????????????????<br />########################<br />#log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender<br />#log4j.appender.ROLLING_FILE.Threshold=ERROR<br /># 文件位置<br />#log4j.appender.ROLLING_FILE.File=rolling.log<br />#log4j.appender.ROLLING_FILE.Append=true<br />#文件大小<br />#log4j.appender.ROLLING_FILE.MaxFileSize=10KB<br />#指定采用输出布局和输出格式<br />#log4j.appender.ROLLING_FILE.MaxBackupIndex=1<br />#log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout<br />#log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n</p><p>####################<br /># Socket Appender<br />####################<br />#log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender<br />#log4j.appender.SOCKET.RemoteHost=localhost<br />#log4j.appender.SOCKET.Port=5001<br />#log4j.appender.SOCKET.LocationInfo=true<br /># Set up for Log Facter 5<br />#log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout<br />#log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n</p><p>########################<br /># SMTP Appender<br />#######################<br />#log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender<br />#log4j.appender.MAIL.Threshold=FATAL<br />#log4j.appender.MAIL.BufferSize=10<br /><a href="mailto:#log4j.appender.MAIL.From=chunkyo@163.com"><font color="#000000">#log4j.appender.MAIL.From=chunkyo@163.com</font></a><br />#log4j.appender.MAIL.SMTPHost=mail.hollycrm.com<br />#log4j.appender.MAIL.Subject=Log4J Message<br /><a href="mailto:#log4j.appender.MAIL.To=chenyl@hollycrm.com"><font color="#000000">#log4j.appender.MAIL.To=chunkyo@163.com</font></a><br />#log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout<br />#log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n</p><p>########################<br /># JDBC Appender<br />#######################<br />#log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender<br />#log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test<br />#log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver<br />#log4j.appender.DATABASE.user=root<br />#log4j.appender.DATABASE.password=<br />#log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')<br />#log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout<br />#log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n</p><p>########################<br /># Log Factor 5 Appender<br />########################<br />#log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender<br />#log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000</p><p>###################<br />#自定义Appender<br />###################<br />#log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender<br />#log4j.appender.im.host = mail.cybercorlin.net<br />#log4j.appender.im.username = username<br />#log4j.appender.im.password = password<br />#log4j.appender.im.recipient = <a href="mailto:chunkyo@163.com"><font color="#000000">chunkyo@163.com</font></a><br />#log4j.appender.im.layout=org.apache.log4j.PatternLayout<br />#log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n<br /><br /><br /><br />log4j 过滤日志级别<br />Please see detail for logconfig.xml. For filter only support xml. <br /><br />You can use as following appender: <br /><br />org.apache.log4j.ConsoleAppender ConsoleAppender <br />org.apache.log4j.FileAppender FileAppender <br />org.apache.log4j.jdbc.JDBCAppender JDBCAppender <br />org.apache.log4j.AsyncAppender AsyncAppender <br />org.apache.log4j.net.JMSAppender JMSAppender <br />org.apache.log4j.lf5.LF5Appender LF5Appender <br />org.apache.log4j.nt.NTEventLogAppender NTEventLogAppender <br />org.apache.log4j.varia.NullAppender NullAppender <br />org.apache.log4j.net.SMTPAppender SMTPAppender <br />org.apache.log4j.net.SocketAppender SocketAppender <br />org.apache.log4j.net.SocketHubAppender SocketHubAppender <br />org.apache.log4j.net.SyslogAppender SyslogAppender <br />org.apache.log4j.net.TelnetAppender TelnetAppender <br />org.apache.log4j.WriterAppender WriterAppender <br />For only one level deal: <br />You must user LevelRangeFilter and set LevelMin and LevelMax to the same level, <br /><br />Note:The value must uppercase. <br /><br /><br />&lt;filter class="org.apache.log4j.varia.LevelRangeFilter"&gt;<br />&lt;param name="LevelMin" value="ERROR" /&gt;<br />&lt;param name="LevelMax" value="ERROR" /&gt;<br />&lt;/filter&gt;<br /></p><img src ="http://www.blogjava.net/liaojiyong/aggbug/105716.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-03-23 09:35 <a href="http://www.blogjava.net/liaojiyong/archive/2007/03/23/105716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>给 Java SE 注入脚本语言的活力（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/03/21/105302.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 21 Mar 2007 08:21:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/03/21/105302.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/105302.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/03/21/105302.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/105302.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/105302.html</trackback:ping><description><![CDATA[
		<blockquote>
				<p>在即将发布的 Java SE6（Mustang）中，增加了对脚本语言的支持。通过对脚本语言的调用，使得一些通常用 Java 比较难于实现的功能变得简单和轻便。脚本语言与 Java 之间的互操作将变得优雅而直接。</p>
		</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<a name="N10051">
						<span class="atitle">脚本语言与 Java</span>
				</a>
		</p>
		<p>假设我们有一个简单的需求，察看一份文档中 5 个字母组成的单词的个数。用 Java 一般实现如下：</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Find5Words {
    public static void main(String[] args) throws IOException {
        String result = "";
        String line = null;
        int num = 0;
        FileReader fr = new FileReader("filename");
        BufferedReader br = new BufferedReader(fr);
        while ((line = br.readLine()) != null) {
            result += line;
        }
        br.close();
        fr.close();
        String[] s = result.split(" ");
        for (int i = 0; i &lt; s.length; i++) {
            if (s[i].matches("^\\w{5}$")) {
                num++;
            }
        }
        System.out.println(num);
    }
}
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>再看看 Perl 语言实现同样功能的代码：</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">open FILE, "&lt;filename ";
while (&lt;FILE&gt;) { 
    for (split) { 
        $num++ if /^\w{5}$/ 
    } 
}
print $num;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>那么有没有一种优雅的方式将 Java 与脚本语言结合呢，在今年秋季即将发布的 Java SE6（代号 Mustang）中，这将成为现实。</p>
		<p>
				<a name="N1006B">
						<span class="atitle">Mustang 的脚本引擎</span>
				</a>
		</p>
		<p>
				<a href="http://www.jcp.org/en/jsr/detail?id=223">
						<font color="#5c81a7">JSR 233</font>
				</a> 为 Java 设计了一套脚本语言 API。这一套 API 提供了在 Java 程序中调用各种脚本语言引擎的接口。任何实现了这一接口的脚本语言引擎都可以在 Java 程序中被调用。在 Mustang 的发行版本中包括了一个基于 Mozilla Rhino 的 JavaScript 脚本引擎。</p>
		<p>
				<a name="N10078">
						<span class="smalltitle">
								<strong>
										<font face="Arial">Mozilla Rhino</font>
								</strong>
						</span>
				</a>
		</p>
		<p>Rhino 是一个纯 Java 的开源的 JavaScript 实现。他的名字来源于 O'Reilly 关于 JavaScript 的书的封面：</p>
		<img alt="Rhino" src="http://www.ibm.com/developerworks/cn/java/j-lo-mustang-script/img/rhino.gif" />
		<p>Rhino 项目可以追朔到 1997 年，当时 Netscape 计划开发一个纯 Java 实现的 Navigator，为此需要一个 Java 实现的 JavaScript —— Javagator。它也就是 Rhino 的前身。起初 Rhino 将 JavaScript 编译成 Java 的二进制代码执行，这样它会有最好的性能。后来由于编译执行的方式存在垃圾收集的问题并且编译和装载过程的开销过大，不能满足一些项目的需求，Rhino 提供了解释执行的方式。随着 Rhino 开放源代码，越来越多的用户在自己的产品中使用了 Rhino，同时也有越来越多的开发者参与了 Rhino 的开发并做出了很大的贡献。如今 Rhino1.6R2 版本将被包含在 Java SE6 中发行，更多的 Java 开发者将从中获益。</p>
		<p>Rhino 提供了如下功能</p>
		<ul>
				<li>对 JavaScript 1.5 的完全支持 
</li>
				<li>直接在 Java 中使用 JavaScript 的功能 
</li>
				<li>一个 JavaScript shell 用于运行 JavaScript 脚本 
</li>
				<li>一个 JavaScript 的编译器，用于将 JavaScript 编译成 Java 二进制文件 </li>
		</ul>
		<p>
				<a name="N1009B">
						<span class="smalltitle">
								<strong>
										<font face="Arial">支持的脚本语言</font>
								</strong>
						</span>
				</a>
		</p>
		<p>在<a href="https://scripting.dev.java.net/"><font color="#5c81a7">dev.java.net</font></a>可以找到官方的脚本引擎的实现项目。这一项目基于<a href="http://www.opensource.org/licenses/bsd-license.html"><font color="#5c81a7">BSD License</font></a> ，表示这些脚本引擎的使用将十分自由。目前该项目已对包括 Groovy, JavaScript, Python, Ruby, PHP 在内的二十多种脚本语言提供了支持。这一支持列表还将不断扩大。</p>
		<p>在 Mustang 中对脚本引擎的检索使用了工厂模式。首先需要实例化一个工厂 —— ScriptEngineManager。</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">// create a script engine manager
ScriptEngineManager factory = new ScriptEngineManager();
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>ScriptEngineManager 将在 Thread Context ClassLoader 的 Classpath 中根据 jar 文件的 META-INF 来查找可用的脚本引擎。它提供了 3 种方法来检索脚本引擎：</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">// create engine by name
ScriptEngine engine = factory.getEngineByName ("JavaScript");
// create engine by name
ScriptEngine engine = factory.getEngineByExtension ("js");
// create engine by name
ScriptEngine engine = factory.getEngineByMimeType ("application/javascript");
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>下面的代码将会打印出当前的 JDK 所支持的所有脚本引擎</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">ScriptEngineManager factory = new ScriptEngineManager();
for (ScriptEngineFactory available : factory.getEngineFactories()) {
    System.out.println(available.getEngineName());
}
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>以下各章节代码将以 JavaScript 为例。</p>
		<p>
				<a name="N100C8">
						<span class="smalltitle">
								<strong>
										<font face="Arial">在 Java 中解释脚本</font>
								</strong>
						</span>
				</a>
		</p>
		<p>有了脚本引擎实例就可以很方便的执行脚本语言，按照惯例，我们还是从一个简单的 Hello World 开始：</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">public class RunJavaScript {
    public static void main(String[] args){
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName ("JavaScript");
        engine.eval("print('Hello World')");
    }
}
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这段 Java 代码将会执行 JavaScript 并打印出 Hello World。如果 JavaScript 有语法错误将会如何？</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">engine.eval("if(true){println ('hello')");
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />故意没有加上”}”，执行这段代码 Java 将会抛出一个 javax.script.ScriptException 并准确的打印出错信息： 
<table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">Exception in thread "main" javax.script.ScriptException: 
sun.org.mozilla.javascript.internal.EvaluatorException: 
missing } in compound statement (&lt;Unknown source&gt;#1) in &lt;Unknown source&gt; 
at line number 1
at ...
</pre></td></tr></tbody></table><br /><p>如果我们要解释一些更复杂的脚本语言，或者想在运行时改变该脚本该如何做呢？脚本引擎支持一个重载的 eval 方法，它可以从一个 Reader 读入所需的脚本：</p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName ("JavaScript");
engine.eval(new Reader("HelloWorld.js"));
</pre></td></tr></tbody></table><br />如此这段 Java 代码将在运行时动态的寻找 HelloWorld.js 并执行，用户可以随时通过改变这一脚本文件来改变 Java 代码的行为。做一个简单的实验，Java 代码如下： 
<table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">public class RunJavaScript {
    public static void main(String[] args) throws FileNotFoundException, 
            ScriptException, InterruptedException {
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName ("JavaScript");
        while (true) {
            engine.eval(new FileReader("HelloWorld.js"));
            Thread.sleep(1000);
        }
    }
}
</pre></td></tr></tbody></table><br /><p>HelloWorld.js 内容为简单的打印一个 Hello World： <code>print('Hello World'); </code></p><p>运行 RunJavaScript 将会每一秒钟打印一个 Hello World。这时候修改 HelloWorld.js 内容为 <code>print('Hello Tony'); </code></p><p>打印的内容将变为 Hello Tony，由此可见 Java 程序将动态的去读取脚本文件并解释执行。对于这一简单的 Hello World 脚本来说，IO 操作将比直接执行脚本损失 20% 左右的性能（在我的 Think Pad 上），但他带来的灵活性——在运行时动态改变代码的能力，在某些场合是十分激动人心的。</p><p><a name="N10102"><span class="smalltitle"><strong><font face="Arial">脚本语言与 Java 的通信</font></strong></span></a></p><p>ScriptEngine 的 put 方法用于将一个 Java 对象映射成一个脚本语言的变量。现在有一个 Java Class，它只有一个方法，功能就是打印一个字符串 Hello World：</p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">package tony;

public class HelloWorld {
    String s = "Hello World";
    public void sayHello(){
        System.out.println(s);
    }
}
</pre></td></tr></tbody></table><br /><p>那么如何在脚本语言中使用这个类呢？put 方法可以做到：</p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class TestPut {
    public static void main(String[] args) throws ScriptException {
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName("JavaScript");
        HelloWorld hello = new HelloWorld();
        engine.put("script_hello", hello);
        engine.eval("script_hello.sayHello()");
    }
}
</pre></td></tr></tbody></table><br /><p>首先我们实例化一个 HelloWorld，然后用 put 方法将这个实例映射为脚本语言的变量 script_hello。那么我们就可以在 eval() 函数中像 Java 程序中同样的方式来调用这个实例的方法。同样的，假设我们有一个脚本函数，它进行一定的计算并返回值，我们在 Java 代码中也可以方便的调用这一脚本：</p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">package tony;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class TestInv {
    public static void main(String[] args) throws ScriptException,
            NoSuchMethodException {
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName("JavaScript");
        String script = "function say(first,second) { print(first +' '+ second); }";
        engine.eval(script);
        Invocable inv = (Invocable) engine;
        inv.invokeFunction("say", "Hello", "Tony");
    }
}
</pre></td></tr></tbody></table><br /><p>在这个例子中我们首先定义了一个脚本函数 say，它的作用是接受两个字符串参数将他们拼接并返回。这里我们第一次遇到了 ScriptEngine 的两个可选接口之一 —— Invocable，Invocable 表示当前的 engine 可以作为函数被调用。这里我们将 engine 强制转换为 Invocable 类型，使用 invokeFunction 方法将参数传递给脚本引擎。invokeFunction这个方法使用了可变参数的定义方式，可以一次传递多个参数，并且将脚本语言的返回值作为它的返回值。下面这个例子用JavaScript实现了一个简单的max函数，接受两个参数，返回较大的那个。为了便于断言结果正确性，这里继承了JUnit Testcase，关于JUnit请参考<a href="http://www.junit.org/"><font color="#5c81a7">www.junit.org</font></a>。</p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">package tony;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import junit.framework.TestCase;

public class TestScripting extends TestCase {
    
    public void testInv() throws ScriptException, NoSuchMethodException {
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName("JavaScript");
        String script = "function max(first,second) "
		    + "{ return (first &gt; second) ?first:second;}";
        engine.eval(script);
        Invocable inv = (Invocable) engine;
        Object obj = inv.invokeFunction("max", "1", "0");
        assertEquals("1", obj.toString());
	}
}
</pre></td></tr></tbody></table><br /><p>Invocable 接口还有一个方法用于从一个 engine 中得到一个 Java Interface 的实例，它的定义如下：</p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">&lt;T&gt; T getInterface(Class&lt;T&gt; clasz)
</pre></td></tr></tbody></table><br /><p>它接受一个 Java 的 Interface 类型作为参数，返回这个 Interface 的一个实例。也就是说你可以完全用脚本语言来写一个 Java Interface 的所有实现。以下是一个例子。首先定一了个 Java Interface，它有两个简单的函数，分别为求最大值和最小值：</p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">package tony;

public interface MaxMin {
    public int max(int a, int b);
    public int min(int a, int b);
}
</pre></td></tr></tbody></table><br /><p>这个 Testcase 用 JavaScript 实现了 MaxMin 接口，然后用 getInterface 方法返回了一个实例并验证了结果。</p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">public void testInvInterface() throws ScriptException,
        NoSuchMethodException {
    ScriptEngineManager factory = new ScriptEngineManager();
    ScriptEngine engine = factory.getEngineByName("JavaScript");
    String script = "function max(first,second) "
		    + "{ return (first &gt; second) ?first:second;}";
    script += "function min(first,second) { return (first &lt; second) ?first:second;}";
    engine.eval(script);
    Invocable inv = (Invocable) engine;
    MaxMin maxMin = inv.getInterface(MaxMin.class);
    assertEquals(1, maxMin.max(1, 0));
    assertEquals(0, maxMin.min(1, 0));
}
</pre></td></tr></tbody></table><br /><p><a name="N10145"><span class="smalltitle"><strong><font face="Arial">脚本的编译执行</font></strong></span></a></p><p>到目前为止，我们的脚本全部都是解释执行的，相比较之下编译执行将会获得更好的性能。这里将介绍 ScriptEngine 的另外一个可选接口 —— Compilable，实现了这一接口的脚本引擎支持脚本的编译执行。下面这个例子实现了一个判断给定字符串是否是 email 地址或者 ip 地址的脚本：</p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">public void testComplie() throws ScriptException {
    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("JavaScript");
    String script = "var email=/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]" 
        + "+(\\.[a-zA-Z0-9_-]+)+$/;";
    script += "var ip = /^(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])"
        +"(\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])){3}$/;";
    script += "if(email.test(str)){println('it is an email')}"
            + "else if(ip.test(str)){println('it is an ip address')}"
            + "else{println('I don\\'t know')}";
    engine.put("str", "email@address.tony");
    Compilable compilable = (Compilable) engine;
    CompiledScript compiled = compilable.compile(script);
    compiled.eval();
}
</pre></td></tr></tbody></table><br /><p>脚本编译的过程如下：首先将 engine 转换为 Compilable 接口，然后调用 Compilable 接口的 compile 方法得到一个 CompiledScript 的实例，这个实例就代表一个编译过的脚本，如此用 CompiledScript 的 eval 方法即为调用编译好的脚本了。在我的 Think Pad 上，这段代码编译后的调用大约比直接调用 engine.eval 要快 3-4 倍。随着脚本复杂性的提升，性能的提升会更加明显。</p><p><a name="N10157"><span class="smalltitle"><strong><font face="Arial">脚本上下文与绑定</font></strong></span></a></p><p>真正将脚本语言与 Java 联系起来的不是 ScriptEngine，而是 ScriptContext，它作为 Java 与 ScriptEngine 之间的桥梁而存在。</p><p>一个 ScriptEngine 会有一个相应的 ScriptContext，它维护了一个 Map，这个 Map 中的每个元素都是脚本语言对象与 Java 对象之间的映射。同时这个 Map 在我们的 API 中又被称为 Bindings。一个 Bindings 就是一个限定了 key 必须为 String 类型的 Map —— Map&lt;String, Object&gt;。所以一个 ScriptContext 也会有对应的一个 Bindings，它可以通过 getBindings 和 setBindings 方法来获取和更改。</p><p>一个 Bindings 包括了它的 ScriptContext 中的所有脚本变量，那么如何获取脚本变量的值呢？当然，从 Bindings 中 get 是一个办法，同时 ScriptContext 也提供了 getAttribute 方法，在只希望获得某一特定脚本变量值的时候它显然是十分有效的。相应地 setAttribute 和 removeAttribute 可以增加、修改或者删除一个特定变量。</p><p>在 ScriptContext 中存储的所有变量也有自己的作用域，它们可以是 ENGINE_SCOPE 或者是 GLOBAL_SCOPE，前者表示这个 ScriptEngine 独有的变量，后者则是所有 ScriptEngine 共有的变量。例如我们执行 engine.put(key, value) 方法之后，这时便会增加一个 ENGINE_SCOPE 的变量，如果要定义一个 GLOBAL_SCOPE 变量，可以通过 <code>setAttribute(key, value, ScriptContext.GLOBAL_SCOPE)</code> 来完成。</p><p>此外 ScriptContext 还提供了标准输入和输出的重定向功能，它可以用于指定脚本语言的输入和输出。 </p><br /><p><a name="N10172"><span class="atitle">在 JavaScript 中使用 Java 高级特性</span></a></p><p>这一部分不同于前述内容，将介绍 JavaScript引擎 —— Rhino 独有的特性。</p><p><a name="N1017C"><span class="smalltitle"><strong><font face="Arial">使用 Java 对象</font></strong></span></a></p><p>前面的部分已经介绍过如何在 JavaScript 中使用一个已经实例化的 Java 对象，那么如何在 JavaScript 中去实例化一个 Java 对象呢？在 Java 中所有 Class 是按照包名分层次存放的，而在 JavaScript 没有这一结构，Rhino 使用了一个巧妙的方法实现了对所有 Java 对象的引用。Rhino 中定义了一个全局变量—— Packages，并且它的所有元素也是全局变量，这个全局变量维护了 Java 类的层次结构。例如 Packages.java.io.File 引用了 Java 的 io 包中 File 对象。如此一来我们便可以在 JavaScript 中方便的使用 Java 对象了，new 和 Packages 都是可以被省略的：</p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">//The same as: var frame = new Packages.java.io.File("filename");
var frame = java.io.File("filename"); 
</pre></td></tr></tbody></table><br /><p>我们也可以像 Java 代码中一样把这个对象引用进来：</p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">importClass (java.io.File);
var file = File("filename");
</pre></td></tr></tbody></table><br /><p>如果要将整个包下的所有类都引用进来可以用 importPackage：</p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">importPackage(java.io);
</pre></td></tr></tbody></table><br /><p>如果只需要在特定代码段中引用某些包，可以使用 JavaImporter 搭配 JavaScript 的 with 关键字，如：</p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">var MyImport = JavaImporter(java.io.File);
with (MyImport) {
    var myFile = File("filename");
}
</pre></td></tr></tbody></table><br /><p>用户自定义的包也可以被引用进来，不过这时候 Packages 引用不能被省略：</p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">importPackage(Packages.tony);
var hello = HelloWorld();
hello.sayHello();
</pre></td></tr></tbody></table><br /><p>注意这里只有 public 的成员和方法才会在 JavaScript 中可见，例如对 hello.s 的引用将得到 undefined。下面简单介绍一些常用的特性：</p><p><a name="N101AE"><span class="smalltitle"><strong><font face="Arial">使用 Java 数组</font></strong></span></a></p><p>需要用反射的方式构造：</p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">var a = java.lang.reflect.Array.newInstance(java.lang.String, 5);
</pre></td></tr></tbody></table><br /><p>对于大部分情况，可以使用 JavaScript 的数组。将一个 JavaScript 的数组作为参数传递给一个 Java 方法时 Rhino 会做自动转换，将其转换为 Java 数组。</p><p><a name="N101C0"><span class="smalltitle"><strong><font face="Arial">实现一个 Java 接口</font></strong></span></a></p><p>除了上面提到的 Invocable 接口的 getInterface 方法外，我们也可以在脚本中用如下方式：</p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">//Define a JavaScript Object which has corresponding method
obj={max:function(a,b){return (a &gt; b) ?a:b;}}; 
//Pass this object to an Interface
maxImpl=com.tony.MaxMin(obj); 
//Invocation
print (maxImpl.max(1,2)); 
</pre></td></tr></tbody></table><br /><p>如果接口只有一个方法需要实现，那么在 JavaScript 中你可以传递一个函数作为参数：</p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">function func(){
    println("Hello World");
}
t=java.lang.Thread(func);
t.start();
</pre></td></tr></tbody></table><br /><p><a name="N101D7"><span class="smalltitle"><strong><font face="Arial">对于 JavaBean 的支持</font></strong></span></a></p><p>Rhino 对于 JavaBean 的 get 和 is 方法将会自动匹配，例如调用 hello.string，如果不存在 string 这个变量，Rhino 将会自动匹配这个实例的 isString 方法然后再去匹配 getString 方法，若这两个方法均不存在才会返回 undefined。</p><p><a name="N101E1"><span class="atitle">命令行工具 jrunscript</span></a></p><p>在 Mustang 的发行版本中还将包含一个脚本语言的的命令行工具，它能够解释所有当前 JDK 支持的脚本语言。同时它也是一个用来学习脚本语言很好的工具。你可以在<a href="http://java.sun.com/javase/6/docs/technotes/tools/share/jrunscript.html"><font color="#5c81a7">http://java.sun.com/javase/6/docs/technotes/tools/share/jrunscript.html</font></a>找到这一工具的详细介绍。</p><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="center"><br /></td><td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-lo-mustang-script/index.html?ca=j-t10#main"><b><font color="#5c81a7"></font></b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N101EF"><span class="atitle">结束语</span></a></p><p>脚本语言牺牲执行速度换来更高的生产率和灵活性。随着计算机性能的不断提高，硬件价格不断下降，可以预见的，脚本语言将获得更广泛的应用。在 JavaSE 的下一个版本中加入了对脚本语言的支持，无疑将使 Java 程序变得更加灵活，也会使 Java 程序员的工作更加有效率。</p><br /><br /><p><a name="resources"><span class="atitle">参考资料 </span></a></p><ul><li>JSR 233 主页<a href="http://www.jcp.org/en/jsr/detail?id=223"><font color="#5c81a7">http://www.jcp.org/en/jsr/detail?id=223</font></a> 你可以在这里找到关于这个 Request 的详细信息。<br /><br /></li><li>Mozilla Rhino 项目主页<a href="http://www.mozilla.org/rhino/"><font color="#5c81a7">http://www.mozilla.org/rhino/</font></a> 这里有完善的项目文档，并且可以下载到该项目的最新发行版本以及源代码。<br /><br /></li><li><a href="https://scripting.dev.java.net/"><font color="#5c81a7">https://scripting.dev.java.net/</font></a>是官方脚本引擎项目的主页，在这里可以查看到已经对哪些脚本引擎提供了支持。并且可以找到相应脚本引擎的网页链接。<br /><br /></li><li><a href="http://www.opensource.org/licenses/"><font color="#5c81a7">http://www.opensource.org/licenses/</font></a> 在这里可以找到关于 Open source license 的详细信息。<br /><br /></li><li><a href="http://www.junit.org/"><font color="#5c81a7">http://www.junit.org/</font></a> 是 Junit 的官方站点<br /><br /></li><li><a href="http://java.sun.com/javase/6/docs/"><font color="#5c81a7">http://java.sun.com/javase/6/docs/</font></a>是 Java SE6 的在线文档</li></ul><br /><br /><p><a name="author"><span class="atitle">关于作者</span></a></p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td colspan="3"><img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /></td></tr><tr valign="top" align="left"><td><p><img height="80" alt="Author photo" src="http://www.ibm.com/developerworks/cn/java/j-lo-mustang-script/img/tony.jpg" width="64" align="left" /></p></td><td><img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="4" /></td><td width="100%"><p>吴玥颢，目前就职于 IBM 中国开发中心 Harmony 开发团队。 除了对 Java 和脚本语言的热爱之外，他的兴趣还包括哲学、神话、历史与篮球。此外他还是个电脑游戏高手。您可以</p></td></tr></tbody></table><img src ="http://www.blogjava.net/liaojiyong/aggbug/105302.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-03-21 16:21 <a href="http://www.blogjava.net/liaojiyong/archive/2007/03/21/105302.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的内存泄漏( 转)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/03/21/105223.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 21 Mar 2007 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/03/21/105223.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/105223.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/03/21/105223.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/105223.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/105223.html</trackback:ping><description><![CDATA[
		<table style="TABLE-LAYOUT: fixed">
				<tbody>
						<tr>
								<td>
										<div class="cnt">
												<p>
														<a href="http://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/">http://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/</a>
												</p>
												<p>级别: 初级</p>
												<p>
														<a href="http://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/#author">
																<font color="#5c81a7">欧阳辰</font>
														</a>, <br /><a href="http://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/#author"><font color="#5c81a7">周欣</font></a>, <br /></p>
												<p>2002 年 10 月 21 日</p>
												<blockquote>Java的一个重要优点就是通过垃圾收集器(Garbage Collection，GC)自动管理内存的回收，程序员不需要通过调用函数来释放内存。因此，很多程序员认为Java不存在内存泄漏问题，或者认为即使有内存泄漏也不是程序的责任，而是GC或JVM的问题。其实，这种想法是不正确的，因为Java也存在内存泄露，但它的表现与C++不同。</blockquote>
												<p>
														<a name="1">
																<span class="atitle">
																		<font color="#000000" size="4">问题的提出</font>
																</span>
														</a>
												</p>
												<p>
														<font size="4">
														</font>
												</p>
												<p>Java的一个重要优点就是通过垃圾收集器(Garbage Collection，GC)自动管理内存的回收，程序员不需要通过调用函数来释放内存。因此，很多程序员认为Java不存在内存泄漏问题，或者认为即使有内存泄漏也不是程序的责任，而是GC或JVM的问题。其实，这种想法是不正确的，因为Java也存在内存泄露，但它的表现与C++不同。</p>
												<p>随着越来越多的服务器程序采用Java技术，例如JSP，Servlet， EJB等，服务器程序往往长期运行。另外，在很多嵌入式系统中，内存的总量非常有限。内存泄露问题也就变得十分关键，即使每次运行少量泄漏，长期运行之后，系统也是面临崩溃的危险。</p>
												<br />
												<table cellspacing="0" cellpadding="0" width="100%" border="0">
														<tbody>
																<tr>
																		<td>
																				<img height="1" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																				<br />
																				<img height="6" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																		</td>
																</tr>
														</tbody>
												</table>
												<table class="no-print" cellspacing="0" cellpadding="0" align="right">
														<tbody>
																<tr align="right">
																		<td>
																				<br />
																		</td>
																</tr>
														</tbody>
												</table>
												<br />
												<br />
												<p>
														<a name="2">
																<span class="atitle">
																		<font color="#000000" size="4">Java是如何管理内存</font>
																</span>
														</a>
												</p>
												<p>
														<font size="4">
														</font>
												</p>
												<p>为了判断Java中是否有内存泄露，我们首先必须了解Java是如何管理内存的。Java的内存管理就是对象的分配和释放问题。在Java中，程序员需要通过关键字new为每个对象申请内存空间 (基本类型除外)，所有的对象都在堆 (Heap)中分配空间。另外，对象的释放是由GC决定和执行的。在Java中，内存的分配是由程序完成的，而内存的释放是有GC完成的，这种收支两条线的方法确实简化了程序员的工作。但同时，它也加重了JVM的工作。这也是Java程序运行速度较慢的原因之一。因为，GC为了能够正确释放对象，GC必须监控每一个对象的运行状态，包括对象的申请、引用、被引用、赋值等，GC都需要进行监控。</p>
												<p>监视对象状态是为了更加准确地、及时地释放对象，而释放对象的根本原则就是该对象不再被引用。</p>
												<p>为了更好理解GC的工作原理，我们可以将对象考虑为有向图的顶点，将引用关系考虑为图的有向边，有向边从引用者指向被引对象。另外，每个线程对象可以作为一个图的起始顶点，例如大多程序从main进程开始执行，那么该图就是以main进程顶点开始的一棵根树。在这个有向图中，根顶点可达的对象都是有效对象，GC将不回收这些对象。如果某个对象 (连通子图)与这个根顶点不可达(注意，该图为有向图)，那么我们认为这个(这些)对象不再被引用，可以被GC回收。</p>
												<p>以下，我们举一个例子说明如何用有向图表示内存管理。对于程序的每一个时刻，我们都有一个有向图表示JVM的内存分配情况。以下右图，就是左边程序运行到第6行的示意图。</p>
												<br />
												<img height="201" alt="图1" src="http://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/1.gif" width="582" />
												<br />
												<p>Java使用有向图的方式进行内存管理，可以消除引用循环的问题，例如有三个对象，相互引用，只要它们和根进程不可达的，那么GC也是可以回收它们的。这种方式的优点是管理内存的精度很高，但是效率较低。另外一种常用的内存管理技术是使用计数器，例如COM模型采用计数器方式管理构件，它与有向图相比，精度行低(很难处理循环引用的问题)，但执行效率很高。</p>
												<br />
												<table cellspacing="0" cellpadding="0" width="100%" border="0">
														<tbody>
																<tr>
																		<td>
																				<img height="1" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
																				<br />
																				<img height="6" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
																		</td>
																</tr>
														</tbody>
												</table>
												<table class="no-print" cellspacing="0" cellpadding="0" align="right">
														<tbody>
																<tr align="right">
																		<td>
																				<br />
																		</td>
																</tr>
														</tbody>
												</table>
												<br />
												<br />
												<p>
														<a name="3">
																<span class="atitle">
																		<font color="#000000" size="4">什么是Java中的内存泄露</font>
																</span>
														</a>
												</p>
												<p>
														<font size="4">
														</font>
												</p>
												<p>下面，我们就可以描述什么是内存泄漏。在Java中，内存泄漏就是存在一些被分配的对象，这些对象有下面两个特点，首先，这些对象是可达的，即在有向图中，存在通路可以与其相连；其次，这些对象是无用的，即程序以后不会再使用这些对象。如果对象满足这两个条件，这些对象就可以判定为Java中的内存泄漏，这些对象不会被GC所回收，然而它却占用内存。</p>
												<p>在C++中，内存泄漏的范围更大一些。有些对象被分配了内存空间，然后却不可达，由于C++中没有GC，这些内存将永远收不回来。在Java中，这些不可达的对象都由GC负责回收，因此程序员不需要考虑这部分的内存泄露。</p>
												<p>通过分析，我们得知，对于C++，程序员需要自己管理边和顶点，而对于Java程序员只需要管理边就可以了(不需要管理顶点的释放)。通过这种方式，Java提高了编程的效率。</p>
												<br />
												<img height="231" alt="图2" src="http://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/2.gif" width="507" />
												<br />
												<p>因此，通过以上分析，我们知道在Java中也有内存泄漏，但范围比C++要小一些。因为Java从语言上保证，任何对象都是可达的，所有的不可达对象都由GC管理。</p>
												<p>对于程序员来说，GC基本是透明的，不可见的。虽然，我们只有几个函数可以访问GC，例如运行GC的函数System.gc()，但是根据Java语言规范定义， 该函数不保证JVM的垃圾收集器一定会执行。因为，不同的JVM实现者可能使用不同的算法管理GC。通常，GC的线程的优先级别较低。JVM调用GC的策略也有很多种，有的是内存使用到达一定程度时，GC才开始工作，也有定时执行的，有的是平缓执行GC，有的是中断式执行GC。但通常来说，我们不需要关心这些。除非在一些特定的场合，GC的执行影响应用程序的性能，例如对于基于Web的实时系统，如网络游戏等，用户不希望GC突然中断应用程序执行而进行垃圾回收，那么我们需要调整GC的参数，让GC能够通过平缓的方式释放内存，例如将垃圾回收分解为一系列的小步骤执行，Sun提供的HotSpot JVM就支持这一特性。</p>
												<p>下面给出了一个简单的内存泄露的例子。在这个例子中，我们循环申请Object对象，并将所申请的对象放入一个Vector中，如果我们仅仅释放引用本身，那么Vector仍然引用该对象，所以这个对象对GC来说是不可回收的。因此，如果对象加入到Vector后，还必须从Vector中删除，最简单的方法就是将Vector对象设置为null。</p>
												<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
														<tbody>
																<tr>
																		<td>
																				<pre>
																						<code class="section">
																								<font face="Lucida Console">Vector v=new Vector(10);
for (int i=1;i&lt;100; i++)
{
 Object o=new Object();
 v.add(o);
 o=null; 
}</font>
																						</code>
																				</pre>
																		</td>
																</tr>
														</tbody>
												</table>
												<br />//此时，所有的Object对象都没有被释放，因为变量v引用这些对象。 <br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /><img height="6" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td></tr></tbody></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td><img height="4" src="http://www.ibm.com/i/c.gif" width="100%" /><br /></td></tr></tbody></table><br /><br /><p><a name="4"><span class="atitle"><font color="#000000" size="4">如何检测内存泄漏</font></span></a></p><p><font size="4"></font></p><p>最后一个重要的问题，就是如何检测Java的内存泄漏。目前，我们通常使用一些工具来检查Java程序的内存泄漏问题。市场上已有几种专业检查Java内存泄漏的工具，它们的基本工作原理大同小异，都是通过监测Java程序运行时，所有对象的申请、释放等动作，将内存管理的所有信息进行统计、分析、可视化。开发人员将根据这些信息判断程序是否有内存泄漏问题。这些工具包括Optimizeit Profiler，JProbe Profiler，JinSight , Rational 公司的Purify等。</p><p>下面，我们将简单介绍Optimizeit的基本功能和工作原理。</p><p>Optimizeit Profiler版本4.11支持Application，Applet，Servlet和Romote Application四类应用，并且可以支持大多数类型的JVM，包括SUN JDK系列，IBM的JDK系列，和Jbuilder的JVM等。并且，该软件是由Java编写，因此它支持多种操作系统。Optimizeit系列还包括Thread Debugger和Code Coverage两个工具，分别用于监测运行时的线程状态和代码覆盖面。</p><p>当设置好所有的参数了，我们就可以在OptimizeIt环境下运行被测程序，在程序运行过程中，Optimizeit可以监视内存的使用曲线(如下图)，包括JVM申请的堆(heap)的大小，和实际使用的内存大小。另外，在运行过程中，我们可以随时暂停程序的运行，甚至强行调用GC，让GC进行内存回收。通过内存使用曲线，我们可以整体了解程序使用内存的情况。这种监测对于长期运行的应用程序非常有必要，也很容易发现内存泄露。</p><br /><img height="354" alt="图3" src="http://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/3.gif" width="521" /><br /><p>在运行过程中，我们还可以从不同视角观查内存的使用情况，Optimizeit提供了四种方式：</p><ul><li>堆视角。 这是一个全面的视角，我们可以了解堆中的所有的对象信息(数量和种类)，并进行统计、排序，过滤。了解相关对象的变化情况。 
</li><li>方法视角。通过方法视角，我们可以得知每一种类的对象，都分配在哪些方法中，以及它们的数量。 
</li><li>对象视角。给定一个对象，通过对象视角，我们可以显示它的所有出引用和入引用对象，我们可以了解这个对象的所有引用关系。 
</li><li>引用图。 给定一个根，通过引用图，我们可以显示从该顶点出发的所有出引用。 </li></ul><p>在运行过程中，我们可以随时观察内存的使用情况，通过这种方式，我们可以很快找到那些长期不被释放，并且不再使用的对象。我们通过检查这些对象的生存周期，确认其是否为内存泄露。在实践当中，寻找内存泄露是一件非常麻烦的事情，它需要程序员对整个程序的代码比较清楚，并且需要丰富的调试经验，但是这个过程对于很多关键的Java程序都是十分重要的。</p><p>综上所述，Java也存在内存泄露问题，其原因主要是一些对象虽然不再被使用，但它们仍然被引用。为了解决这些问题，我们可以通过软件工具来检查内存泄露，检查的主要原理就是暴露出所有堆中的对象，让程序员寻找那些无用但仍被引用的对象。</p><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /><img height="6" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td></tr></tbody></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td><img height="4" src="http://www.ibm.com/i/c.gif" width="100%" /><br /></td></tr></tbody></table><br /><br /><p><a name="resources"><span class="atitle"><font color="#000000" size="4">参考资料 </font></span></a></p><p>文章:</p><p>Jim Patrick, Handling memory leaks in Java programs,</p><p>http://www.ibm.com/developerworks/library/j-leaks/index.html</p><p>Ed Lycklama, Does Java Technology Have Memory Leaks?</p><p><a href="http://www.klgroup.com/javaone"><font color="#5c81a7">http://www.klgroup.com/javaone</font></a></p><p>Sun,The Java HotSpot Virtual Machine, Technical White Paper</p><p></p><p>软件：</p><p>Sitraka Software's Jprobe <a href="http://www.sitraka.com/"><font color="#5c81a7">http://www.sitraka.com</font></a></p><p>Boland Software's Optimizeit <a href="http://optimizeit/"><font color="#5c81a7">http://optimizeit</font></a></p><p>IBM alphaWorks' Jinsight <a href="http://www.alphaworks.ibm.com/tech/jinsight"><font color="#5c81a7">http://www.alphaworks.ibm.com/tech/jinsight</font></a></p><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /><img height="6" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td></tr></tbody></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tbody><tr align="right"><td><br /></td></tr></tbody></table><br /><br /><p><a name="author"><span class="atitle"><font color="#000000" size="4">作者简介</font></span></a></p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td colspan="3"><font size="4"><img height="5" src="http://www.ibm.com/i/c.gif" width="100%" /></font></td></tr><tr valign="top" align="left"><td><p><font size="4"></font></p></td><td><font size="4"><img height="5" src="http://www.ibm.com/i/c.gif" width="4" /></font></td><td width="100%"><p>欧阳辰，北京大学计算机硕士毕业，98年起开始研究基于java的软件开发、测试，参与开发、测试过多个基于Java的应用程序和Web服务项目。 </p></td></tr></tbody></table><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td colspan="3"><img height="5" src="http://www.ibm.com/i/c.gif" width="100%" /></td></tr><tr valign="top" align="left"><td><p></p></td><td><img height="5" src="http://www.ibm.com/i/c.gif" width="4" /></td><td width="100%"><p>周欣，北京大学计算机系在读博士生，主要研究方向：程序理解、逆向工程及软件度量，联系方式 <a href="http://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/zhouxin@sei.pku.edu.cn"><font color="#5c81a7">zhouxin@sei.pku.edu.cn</font></a></p></td></tr></tbody></table></div>
								</td>
						</tr>
				</tbody>
		</table>
		<div class="opt"> </div>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/105223.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-03-21 11:29 <a href="http://www.blogjava.net/liaojiyong/archive/2007/03/21/105223.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实现字符串的反转　java</title><link>http://www.blogjava.net/liaojiyong/archive/2007/03/20/105059.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Tue, 20 Mar 2007 09:58:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/03/20/105059.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/105059.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/03/20/105059.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/105059.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/105059.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">package</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">liaojiyong.net.blogjava;</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">public</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">class</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">ReverseString {</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 1">    </span>
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">static</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">StringBuffer </span>
				<i>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">sb</span>
				</i>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">= </span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">StringBuffer();</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 1">    </span>ReverseString(String s) {</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">for</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">(</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">int</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">i = s.length() - 1; i &gt;= 0; i--)</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 3">           </span>
				</span>
				<i>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">sb</span>
				</i>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">.append(s.charAt(i));</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>System.</span>
				<i>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">out</span>
				</i>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">.println(</span>
				<i>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">sb</span>
				</i>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 1">    </span>}</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 1">    </span>
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">public</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">static</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">void</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">main(String[] args) {</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">new</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">ReverseString(</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"abcdefgsdjoiwedfsdlksd321"</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 1">    </span>}</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">}</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/105059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-03-20 17:58 <a href="http://www.blogjava.net/liaojiyong/archive/2007/03/20/105059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计一个数据结构来存储这种超大型数字并且实现加减</title><link>http://www.blogjava.net/liaojiyong/archive/2007/03/20/104960.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Tue, 20 Mar 2007 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/03/20/104960.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/104960.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/03/20/104960.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/104960.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/104960.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000">&nbsp;liaojiyong.net.blogjava;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_59_2368_Open_Image onclick="this.style.display='none'; Codehighlighter1_59_2368_Open_Text.style.display='none'; Codehighlighter1_59_2368_Closed_Image.style.display='inline'; Codehighlighter1_59_2368_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_59_2368_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_59_2368_Closed_Text.style.display='none'; Codehighlighter1_59_2368_Open_Image.style.display='inline'; Codehighlighter1_59_2368_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;BigInt&nbsp;</span><span id=Codehighlighter1_59_2368_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_59_2368_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;[]&nbsp;ArrOne&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;[</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">];&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;[]&nbsp;ArrOne2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;[</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">];&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;[]&nbsp;ArrOne3&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;[</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">];&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;[]&nbsp;ArrOne4&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;[</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">];&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;StringBuffer&nbsp;intString&nbsp;;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;token&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_388_1095_Open_Image onclick="this.style.display='none'; Codehighlighter1_388_1095_Open_Text.style.display='none'; Codehighlighter1_388_1095_Closed_Image.style.display='inline'; Codehighlighter1_388_1095_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_388_1095_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_388_1095_Closed_Text.style.display='none'; Codehighlighter1_388_1095_Open_Image.style.display='inline'; Codehighlighter1_388_1095_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;StringBuffer&nbsp;Arr(&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;[]&nbsp;ArrOne2)&nbsp;</span><span id=Codehighlighter1_388_1095_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_388_1095_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;intString&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;StringBuffer();&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;token1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_513_946_Open_Image onclick="this.style.display='none'; Codehighlighter1_513_946_Open_Text.style.display='none'; Codehighlighter1_513_946_Closed_Image.style.display='inline'; Codehighlighter1_513_946_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_513_946_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_513_946_Closed_Text.style.display='none'; Codehighlighter1_513_946_Open_Image.style.display='inline'; Codehighlighter1_513_946_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ArrOne2.&nbsp;length&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">)&nbsp;</span><span id=Codehighlighter1_513_946_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_513_946_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_549_592_Open_Image onclick="this.style.display='none'; Codehighlighter1_549_592_Open_Text.style.display='none'; Codehighlighter1_549_592_Closed_Image.style.display='inline'; Codehighlighter1_549_592_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_549_592_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_549_592_Closed_Text.style.display='none'; Codehighlighter1_549_592_Open_Image.style.display='inline'; Codehighlighter1_549_592_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(ArrOne2[i]&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;</span><span id=Codehighlighter1_549_592_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_549_592_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;token1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_624_935_Open_Image onclick="this.style.display='none'; Codehighlighter1_624_935_Open_Text.style.display='none'; Codehighlighter1_624_935_Closed_Image.style.display='inline'; Codehighlighter1_624_935_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_624_935_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_624_935_Closed_Text.style.display='none'; Codehighlighter1_624_935_Open_Image.style.display='inline'; Codehighlighter1_624_935_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(token1&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;</span><span id=Codehighlighter1_624_935_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_624_935_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;ss&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;String.valueOf(&nbsp;ArrOne2&nbsp;[i]).length();&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_722_866_Open_Image onclick="this.style.display='none'; Codehighlighter1_722_866_Open_Text.style.display='none'; Codehighlighter1_722_866_Closed_Image.style.display='inline'; Codehighlighter1_722_866_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_722_866_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_722_866_Closed_Text.style.display='none'; Codehighlighter1_722_866_Open_Image.style.display='inline'; Codehighlighter1_722_866_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(ss&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;</span><span id=Codehighlighter1_722_866_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_722_866_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_777_848_Open_Image onclick="this.style.display='none'; Codehighlighter1_777_848_Open_Text.style.display='none'; Codehighlighter1_777_848_Closed_Image.style.display='inline'; Codehighlighter1_777_848_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_777_848_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_777_848_Closed_Text.style.display='none'; Codehighlighter1_777_848_Open_Image.style.display='inline'; Codehighlighter1_777_848_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;mm&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;mm&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;ss;&nbsp;mm</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;</span><span id=Codehighlighter1_777_848_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_777_848_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;intString&nbsp;.append(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;);&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;intString&nbsp;.append(ArrOne2[i]&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;);&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_1009_1059_Open_Image onclick="this.style.display='none'; Codehighlighter1_1009_1059_Open_Text.style.display='none'; Codehighlighter1_1009_1059_Closed_Image.style.display='inline'; Codehighlighter1_1009_1059_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1009_1059_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1009_1059_Closed_Text.style.display='none'; Codehighlighter1_1009_1059_Open_Image.style.display='inline'; Codehighlighter1_1009_1059_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;intString&nbsp;.equals(&nbsp;</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">&nbsp;)&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;intString&nbsp;)&nbsp;</span><span id=Codehighlighter1_1009_1059_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_1009_1059_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;intString&nbsp;.append(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;);&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;intString&nbsp;;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_1174_1923_Open_Image onclick="this.style.display='none'; Codehighlighter1_1174_1923_Open_Text.style.display='none'; Codehighlighter1_1174_1923_Closed_Image.style.display='inline'; Codehighlighter1_1174_1923_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1174_1923_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1174_1923_Closed_Text.style.display='none'; Codehighlighter1_1174_1923_Open_Image.style.display='inline'; Codehighlighter1_1174_1923_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;StringBuffer&nbsp;ArrAdd(&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;[]&nbsp;ArrOne3,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;[]&nbsp;ArrOne4)&nbsp;</span><span id=Codehighlighter1_1174_1923_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_1174_1923_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;intString&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;StringBuffer();&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;[]&nbsp;arrAddResult&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;[</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">];&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_1317_1880_Open_Image onclick="this.style.display='none'; Codehighlighter1_1317_1880_Open_Text.style.display='none'; Codehighlighter1_1317_1880_Closed_Image.style.display='inline'; Codehighlighter1_1317_1880_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1317_1880_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1317_1880_Closed_Text.style.display='none'; Codehighlighter1_1317_1880_Open_Image.style.display='inline'; Codehighlighter1_1317_1880_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;ArrOne3.&nbsp;length&nbsp;;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;</span><span id=Codehighlighter1_1317_1880_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_1317_1880_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_1390_1501_Open_Image onclick="this.style.display='none'; Codehighlighter1_1390_1501_Open_Text.style.display='none'; Codehighlighter1_1390_1501_Closed_Image.style.display='inline'; Codehighlighter1_1390_1501_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1390_1501_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1390_1501_Closed_Text.style.display='none'; Codehighlighter1_1390_1501_Open_Image.style.display='inline'; Codehighlighter1_1390_1501_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(ArrOne3[i]&nbsp;</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1000000000</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;ArrOne4[i]&nbsp;</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1000000000</span><span style="COLOR: #000000">)&nbsp;</span><span id=Codehighlighter1_1390_1501_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_1390_1501_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.&nbsp;out&nbsp;.println(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Data&nbsp;Out&nbsp;Out&nbsp;Of&nbsp;Range!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;);&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">&nbsp;;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;((ArrOne3[i]&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;(ArrOne4[i]&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_1629_1752_Open_Image onclick="this.style.display='none'; Codehighlighter1_1629_1752_Open_Text.style.display='none'; Codehighlighter1_1629_1752_Closed_Image.style.display='inline'; Codehighlighter1_1629_1752_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1629_1752_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1629_1752_Closed_Text.style.display='none'; Codehighlighter1_1629_1752_Open_Image.style.display='inline'; Codehighlighter1_1629_1752_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;(ArrOne3[i]&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;ArrOne4[i]&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;token&nbsp;</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1000000000</span><span style="COLOR: #000000">))&nbsp;</span><span id=Codehighlighter1_1629_1752_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_1629_1752_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arrAddResult[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ArrOne3[i]&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1000000000</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;ArrOne4[i]&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;token&nbsp;;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;token&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_1759_1869_Open_Image onclick="this.style.display='none'; Codehighlighter1_1759_1869_Open_Text.style.display='none'; Codehighlighter1_1759_1869_Closed_Image.style.display='inline'; Codehighlighter1_1759_1869_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1759_1869_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1759_1869_Closed_Text.style.display='none'; Codehighlighter1_1759_1869_Open_Image.style.display='inline'; Codehighlighter1_1759_1869_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_1759_1869_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_1759_1869_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arrAddResult[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ArrOne3[i]&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;ArrOne4[i]&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;token&nbsp;;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;token&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;Arr(arrAddResult);&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_1974_2360_Open_Image onclick="this.style.display='none'; Codehighlighter1_1974_2360_Open_Text.style.display='none'; Codehighlighter1_1974_2360_Closed_Image.style.display='inline'; Codehighlighter1_1974_2360_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1974_2360_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1974_2360_Closed_Text.style.display='none'; Codehighlighter1_1974_2360_Open_Image.style.display='inline'; Codehighlighter1_1974_2360_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id=Codehighlighter1_1974_2360_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_1974_2360_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrOne3&nbsp;[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">11</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrOne3&nbsp;[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">11111111</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrOne3&nbsp;[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">111111111</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrOne4&nbsp;[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1111</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrOne4&nbsp;[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">11</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrOne4&nbsp;[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">111111111</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.&nbsp;out&nbsp;.println(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Arr&nbsp;=&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;Arr(&nbsp;ArrOne3&nbsp;).toString());&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.&nbsp;out&nbsp;.println(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ArrAdd(ArrOne3,&nbsp;ArrOne4)&nbsp;=&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;ArrAdd(&nbsp;ArrOne3&nbsp;,&nbsp;ArrOne4&nbsp;).toString());&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><br><br>减法和加法差不多，所以就不写了<br>Arr = 111111111 011111111 000000011 <br>ArrAdd(ArrOne3, ArrOne4) = 222222222 011111122 000001122 <br>&nbsp;</o:p> </span></p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/104960.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-03-20 14:24 <a href="http://www.blogjava.net/liaojiyong/archive/2007/03/20/104960.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>冒泡排序法 Java</title><link>http://www.blogjava.net/liaojiyong/archive/2007/03/19/104738.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Mon, 19 Mar 2007 07:01:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/03/19/104738.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/104738.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/03/19/104738.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/104738.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/104738.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">package</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">liaojiyong.net.blogjava;</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">/**</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-spacerun: yes"> </span>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">*</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f9fbf; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">@author</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">liaojy</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-spacerun: yes"> </span>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">*</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-spacerun: yes"> </span>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">*/</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">public</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">class</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">BubbleSort {</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 1">    </span>
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">static</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">int</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">[] </span>
				<i>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">arr</span>
				</i>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">= { 1, 2, 6, 3, 11, 92, 12, 5 };</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 1">    </span>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">/**</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 1">    </span>
						<span style="mso-spacerun: yes"> </span>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">*</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f9fbf; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">@param</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">args</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 1">    </span>
						<span style="mso-spacerun: yes"> </span>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f5fbf; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">*/</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 1">    </span>
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">public</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">static</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">void</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">main(String[] args) {</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f5f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">// </span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f9fbf; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">TODO</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #3f7f5f; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">Auto-generated method stub</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>System.</span>
				<i>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">out</span>
				</i>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">.<span style="BACKGROUND: silver; mso-highlight: silver">println</span>(</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"Before Sort..."</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">for</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">(</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">int</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">temp1 : </span>
				<i>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">arr</span>
				</i>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">) {</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 3">           </span>System.</span>
				<i>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">out</span>
				</i>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">.print(temp1 + </span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"<span style="mso-spacerun: yes">  </span>"</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>}</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>System.</span>
				<i>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">out</span>
				</i>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">.println();</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>
						<i>sort</i>(</span>
				<i>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">arr</span>
				</i>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>System.</span>
				<i>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">out</span>
				</i>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">.<span style="BACKGROUND: silver; mso-highlight: silver">println</span>(</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"After Sort..."</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">for</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">(</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">int</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">temp2 : </span>
				<i>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">arr</span>
				</i>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">) {</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 3">           </span>System.</span>
				<i>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">out</span>
				</i>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">.print(temp2 + </span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #2a00ff; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">"<span style="mso-spacerun: yes">  </span>"</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">);</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>}</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>System.</span>
				<i>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">out</span>
				</i>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">.println();</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 1">    </span>}</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 1">    </span>
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">public</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">static</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">void</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">sort(</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">int</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">[] a) {</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">for</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">(</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">int</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">i = 0; i &lt; a.</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">length</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">; i++) {</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 3">           </span>
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">for</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">(</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">int</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">j = i + 1; j &lt; a.</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">length</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">; j++) {</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 4">              </span>
				</span>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #7f0055; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">if</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">(a[i] &gt; a[j]) {</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 5">                  </span>a[i] = a[i] + a[j];</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 5">                  </span>a[j] = a[i] - a[j];</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 5">                  </span>a[i] = a[i] - a[j];</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 4">              </span>}</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 3">           </span>}</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 2">       </span>}</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<span style="mso-tab-count: 1">    </span>}</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">}</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> <br /></o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<br />Before Sort...</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">1<span style="mso-spacerun: yes">  </span>2<span style="mso-spacerun: yes">  </span>6<span style="mso-spacerun: yes">  </span>3<span style="mso-spacerun: yes">  </span>11<span style="mso-spacerun: yes">  </span>92<span style="mso-spacerun: yes">  </span>12<span style="mso-spacerun: yes">  </span>5<span style="mso-spacerun: yes">  </span></span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">After Sort...</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">1<span style="mso-spacerun: yes">  </span>2<span style="mso-spacerun: yes">  </span>3<span style="mso-spacerun: yes">  </span>5<span style="mso-spacerun: yes">  </span>6<span style="mso-spacerun: yes">  </span>11<span style="mso-spacerun: yes">  </span>12<span style="mso-spacerun: yes">  </span>92<span style="mso-spacerun: yes">  </span></span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
		</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/104738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-03-19 15:01 <a href="http://www.blogjava.net/liaojiyong/archive/2007/03/19/104738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java对象序列化(转) </title><link>http://www.blogjava.net/liaojiyong/archive/2007/03/19/104650.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Mon, 19 Mar 2007 01:18:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/03/19/104650.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/104650.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/03/19/104650.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/104650.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/104650.html</trackback:ping><description><![CDATA[所谓对象序列化就是将对象的状态转换成字节流，以后可以通过这些值再生成相同状态的对象。这个过程也可以通过网络实现，可以先在Windows机器上创建一个对象，对其序列化，然后通过网络发给一台Unix机器，然后在那里准确无误地重新"装配"。像RMI、Socket、JMS、EJB它们中的一种，彼此为什么能够传递Java对象，当然都是对象序列化机制的功劳。   
<p>java对象序列化机制一般来讲有两种用途：<br />       1.Java的JavaBeans: Bean的状态信息通常是在设计时配置的,Bean的状态信息必须被存起来，以便当程序运行时能恢复这些状态信息,这需要将对象的状态保存到文件中，而后能够通过读入对象状态来重新构造对象，恢复程序状态。<br />       2.RMI允许象在本机上一样操作远程机器上的对象;或使用套接字在网络上传送对象的程序来说，这些都是需要实现serializaiton机制的。<br />       <br />       我们通过让类实现java.io.Serializable 接口可以将类序列化。这个接口是一个制造者（marker）接口。也就是说，对于要实现它的类来说，该接口不需要实现任何方法。它主要用来通知Java虚拟机(JVM)，需要将一个对象序列化。<br />       对于这个，有几点我们需要明确：<br />       (1).并非所有类都可以序列化，在cmd下，我们输入serialver java.net.Socket，可以得到socket是否可序列化的信息，实际上socket是不可序列化的。<br />       (2).java有很多基础类已经实现了serializable接口，比如string,vector等。但是比如hashtable就没有实现serializable接口。<br />       将对象读出或者写入流的主要类有两个: ObjectOutputStream与ObjectInputStream 。ObjectOutputStream 提供用来将对象写入输出流的writeObject方法， ObjectInputStream提供从输入流中读出对象的readObject方法。使用这些方法的对象必须已经被序列化的。也就是说，必须已经实现Serializable接口。如果你想writeobject一个hashtable对象，那么，会得到一个异常。<br /><br /><br /> 序列化的过程就是对象写入字节流和从字节流中读取对象。将对象状态转换成字节流之后，可以用java.io包中的各种字节流类将其保存到文件中，管道到另一线程中或通过网络连接将对象数据发送到另一主机。对象序列化功能非常简单、强大，在RMI、Socket、JMS、EJB都有应用。对象序列化问题在网络编程中并不是最激动人心的课题，但却相当重要，具有许多实用意义。</p><ol><li>对象序列化可以实现分布式对象。主要应用例如：RMI要利用对象序列化运行远程主机上的服务，就像在本地机上运行对象时一样。 
</li><li>java对象序列化不仅保留一个对象的数据，而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中，可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的“深复制”，即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。</li></ol><p>     java序列化比较简单，通常不需要编写保存和恢复对象状态的定制代码。实现java.io.Serializable接口的类对象可以转换成字节流或从字节流恢复，不需要在类中增加任何代码。只有极少数情况下才需要定制代码保存或恢复对象状态。这里要注意：不是每个类都可序列化，有些类是不能序列化的，例如涉及线程的类与特定JVM有非常复杂的关系。</p><h3>序列化机制：</h3><p><br />     序列化分为两大部分：<strong>序列化</strong>和<strong>反序列化</strong>。序列化是这个过程的第一部分，将数据分解成字节流，以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示，有时还要恢复数据。恢复数据要求有恢复数据的对象实例。ObjectOutputStream中的序列化过程与字节流连接，包括对象类型和版本信息。反序列化时，JVM用头信息生成对象实例，然后将对象字节流中的数据复制到对象数据成员中。下面我们分两大部分来阐述：</p><h3>处理对象流：</h3><p>（序列化过程和反序列化过程）<br /><br />    java.io包有两个序列化对象的类。ObjectOutputStream负责将对象写入字节流，ObjectInputStream从字节流重构对象。<br />    我们先了解ObjectOutputStream类吧。ObjectOutputStream类扩展DataOutput接口。<br />writeObject()方法是最重要的方法，用于对象序列化。如果对象包含其他对象的引用，则writeObject()方法递归序列化这些对象。每个ObjectOutputStream维护序列化的对象引用表，防止发送同一对象的多个拷贝。（这点很重要）由于writeObject()可以序列化整组交叉引用的对象，因此同一ObjectOutputStream实例可能不小心被请求序列化同一对象。这时，进行反引用序列化，而不是再次写入对象字节流。<br />下面，让我们从例子中来了解ObjectOutputStream这个类吧。<br /></p><p class="codeStyle"> </p><ol><li><em><font color="#339900">// 序列化 today's date 到一个文件中.</font></em></li><li>    <font color="#ff0000">FileOutputStream</font> f = <strong><font color="#0000ff">new</font></strong> <font color="#ff0000">FileOutputStream</font>(<font color="#ff33ff">"tmp"</font>); 
</li><li>    <font color="#ff0000">ObjectOutputStream</font> s = <strong><font color="#0000ff">new</font></strong> <font color="#ff0000">ObjectOutputStream</font>(f); 
</li><li>    s.writeObject(<font color="#ff33ff">"Today"</font>); 
</li><li>    s.writeObject(<strong><font color="#0000ff">new</font></strong> <font color="#ff0000">Date</font>()); 
</li><li>    s.flush(); </li></ol><p>     现在，让我们来了解ObjectInputStream这个类。它与ObjectOutputStream相似。它扩展DataInput接口。ObjectInputStream中的方法镜像DataInputStream中读取Java基本数据类型的公开方法。readObject()方法从字节流中反序列化对象。每次调用readObject()方法都返回流中下一个Object。对象字节流并不传输类的字节码，而是包括类名及其签名。readObject()收到对象时，JVM装入头中指定的类。如果找不到这个类，则readObject()抛出ClassNotFoundException,如果需要传输对象数据和字节码，则可以用RMI框架。ObjectInputStream的其余方法用于定制反序列化过程。<br />例子如下：<br /></p><p class="codeStyle"> </p><ol><li><em><font color="#339900">//从文件中反序列化 string 对象和 date 对象</font></em></li><li>    <font color="#ff0000">FileInputStream</font> in = <strong><font color="#0000ff">new</font></strong> <font color="#ff0000">FileInputStream</font>(<font color="#ff33ff">"tmp"</font>); 
</li><li>    <font color="#ff0000">ObjectInputStream</font> s = <strong><font color="#0000ff">new</font></strong> <font color="#ff0000">ObjectInputStream</font>(in); 
</li><li>    <strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink" color="#000080"><u>String</u></font></a></strong> today = (<strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink" color="#000080"><u>String</u></font></a></strong>)s.readObject(); 
</li><li>    <font color="#ff0000">Date</font> date = (<font color="#ff0000">Date</font>)s.readObject(); </li></ol><h3>定制序列化过程:</h3><p><br /><br />    序列化通常可以自动完成，但有时可能要对这个过程进行控制。java可以将类声明为serializable，但仍可手工控制声明为static或transient的数据成员。<br />例子：一个非常简单的序列化类。<br /></p><p class="codeStyle"> </p><ol><li><strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">class</font></strong> simpleSerializableClass <strong><font color="#0000ff">implements</font></strong> <font color="#ff0000">Serializable</font>{ 
</li><li>    <strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/String.java.html" target="_blank"><font class="classLink" color="#000080"><u>String</u></font></a></strong> sToday=<font color="#ff33ff">"Today:"</font>; 
</li><li>    <strong><font color="#0000ff">transient</font></strong> <font color="#ff0000">Date</font> dtToday=<strong><font color="#0000ff">new</font></strong> <font color="#ff0000">Date</font>(); 
</li><li>} </li></ol><p> </p><p><br />    序列化时，类的所有数据成员应可序列化除了声明为transient或static的成员。将变量声明为transient告诉JVM我们会负责将变元序列化。将数据成员声明为transient后，序列化过程就无法将其加进对象字节流中，没有从transient数据成员发送的数据。后面数据反序列化时，要重建数据成员（因为它是类定义的一部分），但不包含任何数据，因为这个数据成员不向流中写入任何数据。记住，对象流不序列化static或transient。我们的类要用writeObject()与readObject()方法以处理这些数据成员。使用writeObject()与readObject()方法时，还要注意按写入的顺序读取这些数据成员。<br />关于如何使用定制序列化的部分代码如下：<br /></p><p class="codeStyle"> </p><ol><li><em><font color="#339900">//重写writeObject()方法以便处理transient的成员。</font></em></li><li><strong><font color="#0000ff">public</font></strong> <strong><font color="#0000ff">void</font></strong> writeObject(<font color="#ff0000">ObjectOutputStream</font> outputStream) <strong><font color="#0000ff">throws</font></strong> <font color="#ff0000">IOException</font>{ 
</li><li>    outputStream.defaultWriteObject();<em><font color="#339900">//使定制的writeObject()方法可以</font></em></li><li>                        利用自动序列化中内置的逻辑。 
</li><li>    outputStream.writeObject(oSocket.getInetAddress()); 
</li><li>    outputStream.writeInt(oSocket.getPort()); 
</li><li>} 
</li><li><em><font color="#339900">//重写readObject()方法以便接收transient的成员。</font></em></li><li><strong><font color="#0000ff">private</font></strong> <strong><font color="#0000ff">void</font></strong> readObject(<font color="#ff0000">ObjectInputStream</font> inputStream) <strong><font color="#0000ff">throws</font></strong> <font color="#ff0000">IOException</font>,<strong><a href="http://www.javaresearch.org/source/jdk142/java/lang/ClassNotFoundException.java.html" target="_blank"><font class="classLink" color="#000080"><u>ClassNotFoundException</u></font></a></strong>{ 
</li><li>    inputStream.defaultReadObject();<em><font color="#339900">//defaultReadObject()补充自动序列化</font></em></li><li>    <font color="#ff0000">InetAddress</font> oAddress=(<font color="#ff0000">InetAddress</font>)inputStream.readObject(); 
</li><li>    <strong><font color="#0000ff">int</font></strong> iPort =inputStream.readInt(); 
</li><li>    oSocket = <strong><font color="#0000ff">new</font></strong> <font color="#ff0000">Socket</font>(oAddress,iPort); 
</li><li>    iID=getID(); 
</li><li>    dtToday =<strong><font color="#0000ff">new</font></strong> <font color="#ff0000">Date</font>(); 
</li><li>} </li></ol><p> </p><p><br /></p><h3>完全定制序列化过程:</h3><p><br />    如果一个类要完全负责自己的序列化，则实现Externalizable接口而不是Serializable接口。Externalizable接口定义包括两个方法writeExternal()与readExternal()。利用这些方法可以控制对象数据成员如何写入字节流.类实现Externalizable时，头写入对象流中，然后类完全负责序列化和恢复数据成员，除了头以外，根本没有自动序列化。这里要注意了。声明类实现Externalizable接口会有重大的安全风险。writeExternal()与readExternal()方法声明为public，恶意类可以用这些方法读取和写入对象数据。如果对象包含敏感信息，则要格外小心。这包括使用安全套接或加密整个字节流。到此为至，我们学习了序列化的基础部分知识。</p><p><br /></p><img src ="http://www.blogjava.net/liaojiyong/aggbug/104650.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-03-19 09:18 <a href="http://www.blogjava.net/liaojiyong/archive/2007/03/19/104650.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>类初始化与对象初始化 （转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/03/16/104312.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 16 Mar 2007 09:07:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/03/16/104312.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/104312.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/03/16/104312.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/104312.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/104312.html</trackback:ping><description><![CDATA[
		<p>what's the output?<br />/**<br /> * @author 031202<br /> *<br /> * TODO To change the template for this generated type comment go to<br /> * Window - Preferences - Java - Code Style - Code Templates<br /> */<br />class Parent {<br /> <br /> class InnerClass {<br />  public InnerClass() {<br />   System.out.println("Construct parent's inner class");<br />  }<br /> }<br /> <br /> static class StaticInner {<br />  public StaticInner() {<br />   System.out.println("Construct parent's StaticInner class");<br />  }<br /> }<br /> <br /> private InnerClass i = new InnerClass();<br /> <br /> private static StaticInner s = new StaticInner();<br /> <br /> public Parent() {<br />  System.out.println("Construct Parent");<br /> }</p>
		<p>}</p>
		<p>public class Child extends Parent {<br /> class InnerClass {<br />  public InnerClass() {<br />   System.out.println("Construct child's inner class");<br />  }<br /> }<br /> <br /> static class StaticInner {<br />  public StaticInner() {<br />   System.out.println("Construct child's StaticInner class");<br />  }<br /> }<br /> <br /> private static StaticInner s = new StaticInner();<br /> <br /> private InnerClass i = new InnerClass();<br /> <br /> public Child() {<br />  System.out.println("Construct Child");<br /> }<br /> <br /> public static void main(String[] args) {<br />  new Child();<br /> }<br />}<br />answer:<br />Construct parent's StaticInner class<br />Construct child's StaticInner class<br />Construct parent's inner class<br />Construct Parent<br />Construct child's inner class<br />Construct Child</p>
		<p>Do you really understnand  the class initialization?</p>
		<br />
<img src ="http://www.blogjava.net/liaojiyong/aggbug/104312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-03-16 17:07 <a href="http://www.blogjava.net/liaojiyong/archive/2007/03/16/104312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jar 转 exe 个人经验总结（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/03/12/103269.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Mon, 12 Mar 2007 04:02:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/03/12/103269.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/103269.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/03/12/103269.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/103269.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/103269.html</trackback:ping><description><![CDATA[jar 转 exe的工具很多，比较流行的有exe4j 、installanywhere（主要做安装）、jsmooth。我在这里选择了jsmooth。实际上jsmooth 和exe4j的操作都差不多，而jsmooth比exe4j还要小巧，我选择jsmooth。<br />制作分两种情况，一种是将jre 和 exe一同发布，这样你就可以不用考虑客户机器上安装jvm没有了。一种是要求客户机器上安装有jre的情况。<br /><br />1. 先将要求客户机上安装有jre的情况：<br />很多文章都喜欢从界面操作上开始讲，而我认为从项目文件讲就更简单了。如下是我的jar转exe的test.exe.jsmooth文件。用jsmooth直接打开 test.exe.jsmooth这个文件（至于界面上每一步该怎么设置都一目了然，全设置好了。），直接编译就ok了。<br />test.exe.jsmooth文件内容如下：<br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,128,128)"> 1</span> <span style="COLOR: rgb(0,0,255)">&lt;?</span><span style="COLOR: rgb(255,0,255)">xml version="1.0" encoding="ISO-8859-1"</span><span style="COLOR: rgb(0,0,255)">?&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 2</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">jsmoothproject</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 3</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">JVMSearchPath</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">registry</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">JVMSearchPath</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 4</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">JVMSearchPath</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">javahome</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">JVMSearchPath</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 5</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">JVMSearchPath</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">jrepath</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">JVMSearchPath</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 6</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">JVMSearchPath</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">jdkpath</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">JVMSearchPath</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 7</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">JVMSearchPath</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">exepath</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">JVMSearchPath</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 8</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">JVMSearchPath</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">jview</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">JVMSearchPath</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 9</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">arguments</span><span style="COLOR: rgb(0,0,255)">&gt;&lt;/</span><span style="COLOR: rgb(128,0,0)">arguments</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">10</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">currentDirectory</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">.</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">currentDirectory</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">11</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">embeddedJar</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">true</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">embeddedJar</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">12</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">executableName</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">test.exe</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">executableName</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">13</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">iconLocation</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">Ico02 042.ico</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">iconLocation</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">14</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">initialMemoryHeap</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">-1</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">initialMemoryHeap</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">15</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">jarLocation</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">JavaApplication19.jar</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">jarLocation</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">16</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">mainClassName</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">Client</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">mainClassName</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">17</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">maximumMemoryHeap</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">-1</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">maximumMemoryHeap</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">18</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">maximumVersion</span><span style="COLOR: rgb(0,0,255)">&gt;&lt;/</span><span style="COLOR: rgb(128,0,0)">maximumVersion</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">19</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">minimumVersion</span><span style="COLOR: rgb(0,0,255)">&gt;&lt;/</span><span style="COLOR: rgb(128,0,0)">minimumVersion</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">20</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">skeletonName</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">Windowed Wrapper</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">skeletonName</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">21</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">skeletonProperties</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">22</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">key</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">Message</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">key</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">23</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">value</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">This program needs Java to run.<br /></span><span style="COLOR: rgb(0,128,128)">24</span> <span style="COLOR: rgb(0,0,0)">Please download it at http://www.java.com</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">value</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">25</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">skeletonProperties</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">26</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">skeletonProperties</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">27</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">key</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">URL</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">key</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">28</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">value</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">http://www.java.com</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">value</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">29</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">skeletonProperties</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">30</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">skeletonProperties</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">31</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">key</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">SingleProcess</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">key</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">32</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">value</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">1</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">value</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">33</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">skeletonProperties</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">34</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">skeletonProperties</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">35</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">key</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">Debug</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">key</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">36</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">value</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">0</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">value</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">37</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">skeletonProperties</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">38</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">jsmoothproject</span><span style="COLOR: rgb(0,0,255)">&gt;</span></div><br /><font color="#000000" size="4"><span style="COLOR: rgb(0,0,255)">其中：<br />(1).&lt;</span><span style="COLOR: rgb(128,0,0)">arguments</span><span style="COLOR: rgb(0,0,255)">&gt;&lt;/</span><span style="COLOR: rgb(128,0,0)">arguments</span><span style="COLOR: rgb(0,0,255)">&gt;表示运行参数。<br />(2).</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">currentDirectory</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">.</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">currentDirectory</span><span style="COLOR: rgb(0,0,255)">&gt;</span>表示的是当前目录，那么你直接把要转换的jar和test.exe.jsmooth放在同一个目录。（我这里都是放在同一个目录下）<br /><span style="COLOR: rgb(0,0,255)">(3).</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">executableName</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">test.exe</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">executableName</span><span style="COLOR: rgb(0,0,255)">&gt;</span>表示生成exe的名字。（我没有测试放在不同目录下的结果,我不认为有必要做这个测试）。<br /><span style="COLOR: rgb(0,0,255)">(4).</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">iconLocation</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">Ico02 042.ico</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">iconLocation</span><span style="COLOR: rgb(0,0,255)">&gt;</span>表示exe所使用的图标。<br /><span style="COLOR: rgb(0,0,255)">(5).</span><span style="COLOR: rgb(0,128,128)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">jarLocation</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">JavaApplication19.jar</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">jarLocation</span><span style="COLOR: rgb(0,0,255)">&gt;</span>表示要转的jar文件。<span style="COLOR: rgb(0,0,0)"></span><br /><span style="COLOR: rgb(0,0,255)">(6).</span><span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">mainClassName</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">Client</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">mainClassName</span><span style="COLOR: rgb(0,0,255)">&gt; 表示主类</span><span style="COLOR: rgb(0,0,255)">(7).</span><span style="COLOR: rgb(0,128,128)"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">skeletonName</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">Windowed Wrapper</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">skeletonName</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">表示的是运行时候，不需要带dos控制台窗口。对应的是Console Wrapper。<br /><br /></span></font>直接保存test.exe.jsmooth文件就可以用。<br />对于应用的目录结构图：<br /><img height="181" alt="21.jpg" src="http://www.blogjava.net/images/blogjava_net/java-he/21.jpg" width="387" border="0" /><br /><span style="COLOR: rgb(0,0,0)"></span><font color="#000000" size="4"><span style="COLOR: rgb(0,0,255)"></span><span style="COLOR: rgb(0,0,0)"></span></font><span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)"></span><br />2.第2种情况，即带jre的exe<br /><br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />&lt;jsmoothproject&gt;<br />&lt;JVMSearchPath&gt;registry&lt;/JVMSearchPath&gt;<br />&lt;JVMSearchPath&gt;javahome&lt;/JVMSearchPath&gt;<br />&lt;JVMSearchPath&gt;jrepath&lt;/JVMSearchPath&gt;<br />&lt;JVMSearchPath&gt;jdkpath&lt;/JVMSearchPath&gt;<br />&lt;JVMSearchPath&gt;exepath&lt;/JVMSearchPath&gt;<br />&lt;JVMSearchPath&gt;jview&lt;/JVMSearchPath&gt;<br />&lt;arguments&gt;&lt;/arguments&gt;<br />&lt;bundledJVMPath&gt;java&lt;/bundledJVMPath&gt;<br />&lt;classPath&gt;java\bin&lt;/classPath&gt;<br />&lt;classPath&gt;java\lib&lt;/classPath&gt;<br />&lt;classPath&gt;java\lib\rt.jar&lt;/classPath&gt;<br />&lt;classPath&gt;java\lib\javaws.jar&lt;/classPath&gt;<br />&lt;currentDirectory&gt;Test.exe&lt;/currentDirectory&gt;<br />&lt;embeddedJar&gt;true&lt;/embeddedJar&gt;<br />&lt;executableName&gt;Test.exe&lt;/executableName&gt;<br />……后面同上例一样。<br />最重要的区别是这个绑定了java虚拟机，指定了classpath路径。<br />编译时候，把java文件放在同一目录下：<br /><img height="118" alt="22.jpg" src="http://www.blogjava.net/images/blogjava_net/java-he/22.jpg" width="456" border="0" /><br />其中test.exe是生成的。<br />简单吧，编译就生成了exe文件了。<br /><img src ="http://www.blogjava.net/liaojiyong/aggbug/103269.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-03-12 12:02 <a href="http://www.blogjava.net/liaojiyong/archive/2007/03/12/103269.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>静态分派，动态分派，多分派，单分派 -------------- visitor模式准备（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100676.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Mon, 26 Feb 2007 01:38:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100676.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/100676.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100676.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/100676.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/100676.html</trackback:ping><description><![CDATA[一，静态分派:<br />1，定义：发生在编译时期，分派根据静态类型信息发生，重载就是静态分派<br />2，什么是静态类型：变量被声明时的类型是静态类型<br />      什么是动态类型：变量所引用的对象的真实类型<br />3，有两个类,BlackCat ,WhiteCat都继承自Cat<br />如下调用<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_9_10_Open_Image" onclick="this.style.display='none'; Codehighlighter1_9_10_Open_Text.style.display='none'; Codehighlighter1_9_10_Closed_Image.style.display='inline'; Codehighlighter1_9_10_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_9_10_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_9_10_Closed_Text.style.display='none'; Codehighlighter1_9_10_Open_Image.style.display='inline'; Codehighlighter1_9_10_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Cat</span><span id="Codehighlighter1_9_10_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_9_10_Open_Text"><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_38_39_Open_Image" onclick="this.style.display='none'; Codehighlighter1_38_39_Open_Text.style.display='none'; Codehighlighter1_38_39_Closed_Image.style.display='inline'; Codehighlighter1_38_39_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_38_39_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_38_39_Closed_Text.style.display='none'; Codehighlighter1_38_39_Open_Image.style.display='inline'; Codehighlighter1_38_39_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> WhiteCat </span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000"> Cat</span><span id="Codehighlighter1_38_39_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_38_39_Open_Text"><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_67_68_Open_Image" onclick="this.style.display='none'; Codehighlighter1_67_68_Open_Text.style.display='none'; Codehighlighter1_67_68_Closed_Image.style.display='inline'; Codehighlighter1_67_68_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_67_68_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_67_68_Closed_Text.style.display='none'; Codehighlighter1_67_68_Open_Image.style.display='inline'; Codehighlighter1_67_68_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> BlackCat </span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000"> Cat</span><span id="Codehighlighter1_67_68_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_67_68_Open_Text"><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_90_462_Open_Image" onclick="this.style.display='none'; Codehighlighter1_90_462_Open_Text.style.display='none'; Codehighlighter1_90_462_Closed_Image.style.display='inline'; Codehighlighter1_90_462_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_90_462_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_90_462_Closed_Text.style.display='none'; Codehighlighter1_90_462_Open_Image.style.display='inline'; Codehighlighter1_90_462_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Person </span><span id="Codehighlighter1_90_462_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_90_462_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_118_155_Open_Image" onclick="this.style.display='none'; Codehighlighter1_118_155_Open_Text.style.display='none'; Codehighlighter1_118_155_Closed_Image.style.display='inline'; Codehighlighter1_118_155_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_118_155_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_118_155_Closed_Text.style.display='none'; Codehighlighter1_118_155_Open_Image.style.display='inline'; Codehighlighter1_118_155_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> feed(Cat cat)</span><span id="Codehighlighter1_118_155_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_118_155_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">feed cat</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_188_230_Open_Image" onclick="this.style.display='none'; Codehighlighter1_188_230_Open_Text.style.display='none'; Codehighlighter1_188_230_Closed_Image.style.display='inline'; Codehighlighter1_188_230_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_188_230_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_188_230_Closed_Text.style.display='none'; Codehighlighter1_188_230_Open_Image.style.display='inline'; Codehighlighter1_188_230_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> feed(WhiteCat cat)</span><span id="Codehighlighter1_188_230_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_188_230_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">feed WhiteCat</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_263_305_Open_Image" onclick="this.style.display='none'; Codehighlighter1_263_305_Open_Text.style.display='none'; Codehighlighter1_263_305_Closed_Image.style.display='inline'; Codehighlighter1_263_305_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_263_305_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_263_305_Closed_Text.style.display='none'; Codehighlighter1_263_305_Open_Image.style.display='inline'; Codehighlighter1_263_305_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> feed(BlackCat cat)</span><span id="Codehighlighter1_263_305_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_263_305_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">feed BlackCat</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_347_459_Open_Image" onclick="this.style.display='none'; Codehighlighter1_347_459_Open_Text.style.display='none'; Codehighlighter1_347_459_Closed_Image.style.display='inline'; Codehighlighter1_347_459_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_347_459_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_347_459_Closed_Text.style.display='none'; Codehighlighter1_347_459_Open_Image.style.display='inline'; Codehighlighter1_347_459_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> main(String[] args) </span><span id="Codehighlighter1_347_459_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_347_459_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        Cat wc </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> WhiteCat();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        Cat bc </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> BlackCat();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        Person p </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Person();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        p.feed(wc);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        p.feed(bc);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>运行结果是:<br />feed cat<br />feed cat<br />这样的结果是因为重载是静态分派，在编译器执行的，取决于变量的声明类型，因为wc ,bc都是Cat所以调用的都是feed(Cat cat)的函数.<br />二，动态分派<br />1，定义：发生在运行期，动态分派，动态的置换掉某个方法。<br />还是上边类似的例子：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_9_67_Open_Image" onclick="this.style.display='none'; Codehighlighter1_9_67_Open_Text.style.display='none'; Codehighlighter1_9_67_Closed_Image.style.display='inline'; Codehighlighter1_9_67_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_9_67_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_9_67_Closed_Text.style.display='none'; Codehighlighter1_9_67_Open_Image.style.display='inline'; Codehighlighter1_9_67_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Cat</span><span id="Codehighlighter1_9_67_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_9_67_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_29_65_Open_Image" onclick="this.style.display='none'; Codehighlighter1_29_65_Open_Text.style.display='none'; Codehighlighter1_29_65_Closed_Image.style.display='inline'; Codehighlighter1_29_65_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_29_65_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_29_65_Closed_Text.style.display='none'; Codehighlighter1_29_65_Open_Image.style.display='inline'; Codehighlighter1_29_65_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> eat()</span><span id="Codehighlighter1_29_65_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_29_65_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">cat eat</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_102_251_Open_Image" onclick="this.style.display='none'; Codehighlighter1_102_251_Open_Text.style.display='none'; Codehighlighter1_102_251_Closed_Image.style.display='inline'; Codehighlighter1_102_251_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_102_251_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_102_251_Closed_Text.style.display='none'; Codehighlighter1_102_251_Open_Image.style.display='inline'; Codehighlighter1_102_251_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> BlackCat </span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000"> Cat</span><span id="Codehighlighter1_102_251_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_102_251_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_122_164_Open_Image" onclick="this.style.display='none'; Codehighlighter1_122_164_Open_Text.style.display='none'; Codehighlighter1_122_164_Closed_Image.style.display='inline'; Codehighlighter1_122_164_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_122_164_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_122_164_Closed_Text.style.display='none'; Codehighlighter1_122_164_Open_Image.style.display='inline'; Codehighlighter1_122_164_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> eat()</span><span id="Codehighlighter1_122_164_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_122_164_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">black cat eat</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_205_249_Open_Image" onclick="this.style.display='none'; Codehighlighter1_205_249_Open_Text.style.display='none'; Codehighlighter1_205_249_Closed_Image.style.display='inline'; Codehighlighter1_205_249_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_205_249_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_205_249_Closed_Text.style.display='none'; Codehighlighter1_205_249_Open_Image.style.display='inline'; Codehighlighter1_205_249_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> main(String[] args)</span><span id="Codehighlighter1_205_249_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_205_249_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        Cat cat </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> BlackCat();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        cat.eat();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>这个时候的结果是:<br />black cat eat<br />这样的结果是因为在执行期发生了向下转型，就是动态分派了。<br /><br />三，单分派：<br />1，定义：根据一个宗量的类型进行方法的选择<br />四,多分派：<br />1，定义：根据多于一个宗量的类型对方法的选择<br />2，说明：多分派其实是一系列的单分派组成的，区别的地方就是这些但分派不能分割。<br />3,C++ ,Java都是动态单分派，静态多分派语言<br />多分派的语言有：CLOS  Cecil<br /><br />最后的部分： 
<p>看完本文，如果你对visitor模式有更多的兴趣，想了解更多请看如下几篇文章。<br />1,<a href="/dreamstone/archive/2006/12/20/88947.html"><font color="#7297ce">静态分派，动态分派，多分派，单分派 --------------   visitor模式准备</font></a><a href="/dreamstone/archive/2006/12/20/88947.html"><font color="#7297ce">(<font color="#000000">本文）</font><br /></font></a>2<a href="/dreamstone/archive/2006/12/18/88623.html"><font color="#7297ce">,访问差异类型的集合类 ------------------------   visitor模式入门</font></a><br />3,<a href="/dreamstone/archive/2006/12/20/88948.html"><font color="#009933">visitor模式理论及学术概念-------------－-----   visitor模式进一步<br /></font></a>4，<a href="/dreamstone/archive/2006/12/18/88623.html"><font color="#009933">重载overloading和覆写overriding哪个更早执行--   visitor帮助篇</font></a><br />虽然排列顺序是1,2,3,4但是我个人建议的学习方式是2,1,3,4因为这个顺序更方便一般人理解<br /><br /><br /></p><h4><a title="permalink: re: 静态分派，动态分派，多分派，单分派 --------------   visitor模式准备" href="/dreamstone/archive/2006/12/20/88947.aspx#89028"><font color="#009933">#</font></a> <a name="89028"></a>re: 静态分派，动态分派，多分派，单分派 -------------- visitor模式准备 <span><font color="#999999">2006-12-20 13:59 </font></span><a id="AjaxHolder_Comments_CommentList_ctl00_NameLink" target="_blank">mu!!</a></h4><p>单分派：定义：根据一个宗量的类型进行方法的选择 <br />多分派：定义：根据多于一个宗量的类型对方法的选择 <br /><br />宗量??? <br /><br />对应的英文翻译是什么？  <a onclick="return SetReplyAuhor(&quot;mu!!&quot;)" href="/dreamstone/archive/2006/12/20/88947.aspx#post"><font color="#009933">回复</font></a>  <a title="查看该作者发表过的评论" href="/comment?author=mu!!" target="_blank"><font color="#009933">更多评论</font></a><a id="AjaxHolder_Comments_CommentList_ctl00_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl00$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl00_EditLink"></a></p><h4><a title="permalink: re: 静态分派，动态分派，多分派，单分派 --------------   visitor模式准备" href="/dreamstone/archive/2006/12/20/88947.aspx#89048"><font color="#009933">#</font></a> <a name="89048"></a>re: 静态分派，动态分派，多分派，单分派 -------------- visitor模式准备 <span><font color="#999999">2006-12-20 15:16 </font></span><a id="AjaxHolder_Comments_CommentList_ctl01_NameLink" href="/dreamstone/" target="_blank"><font color="#009933">dreamstone</font></a></h4><p>宗量大概的意思是方法的参数或方法的调用者 <br />具体的英文确切翻译不太清楚，下班后找找看 <br />这一词的来源是&lt;&lt;Java与模式&gt;&gt;一书，有些其它的讲模式的书也使用过。  <a onclick="return SetReplyAuhor(&quot;dreamstone&quot;)" href="/dreamstone/archive/2006/12/20/88947.aspx#post"><font color="#009933">回复</font></a>  <a title="查看该作者发表过的评论" href="/comment?author=dreamstone" target="_blank"><font color="#009933">更多评论</font></a><a id="AjaxHolder_Comments_CommentList_ctl01_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl01$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl01_EditLink"></a></p><h4><a title="permalink: re: 静态分派，动态分派，多分派，单分派 --------------   visitor模式准备[未登录]" href="/dreamstone/archive/2006/12/20/88947.aspx#94464"><font color="#009933">#</font></a> <a name="94464"></a>re: 静态分派，动态分派，多分派，单分派 -------------- visitor模式准备[未登录] <span><font color="#999999">2007-01-17 17:38 </font></span><a id="AjaxHolder_Comments_CommentList_ctl02_NameLink" target="_blank">h</a></h4><p>楼主，要把概念分清楚，否则会误导很人，本来是做好事成了误人子第； <br />多分派与多重分派是不一样的概念，多分派是根据多与一个宗量的类型对方法进行选择，而多重分派是一系列单分派组成的分派过程，可以分解成多个单分派的，而多分派是不能分解成多个单分派的．  <a onclick="return SetReplyAuhor(&quot;h&quot;)" href="/dreamstone/archive/2006/12/20/88947.aspx#post"><font color="#009933">回复</font></a>  <a title="查看该作者发表过的评论" href="/comment?author=h" target="_blank"><font color="#009933">更多评论</font></a><a id="AjaxHolder_Comments_CommentList_ctl02_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl02$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl02_EditLink"></a></p><h4><a title="permalink: re: 静态分派，动态分派，多分派，单分派 --------------   visitor模式准备[未登录]" href="/dreamstone/archive/2006/12/20/88947.aspx#94858"><font color="#009933">#</font></a> <a name="94858"></a>re: 静态分派，动态分派，多分派，单分派 -------------- visitor模式准备[未登录]<a name="Post"></a><span><font color="#999999">2007-01-19 09:51 </font></span><a id="AjaxHolder_Comments_CommentList_ctl03_NameLink" target="_blank">dreamstone</a></h4><p>1,根据多于一个宗量的类型对方法的选择 <br />说明：多分派其实是一系列的单分派组成的，区别的地方就是这些单分派不能分割。 <br /><br />2,多分派与多重分派是不一样的概念，多分派是根据多与一个宗量的类型对方法进行选择，而多重分派是一系列单分派组成的分派过程，可以分解成多个单分派的，而多分派是不能分解成多个单分派的 <br /><br />1是我写的，2是你写的，没看到有什么区别， <br />都是根据多于一个宗量的类型对方法的选择 <br />都是多分派是不能分解成多个单分派的 <br /><br />你强调多重分派的概念，在我看来那是多次单分派，所以我并没有提出多重分派的概念。 <br /><br />谢谢你的热心纠正错误，不过麻烦把错误明确对比出来。 <br /><br />  <a onclick="return SetReplyAuhor(&quot;dreamstone&quot;)" href="/dreamstone/archive/2006/12/20/88947.aspx#post"><font color="#009933">回复</font></a>  <a title="查看该作者发表过的评论" href="/comment?author=dreamstone" target="_blank"><font color="#009933">更多评论</font></a><a id="AjaxHolder_Comments_CommentList_ctl03_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl03$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl03_EditLink"></a></p><img src ="http://www.blogjava.net/liaojiyong/aggbug/100676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-02-26 09:38 <a href="http://www.blogjava.net/liaojiyong/archive/2007/02/26/100676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中的模式 --- 命令模式的(实现,功能,使用场合)及如何配合其它模式使用命令模式 （转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100677.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Mon, 26 Feb 2007 01:38:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100677.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/100677.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100677.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/100677.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/100677.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一,命令模式的实现:命令模式里边一般都有以下几个角色：客户端，请求者，命令接口，命令实现，接受者,下边是简单命令模式的实现代码实现：  1public class Client{ 2    public static void main(String[] args){ 3        Receiver receiver = new Receiver(); 4        Command c...&nbsp;&nbsp;<a href='http://www.blogjava.net/liaojiyong/archive/2007/02/26/100677.html'>阅读全文</a><img src ="http://www.blogjava.net/liaojiyong/aggbug/100677.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-02-26 09:38 <a href="http://www.blogjava.net/liaojiyong/archive/2007/02/26/100677.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jdk1.5中的新特性 --泛型 (详细版)（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100675.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Mon, 26 Feb 2007 01:37:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100675.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/100675.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100675.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/100675.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/100675.html</trackback:ping><description><![CDATA[
		<p>本来只转载了个链接，和一个简单的使用程序，但昨天不小心看到有人批判jdk1.5，先说java要强制转型不好的问题没解决，<br />容器不能放基类型不好，接着说泛型没用。而恰恰Jdk1.5中解决了这些问题，所以感叹之余，把这篇文章改一下，详细的说说泛型。</p>
		<p>一，Java中的泛型：<br />在Java中能使用到泛型的多是容器类,如各种list map set，因为Java是单根继承，所以容器里边可以放的<br />内容是任何Object，所以从意义上讲原本的设计才是泛型。但用过Java的人是否感觉每次转型很麻烦呢？<br />而且会有些错误，比如一个容器内放入了异质对象，强制转型的时候会出现cast异常。而这中错误在编译器是<br />无从发现的。所以jdk1.5中提供了泛型，这个泛型其实是向c++靠拢了.好，我们先看几个实例再细说原理。</p>
		<p>二，泛型的用法:(多个实例)<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">实例A<br /></span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />ArrayList</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">String</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> strList </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> ArrayList</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">String</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">();<br /></span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />strList.add(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">);<br /></span>
				<span style="COLOR: #008080">4</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />strList.add(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">2</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">);<br /></span>
				<span style="COLOR: #008080">5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />strList.add(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">3</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">);<br /></span>
				<span style="COLOR: #008080">6</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">关键点（1） 注意下边这行，没有强制转型</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">7</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">String str </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> strList.get(</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">);<br /></span>
				<span style="COLOR: #008080">8</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">关键点（2）然後我们加入，这个时候你会发现编译器报错，错误在编译器被发现，错误当然是发现的越早越好</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">9</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">strList.add(</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> Object());</span>
		</div>
		<br />
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">实例B<br /></span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />ArrayList</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">Integer</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> iList </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> ArrayList</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">Integer</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">();<br /></span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">关键点（3） 注意直接把整数放入了集合中，而没有用Integer包裹</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">4</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">iList.add(</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">);<br /></span>
				<span style="COLOR: #008080">5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />iList.add(</span>
				<span style="COLOR: #000000">2</span>
				<span style="COLOR: #000000">);<br /></span>
				<span style="COLOR: #008080">6</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />iList.add(</span>
				<span style="COLOR: #000000">3</span>
				<span style="COLOR: #000000">);<br /></span>
				<span style="COLOR: #008080">7</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">关键点（4）同样直接取出就是int</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">8</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> num </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> iList.get(</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">);</span>
		</div>
		<br />
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">实例C<br /></span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">关键点（5）展示一下key-value的时候要怎么写，同时key和value也可以是基本类型了。</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">HashMap</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">Integer,Integer</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> map </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> HashMap</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">Integer,Integer</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">();<br /></span>
				<span style="COLOR: #008080">4</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />map.put(</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #000000">11</span>
				<span style="COLOR: #000000">);<br /></span>
				<span style="COLOR: #008080">5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />map.put(</span>
				<span style="COLOR: #000000">2</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #000000">22</span>
				<span style="COLOR: #000000">);<br /></span>
				<span style="COLOR: #008080">6</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />map.put(</span>
				<span style="COLOR: #000000">3</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #000000">33</span>
				<span style="COLOR: #000000">);<br /></span>
				<span style="COLOR: #008080">7</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> inum </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> map.get(</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">);<br /></span>
				<span style="COLOR: #008080">8</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<br />三，看完了实例了，详细来说说为什么吧<br />首先jdk1.5中的泛型，第一个解决的问题，就是Java中很多不必要的强制转型了，具体的实现,我们以ArrayList<br />为例,下边是ArrayList中的片断代码:<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">ArrayList类的定义，这里加入了</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">E</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> ArrayList</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">E</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000"> AbstractList</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">E</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000"> List</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">E</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">, RandomAccess, Cloneable, java.io.Serializable<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">get方法,返回不再是Object 而是E</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #008000"><img id="Codehighlighter1_196_246_Open_Image" onclick="this.style.display='none'; Codehighlighter1_196_246_Open_Text.style.display='none'; Codehighlighter1_196_246_Closed_Image.style.display='inline'; Codehighlighter1_196_246_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_196_246_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_196_246_Closed_Text.style.display='none'; Codehighlighter1_196_246_Open_Image.style.display='inline'; Codehighlighter1_196_246_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> E get(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> index) </span><span id="Codehighlighter1_196_246_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_196_246_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    RangeCheck(index);<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> elementData[index];<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">add方法,参数不再是Object 而是E</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #008000"><img id="Codehighlighter1_296_391_Open_Image" onclick="this.style.display='none'; Codehighlighter1_296_391_Open_Text.style.display='none'; Codehighlighter1_296_391_Closed_Image.style.display='inline'; Codehighlighter1_296_391_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_296_391_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_296_391_Closed_Text.style.display='none'; Codehighlighter1_296_391_Open_Image.style.display='inline'; Codehighlighter1_296_391_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000"> add(E o) </span><span id="Codehighlighter1_296_391_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_296_391_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    ensureCapacity(size </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Increments modCount!!</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    elementData[size</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> o;<br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><p><br />四，Boxing 和UnBoxing<br />看到上边的关键点（3）和（4）是否感觉惊奇呢，因为Java中烦人的除了强制转型，另一个就是基础类型了<br />放入容器的时候要包装，取出了还要转回。Jdk1.5中解决了这个问题.如上边的使用方法<br /><br />五，泛型的生命周期（使用注意事项）<br />如果我们试着把ArrayList&lt;String&gt; list的内容序列化，然後再读取出来，在使用的过程中会发现出错，<br />为什么呢？用Stream读取一下回来的数据，你会发现&lt;String&gt;不见了，list变成了普通的ArrayList，而不是<br />参数化型别的ArrayList了，为什么会这样呢 ？见下边的比较</p><p>六，C++的泛型和Java的泛型<br />在泛型的实现上，C++和Java有着很大的不同，<br />Java是擦拭法实现的<br />C++是膨胀法实现的<br />因为Java原本实现就是泛型的，现在加入型别，其实是"窄化",所以采用擦拭法，在实现上，其实是封装了原本的<br />ArrayList,这样的话，对于下边这些情况，Java的实现类只有一个。<br /><br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">ArrayList</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Integer</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">  <img src="http://www.blogjava.net/images/dot.gif" />.;   </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> ArrayList<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />ArrayList</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">  <img src="http://www.blogjava.net/images/dot.gif" />..;   </span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">同上</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />ArrayList</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Double</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">  <img src="http://www.blogjava.net/images/dot.gif" />..;   </span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">同上</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />而C</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">采用的是膨胀法,对于上边的三种情况实际是每一种型别都对应一个实现，实现类有多个<br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />list</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> li;                </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> list; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">int 版本</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">6</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">list</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> ls;             </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> list; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">string 版本</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">7</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">list</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> ld;             </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> list; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">double 版本    </span></div><p>这就造成了，在序列化后，Java不能分清楚原来的ArrayList是<br />ArrayList&lt;Integer&gt;还是ArrayList<br /><br />七，题外话，在很多东西的实现上C++和Java有很多不同<br />例如运算符的问题i=i++问题，<a href="/dreamstone/archive/2006/11/04/79058.html"><font color="#009933">详细看这里</font></a><br />例如在C++中能很好实现的double-checked locking单态模式，在Java中几乎很难实现 <a href="/dreamstone/archive/2006/11/04/79026.html"><font color="#009933">详细看这里</font></a><br />还有就是上边提到的泛型实现上。<br /></p><p>八，Jdk 1.5加入了不少新东西，有些能很大的提高开发质量，例如Jdk1.4 ，Jdk.15中StringBuffer的不同<br />因为从1。4转入1。5不久，所以慢慢会发一些在1。5的使用过程中发现的东西。<br /><br />最后，我们还可以自己写类似ArrayList这样的泛型类，至于如何自定义泛型类，泛型方法请参见候捷先生的文章<br /><br />本文大部份内容来自候捷写的jdk1.5泛型的文章<a href="http://jjhou.csdn.net/javatwo-2004-gp-in-jdk15.pdf"><font color="#009933">http://jjhou.csdn.net/javatwo-2004-gp-in-jdk15.pdf</font></a>  向他致敬。<br /><br /><br /><br /></p><h4><a title="permalink: re: Jdk1.5中的新特性  --泛型 (详细版)" href="/dreamstone/archive/2006/11/08/79791.aspx#79829"><font color="#009933">#</font></a> <a name="79829"></a>re: Jdk1.5中的新特性 --泛型 (详细版) <span><font color="#999999">2006-11-08 13:33 </font></span><a id="AjaxHolder_Comments_CommentList_ctl00_NameLink" target="_blank">石头[匿名]</a></h4><p>不错，值的学习  <a onclick="return SetReplyAuhor(&quot;石头[匿名]&quot;)" href="/dreamstone/archive/2006/11/08/79791.aspx#post"><font color="#009933">回复</font></a>  <a title="查看该作者发表过的评论" href="/comment?author=%e7%9f%b3%e5%a4%b4%5b%e5%8c%bf%e5%90%8d%5d" target="_blank"><font color="#009933">更多评论</font></a><a id="AjaxHolder_Comments_CommentList_ctl00_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl00$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl00_EditLink"></a></p><h4><a title="permalink: re: Jdk1.5中的新特性  --泛型 (详细版)" href="/dreamstone/archive/2006/11/08/79791.aspx#80348"><font color="#009933">#</font></a> <a name="80348"></a>re: Jdk1.5中的新特性 --泛型 (详细版) <span><font color="#999999">2006-11-10 11:31 </font></span><a id="AjaxHolder_Comments_CommentList_ctl01_NameLink" href="/andaguang/" target="_blank"><font color="#009933">大光</font></a></h4><p>谢谢，以前真的一点都不知道～～  <a onclick="return SetReplyAuhor(&quot;大光&quot;)" href="/dreamstone/archive/2006/11/08/79791.aspx#post"><font color="#009933">回复</font></a>  <a title="查看该作者发表过的评论" href="/comment?author=%e5%a4%a7%e5%85%89" target="_blank"><font color="#009933">更多评论</font></a><a id="AjaxHolder_Comments_CommentList_ctl01_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl01$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl01_EditLink"></a></p><h4><a title="permalink: re: Jdk1.5中的新特性  --泛型 (详细版)" href="/dreamstone/archive/2006/11/08/79791.aspx#92740"><font color="#009933">#</font></a> <a name="92740"></a>re: Jdk1.5中的新特性 --泛型 (详细版) <span><font color="#999999">2007-01-09 21:10 </font></span><a id="AjaxHolder_Comments_CommentList_ctl02_NameLink" href="/crespo9907/" target="_blank"><font color="#009933">施伟</font></a></h4><p>读了，不错  <a onclick="return SetReplyAuhor(&quot;施伟&quot;)" href="/dreamstone/archive/2006/11/08/79791.aspx#post"><font color="#009933">回复</font></a>  <a title="查看该作者发表过的评论" href="/comment?author=%e6%96%bd%e4%bc%9f" target="_blank"><font color="#009933">更多评论</font></a><a id="AjaxHolder_Comments_CommentList_ctl02_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl02$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl02_EditLink"></a></p><h4><a title="permalink: re: Jdk1.5中的新特性  --泛型 (详细版)" href="/dreamstone/archive/2006/11/08/79791.aspx#97817"><font color="#009933">#</font></a> <a name="97817"></a>re: Jdk1.5中的新特性 --泛型 (详细版) <span><font color="#999999">2007-02-04 00:07 </font></span><a id="AjaxHolder_Comments_CommentList_ctl03_NameLink" href="http://blog.sina.com.cn/u/1251268961" target="_blank"><font color="#009933">小神</font></a></h4><p>谢谢..   <a onclick="return SetReplyAuhor(&quot;小神&quot;)" href="/dreamstone/archive/2006/11/08/79791.aspx#post"><font color="#009933">回复</font></a>  <a title="查看该作者发表过的评论" href="/comment?author=%e5%b0%8f%e7%a5%9e" target="_blank"><font color="#009933">更多评论</font></a><a id="AjaxHolder_Comments_CommentList_ctl03_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl03$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl03_EditLink"></a></p><h4><a title="permalink: re: Jdk1.5中的新特性  --泛型 (详细版)" href="/dreamstone/archive/2006/11/08/79791.aspx#100161"><font color="#009933">#</font></a> <a name="100161"></a>re: Jdk1.5中的新特性 --泛型 (详细版) <span><font color="#999999">2007-02-18 01:18 </font></span><a id="AjaxHolder_Comments_CommentList_ctl04_NameLink" href="/xilaile/" target="_blank"><font color="#009933">喜来了</font></a></h4><p>总觉得Java 1.5中有很多概念不如原来那么一致和优雅. 比如很多情况下需要借助bridge方法. 对初学者来说, Java 1.5的魅力肯定有所减少. Java1.5 Generics的开发花了5年多的时间, 相信如果不是C#的压力,到现在也不一定能发布呢. 很显然的Java1.5恰恰预示了我们需要下一个更好的语言, 不知道是哪个? 现在有原来搞Java的大牛都转向Ruby了. 一直到现在还没有时间去看看Ruby到底怎么样, 据说是小日本搞出来的.   <a onclick="return SetReplyAuhor(&quot;喜来了&quot;)" href="/dreamstone/archive/2006/11/08/79791.aspx#post"><font color="#009933">回复</font></a>  <a title="查看该作者发表过的评论" href="/comment?author=%e5%96%9c%e6%9d%a5%e4%ba%86" target="_blank"><font color="#009933">更多评论</font></a><a id="AjaxHolder_Comments_CommentList_ctl04_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl04$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl04_EditLink"></a></p><h4><a title="permalink: re: Jdk1.5中的新特性  --泛型 (详细版)" href="/dreamstone/archive/2006/11/08/79791.aspx#100231"><font color="#009933">#</font></a> <a name="100231"></a>re: Jdk1.5中的新特性 --泛型 (详细版)<a name="Post"></a><span><font color="#999999">2007-02-20 09:47 </font></span><a id="AjaxHolder_Comments_CommentList_ctl05_NameLink" target="_blank">kedou</a></h4><p>泛型是一个挺有趣的东东，继续使用ing~~~~~~  <a onclick="return SetReplyAuhor(&quot;kedou&quot;)" href="/dreamstone/archive/2006/11/08/79791.aspx#post"><font color="#009933">回复</font></a>  <a title="查看该作者发表过的评论" href="/comment?author=kedou" target="_blank"><font color="#009933">更多评论</font></a><a id="AjaxHolder_Comments_CommentList_ctl05_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl05$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl05_EditLink"></a></p><img src ="http://www.blogjava.net/liaojiyong/aggbug/100675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-02-26 09:37 <a href="http://www.blogjava.net/liaojiyong/archive/2007/02/26/100675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过汉字取得拼音Java版（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100673.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Mon, 26 Feb 2007 01:36:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100673.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/100673.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100673.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/100673.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/100673.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 现在想到的方法有两种：1，取得的汉字拼音对照表，然後做成map.一个GB2312的对照表见这里:http://zh.transwiki.org/wiki/index.php/GB2312%E6%B1%89%E5%AD%97%E6%8B%BC%E9%9F%B3%E5%AF%B9%E7%85%A7%E8%A1%A82，这个方法看起来好，效果一般；  1    private static int[] ...&nbsp;&nbsp;<a href='http://www.blogjava.net/liaojiyong/archive/2007/02/26/100673.html'>阅读全文</a><img src ="http://www.blogjava.net/liaojiyong/aggbug/100673.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-02-26 09:36 <a href="http://www.blogjava.net/liaojiyong/archive/2007/02/26/100673.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>访问差异类型的集合类--visitor模式入门（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100672.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Mon, 26 Feb 2007 01:34:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100672.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/100672.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100672.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/100672.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/100672.html</trackback:ping><description><![CDATA[
		<p>访问差异类型的集合类--visitor模式入门<br />本文对应代码下载<a href="/Files/dreamstone/visitor.rar"><font color="#009933">这里</font></a><br />一，问题提出<br />访问同一类型的集合类是我们最常见的事情了，我们工作中这样的代码太常见了。<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">Iterator ie </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> list.iterator();<br /></span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_50_96_Open_Image" onclick="this.style.display='none'; Codehighlighter1_50_96_Open_Text.style.display='none'; Codehighlighter1_50_96_Closed_Image.style.display='inline'; Codehighlighter1_50_96_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_50_96_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_50_96_Closed_Text.style.display='none'; Codehighlighter1_50_96_Open_Image.style.display='inline'; Codehighlighter1_50_96_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">while</span>
				<span style="COLOR: #000000">(ie.hasNext())</span>
				<span id="Codehighlighter1_50_96_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_50_96_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080">3</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    Person p </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> (Person)ie.next();<br /></span>
						<span style="COLOR: #008080">4</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    p.doWork();<br /></span>
						<span style="COLOR: #008080">5</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
		<p>
				<br />这种访问的特点是集合类中的对象是同一类对象Person，他们拥有功能的方法run,我们调用的恰好是这个共同的方法。<br />在大部份的情况下，这个是可以的，但在一些复杂的情况，如被访问者的继承结构复杂，被访问者的并不是同一类对象，<br />也就是说不是继承自同一个根类。方法名也并不相同。例如Java GUI中的事件就是一个例子。<br />例如这样的问题，有如下类和方法:<br />类：PA ,方法：runPA();<br />类：PB ,方法：runPB();<br />类：PC ,方法：runPC();<br />类：PD ,方法：runPD();<br />类：PE ,方法：runPE();<br />有一个集合类List<br />List list = new ArrayList();<br />list.add(new PA());<br />list.add(new PB());<br />list.add(new PC());<br />list.add(new PD());<br />list.add(new PE());<br />....<br />二:解决<br />要求能访问到每个类的对应的方法。我们第一反应应该是这样的。<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">Iterator ie </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> list.iterator();<br /></span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_50_330_Open_Image" onclick="this.style.display='none'; Codehighlighter1_50_330_Open_Text.style.display='none'; Codehighlighter1_50_330_Closed_Image.style.display='inline'; Codehighlighter1_50_330_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_50_330_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_50_330_Closed_Text.style.display='none'; Codehighlighter1_50_330_Open_Image.style.display='inline'; Codehighlighter1_50_330_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">while</span>
				<span style="COLOR: #000000">(ie.hasNext())</span>
				<span id="Codehighlighter1_50_330_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_50_330_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080"> 3</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    Object obj </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> ie.next();<br /></span>
						<span style="COLOR: #008080"> 4</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_100_124_Open_Image" onclick="this.style.display='none'; Codehighlighter1_100_124_Open_Text.style.display='none'; Codehighlighter1_100_124_Closed_Image.style.display='inline'; Codehighlighter1_100_124_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_100_124_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_100_124_Closed_Text.style.display='none'; Codehighlighter1_100_124_Open_Image.style.display='inline'; Codehighlighter1_100_124_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> (obj </span>
						<span style="COLOR: #0000ff">instanceof</span>
						<span style="COLOR: #000000"> PA)</span>
						<span id="Codehighlighter1_100_124_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_100_124_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080"> 5</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        ((PA)obj).runPA();<br /></span>
								<span style="COLOR: #008080"> 6</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_151_175_Open_Image" onclick="this.style.display='none'; Codehighlighter1_151_175_Open_Text.style.display='none'; Codehighlighter1_151_175_Closed_Image.style.display='inline'; Codehighlighter1_151_175_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_151_175_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_151_175_Closed_Text.style.display='none'; Codehighlighter1_151_175_Open_Image.style.display='inline'; Codehighlighter1_151_175_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #0000ff">else</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(obj </span>
						<span style="COLOR: #0000ff">instanceof</span>
						<span style="COLOR: #000000"> PB)</span>
						<span id="Codehighlighter1_151_175_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_151_175_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080"> 7</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        ((PB)obj).runPB();<br /></span>
								<span style="COLOR: #008080"> 8</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_202_226_Open_Image" onclick="this.style.display='none'; Codehighlighter1_202_226_Open_Text.style.display='none'; Codehighlighter1_202_226_Closed_Image.style.display='inline'; Codehighlighter1_202_226_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_202_226_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_202_226_Closed_Text.style.display='none'; Codehighlighter1_202_226_Open_Image.style.display='inline'; Codehighlighter1_202_226_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #0000ff">else</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(obj </span>
						<span style="COLOR: #0000ff">instanceof</span>
						<span style="COLOR: #000000"> PC)</span>
						<span id="Codehighlighter1_202_226_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_202_226_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080"> 9</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        ((PC)obj).runPC();<br /></span>
								<span style="COLOR: #008080">10</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_253_277_Open_Image" onclick="this.style.display='none'; Codehighlighter1_253_277_Open_Text.style.display='none'; Codehighlighter1_253_277_Closed_Image.style.display='inline'; Codehighlighter1_253_277_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_253_277_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_253_277_Closed_Text.style.display='none'; Codehighlighter1_253_277_Open_Image.style.display='inline'; Codehighlighter1_253_277_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #0000ff">else</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(obj </span>
						<span style="COLOR: #0000ff">instanceof</span>
						<span style="COLOR: #000000"> PD)</span>
						<span id="Codehighlighter1_253_277_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_253_277_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080">11</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        ((PD)obj).runPD();<br /></span>
								<span style="COLOR: #008080">12</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_304_328_Open_Image" onclick="this.style.display='none'; Codehighlighter1_304_328_Open_Text.style.display='none'; Codehighlighter1_304_328_Closed_Image.style.display='inline'; Codehighlighter1_304_328_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_304_328_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_304_328_Closed_Text.style.display='none'; Codehighlighter1_304_328_Open_Image.style.display='inline'; Codehighlighter1_304_328_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #0000ff">else</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(obj </span>
						<span style="COLOR: #0000ff">instanceof</span>
						<span style="COLOR: #000000"> PE)</span>
						<span id="Codehighlighter1_304_328_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_304_328_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080">13</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        ((PE)obj).runPE();<br /></span>
								<span style="COLOR: #008080">14</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">15</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
		<p>
				<br />三：新问题及分析解决<br />当数目变多的时候，维护if else是个费力气的事情：<br />仔细分析if,else做的工作，首先判断类型，然後根据类型执行相应的函数<br />如何才能解决这两个问题呢？首先想到的是java的多态，多态就是根据参数执行相应的内容，<br />能很容易的解决第二个问题，我们可以写这样一个类：<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span>
				<img id="Codehighlighter1_20_232_Open_Image" onclick="this.style.display='none'; Codehighlighter1_20_232_Open_Text.style.display='none'; Codehighlighter1_20_232_Closed_Image.style.display='inline'; Codehighlighter1_20_232_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_20_232_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_20_232_Closed_Text.style.display='none'; Codehighlighter1_20_232_Open_Image.style.display='inline'; Codehighlighter1_20_232_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> visitor</span>
				<span id="Codehighlighter1_20_232_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_20_232_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080"> 2</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_45_62_Open_Image" onclick="this.style.display='none'; Codehighlighter1_45_62_Open_Text.style.display='none'; Codehighlighter1_45_62_Closed_Image.style.display='inline'; Codehighlighter1_45_62_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_45_62_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_45_62_Closed_Text.style.display='none'; Codehighlighter1_45_62_Open_Image.style.display='inline'; Codehighlighter1_45_62_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> run(PA pa)</span>
						<span id="Codehighlighter1_45_62_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_45_62_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080"> 3</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        pa.runPA();<br /></span>
								<span style="COLOR: #008080"> 4</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080"> 5</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_87_104_Open_Image" onclick="this.style.display='none'; Codehighlighter1_87_104_Open_Text.style.display='none'; Codehighlighter1_87_104_Closed_Image.style.display='inline'; Codehighlighter1_87_104_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_87_104_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_87_104_Closed_Text.style.display='none'; Codehighlighter1_87_104_Open_Image.style.display='inline'; Codehighlighter1_87_104_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> run(PB pb)</span>
						<span id="Codehighlighter1_87_104_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_87_104_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080"> 6</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        pb.runPB();<br /></span>
								<span style="COLOR: #008080"> 7</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080"> 8</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_129_146_Open_Image" onclick="this.style.display='none'; Codehighlighter1_129_146_Open_Text.style.display='none'; Codehighlighter1_129_146_Closed_Image.style.display='inline'; Codehighlighter1_129_146_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_129_146_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_129_146_Closed_Text.style.display='none'; Codehighlighter1_129_146_Open_Image.style.display='inline'; Codehighlighter1_129_146_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> run(PC pc)</span>
						<span id="Codehighlighter1_129_146_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_129_146_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080"> 9</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        pc.runPC();<br /></span>
								<span style="COLOR: #008080">10</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">11</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_171_188_Open_Image" onclick="this.style.display='none'; Codehighlighter1_171_188_Open_Text.style.display='none'; Codehighlighter1_171_188_Closed_Image.style.display='inline'; Codehighlighter1_171_188_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_171_188_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_171_188_Closed_Text.style.display='none'; Codehighlighter1_171_188_Open_Image.style.display='inline'; Codehighlighter1_171_188_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> run(PD pd)</span>
						<span id="Codehighlighter1_171_188_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_171_188_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080">12</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        pd.runPD();<br /></span>
								<span style="COLOR: #008080">13</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">14</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_213_230_Open_Image" onclick="this.style.display='none'; Codehighlighter1_213_230_Open_Text.style.display='none'; Codehighlighter1_213_230_Closed_Image.style.display='inline'; Codehighlighter1_213_230_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_213_230_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_213_230_Closed_Text.style.display='none'; Codehighlighter1_213_230_Open_Image.style.display='inline'; Codehighlighter1_213_230_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> run(PE pe)</span>
						<span id="Codehighlighter1_213_230_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_213_230_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080">15</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        pe.runPE();<br /></span>
								<span style="COLOR: #008080">16</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">17</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
		<p>
				<br />这样只要调用run方法，传入对应的参数就能执行了。<br />还有一个问题就是判断类型。由于重载(overloading)是静态多分配（java语言本身是支持"静态多分配"的。<br />关于这个概念请看这里)所以造成重载只根据传入对象的定义类型，而不是实际的类型，所以必须在传入前就确定类型，<br />这可是个难的问题,因为在容器中对象全是Object，出来后要是判断是什么类型必须用<br />if (xx instanceof xxx)这种方法，如果用这种方法启不是又回到了原点，有没有什么更好的办法呢？</p>
		<p>我们知到Java还有另外一个特点，覆写(overriding)，而覆写是"动态单分配"的（关于这个概念见这里)，<br />那如何利用这个来实现呢？看下边这个方法:<br /> 我们让上边的一些类PA PB PC PD PE都实现一个接口P,加入一个方法,accept();<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span>
				<img id="Codehighlighter1_29_55_Open_Image" onclick="this.style.display='none'; Codehighlighter1_29_55_Open_Text.style.display='none'; Codehighlighter1_29_55_Closed_Image.style.display='inline'; Codehighlighter1_29_55_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_29_55_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_29_55_Closed_Text.style.display='none'; Codehighlighter1_29_55_Open_Image.style.display='inline'; Codehighlighter1_29_55_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> accept(visitor v)</span>
				<span id="Codehighlighter1_29_55_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_29_55_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080"> 2</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">把自己传入1</span>
						<span style="COLOR: #008000">
								<br />
						</span>
						<span style="COLOR: #008080"> 3</span>
						<span style="COLOR: #008000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">    v.run(</span>
						<span style="COLOR: #0000ff">this</span>
						<span style="COLOR: #000000">);<br /></span>
						<span style="COLOR: #008080"> 4</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />然後在visitor中加入一个方法<br /></span>
				<span style="COLOR: #008080"> 6</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_95_124_Open_Image" onclick="this.style.display='none'; Codehighlighter1_95_124_Open_Text.style.display='none'; Codehighlighter1_95_124_Closed_Image.style.display='inline'; Codehighlighter1_95_124_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_95_124_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_95_124_Closed_Text.style.display='none'; Codehighlighter1_95_124_Open_Image.style.display='inline'; Codehighlighter1_95_124_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> run(P p)</span>
				<span id="Codehighlighter1_95_124_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_95_124_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080"> 7</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">把自己传入2</span>
						<span style="COLOR: #008000">
								<br />
						</span>
						<span style="COLOR: #008080"> 8</span>
						<span style="COLOR: #008000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">    p.accept(</span>
						<span style="COLOR: #0000ff">this</span>
						<span style="COLOR: #000000">);<br /></span>
						<span style="COLOR: #008080"> 9</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">10</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">这样你在遍历中可以这样写</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">11</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">Visitor v </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> Visitor();<br /></span>
				<span style="COLOR: #008080">12</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Iterator ie </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> list.iterator();<br /></span>
				<span style="COLOR: #008080">13</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_218_257_Open_Image" onclick="this.style.display='none'; Codehighlighter1_218_257_Open_Text.style.display='none'; Codehighlighter1_218_257_Closed_Image.style.display='inline'; Codehighlighter1_218_257_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_218_257_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_218_257_Closed_Text.style.display='none'; Codehighlighter1_218_257_Open_Image.style.display='inline'; Codehighlighter1_218_257_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">while</span>
				<span style="COLOR: #000000">(ie.hasNext())</span>
				<span id="Codehighlighter1_218_257_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_218_257_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080">14</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    P p </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> (P)ie.next();<br /></span>
						<span style="COLOR: #008080">15</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        p.accept(v);<br /></span>
						<span style="COLOR: #008080">16</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span>
				</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">17</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />}</span>
		</div>
		<p>
				<br />首先执行的是"把自己传入2"，在这里由于Java的特性，实际执行的是子类的accept(),也就是实际类的accept<br />然後是"把自己传入1"，在这里再次把this传入，就明确类型，ok我们巧妙的利用overriding解决了这个问题<br />其实归纳一下第二部分，一个关键点是"自己认识自己"，是不是很可笑。<br />其实在计算计技术领域的很多技术上看起来很高深的东西，其实就是现有社会中人的生活方式的一种映射<br />而且这种方式是简单的不能再简单的方式。上边的全部过程基本上是一个简单的visitor模式实现,visitor模式<br />已经是设计模式中比较复杂的模式了，但其实原理简单到你想笑。看看下边这个比喻也许你的理解会更深刻。</p>
		<p>四：一个帮助理解的比喻：<br />题目：指挥工人工作<br />条件：你有10个全能工人，10样相同工作。<br />需求：做完工作<br />实现：大喊一声所有人去工作</p>
		<p>条件变了，工人不是全能，但是工作相同，ok问题不大<br />条件再变,工作不是相同，但工人是全能，ok问题不大</p>
		<p>以上三种情况在现实生活中是很少发生得，最多的情况是这样：<br />10个工人，每人会做一种工作，10样工作。你又一份名单Collection)写着谁做什么。但你不认识任何人<br />这个时候你怎么指挥呢，方案一：<br />你可以一个个的叫工人，然後问他们名字，认识他们，查名单，告诉他们做什么工作。<br />你可以直接叫出他们名字，告诉他们干什么，不需要知到他是谁。<br />看起来很简单。但如果你要指挥10万人呢 ？而且人员是流动的，每天的人不同，你每天拿到一张文档。<br />其实很简单，最常用的做法是，你把这份名单贴在墙上，然後大喊一声，所有人按照去看，按照自己的分配情况去做。<br />这里利用的关键点是"所有工人自己认识自己"，你不能苛求每个工人会做所有工作，不能苛求所有工作相同，但你<br />能要求所有工人都认识自己。</p>
		<p>再想想我们开始的程序,每个工人对应着PA PB PC PD PE....<br />所有的工人都使工人P<br />每个工人会做的东西不一样runPA runPB runPC<br />你有一份名单Visitor（重载）记录着谁做什么工作。</p>
		<p>看完上边这些，你是不是会产生如下的问题：<br />问题：为什么不把这些方法的方法名做成一样的，那就可以解决了。<br />例如，我们每个PA ,PB ,PC都加入一个run 方法，然後run内部再调用自己对应的runPx()方法。<br />答案：有些时候从不同的角度考虑，或者因为实现的复杂度早成很难统一方法名。<br />例如上边指挥人工作的例子的例子，其实run方法就是大叫一声去工作，因为每个工人只会做一种工作，所以能行<br />但我们不能要求所有人只能会做一种事情，这个要求很愚蠢。所以如果每个工人会干两种或者多种工作呢,<br />也就是我PA 有runPA() walkPA()等等方法， PB有runPB() climbPB()等等。。。<br />这个时候按照名单做事才是最好的办法。</p>
		<p>五：作者的话<br />所以说模式中很多复杂的东西，在现实中其实是很基本的东西，多多代入代出能帮助理解模式。</p>
		<p>看完本文，如果你对visitor模式有更多的兴趣，想了解更多请看如下几篇文章。<br />1,<a href="/dreamstone/archive/2006/12/20/88947.html"><font color="#009933">静态分派，动态分派，多分派，单分派 --------------   visitor模式准备<br /></font></a>2,访问差异类型的集合类 ------------------------   visitor模式入门（本文）<br /><a href="/dreamstone/archive/2006/12/20/88948.html"><font color="#009933">3,visitor模式理论及学术概念-------------－-----   visitor模式深入</font></a><br />4，<a href="/dreamstone/archive/2006/12/18/88625.html"><font color="#009933">重载overloading和覆写overriding哪个更早执行--   visitor帮助篇 <br /></font></a>虽然排列顺序是1,2,3,4 但是我个人建议的学习方式是2,1,3,4因为这个顺序更方便一般人理解<br /><br /><br /><br /></p>
		<h4>
				<a title="permalink: re: 访问差异类型的集合类--visitor模式入门" href="/dreamstone/archive/2006/12/18/88623.aspx#88679">
						<font color="#009933">#</font>
				</a> <a name="88679"></a>re: 访问差异类型的集合类--visitor模式入门 <span><font color="#999999">2006-12-19 09:37 </font></span><a id="AjaxHolder_Comments_CommentList_ctl00_NameLink" target="_blank">hannyu</a></h4>
		<p>我有一个疑问，下面这段代码是不是少写了什么东西？我怎么觉得p.accept与v.run之间是死循环呢？请解释一下 <br />1 public void accept(visitor v) { <br />2 // 把自己传入1 <br />3 v.run( this ); <br />4 } <br />5 然後在visitor中加入一个方法 <br />6 public void run(P p) { <br />7 // 把自己传入2 <br />8 p.accept( this ); <br />9 } <br />10 // 这样你在遍历中可以这样写 <br />11 Visitor v = new Visitor(); <br />12 Iterator ie = list.iterator(); <br />13 while (ie.hasNext()) { <br />14 P p = (P)ie.next(); <br />15 p.accept(v); <br />16 } <br />17 }   <a onclick="return SetReplyAuhor(&quot;hannyu&quot;)" href="/dreamstone/archive/2006/12/18/88623.aspx#post"><font color="#009933">回复</font></a>  <a title="查看该作者发表过的评论" href="/comment?author=hannyu" target="_blank"><font color="#009933">更多评论</font></a><a id="AjaxHolder_Comments_CommentList_ctl00_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl00$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl00_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 访问差异类型的集合类--visitor模式入门" href="/dreamstone/archive/2006/12/18/88623.aspx#88688">
						<font color="#009933">#</font>
				</a> <a name="88688"></a>re: 访问差异类型的集合类--visitor模式入门 <span><font color="#999999">2006-12-19 09:46 </font></span><a id="AjaxHolder_Comments_CommentList_ctl01_NameLink" target="_blank">themax</a></h4>
		<p>首先执行的是"把自己传入2"，??? <br />应该是"把自己传入1"吧. <br /><br />  <a onclick="return SetReplyAuhor(&quot;themax&quot;)" href="/dreamstone/archive/2006/12/18/88623.aspx#post"><font color="#009933">回复</font></a>  <a title="查看该作者发表过的评论" href="/comment?author=themax" target="_blank"><font color="#009933">更多评论</font></a><a id="AjaxHolder_Comments_CommentList_ctl01_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl01$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl01_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 访问差异类型的集合类--visitor模式入门" href="/dreamstone/archive/2006/12/18/88623.aspx#88909">
						<font color="#009933">#</font>
				</a> <a name="88909"></a>re: 访问差异类型的集合类--visitor模式入门 <span><font color="#999999">2006-12-19 21:53 </font></span><a id="AjaxHolder_Comments_CommentList_ctl02_NameLink" href="/dreamstone/" target="_blank"><font color="#009933">dreamstone</font></a></h4>
		<p>to hannyu : <br />其实这就是visitor模式关键的地方，p.accept(v)的时候会发生向下转型，所以执行的是子类的accept()方法，而子类的accept()方法中，传入this就是子类而不是父类了。也就是说PA中调用v.run(this)其实传入的this是PA类型，而不是P类型了，这样visitor重载的时候就会执行run(Pa pa)而不是run(P p),所以不会死循环的。代码在公司，明天把代码上传，你执行一下就知道了。 <br />(上边就是说的自己认识自己了)  <a onclick="return SetReplyAuhor(&quot;dreamstone&quot;)" href="/dreamstone/archive/2006/12/18/88623.aspx#post"><font color="#009933">回复</font></a>  <a title="查看该作者发表过的评论" href="/comment?author=dreamstone" target="_blank"><font color="#009933">更多评论</font></a><a id="AjaxHolder_Comments_CommentList_ctl02_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl02$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl02_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 访问差异类型的集合类--visitor模式入门" href="/dreamstone/archive/2006/12/18/88623.aspx#88910">
						<font color="#009933">#</font>
				</a> <a name="88910"></a>re: 访问差异类型的集合类--visitor模式入门 <span><font color="#999999">2006-12-19 21:56 </font></span><a id="AjaxHolder_Comments_CommentList_ctl03_NameLink" href="/dreamstone/" target="_blank"><font color="#009933">dreamstone</font></a></h4>
		<p>to themax : <br />可能我写的有点歧意，我上边的“把自己传入2";是个label，相当于姓名一，姓名二，下边解释的是拿它来当label用，而不是把自己传入给第二个，sorry。  <a onclick="return SetReplyAuhor(&quot;dreamstone&quot;)" href="/dreamstone/archive/2006/12/18/88623.aspx#post"><font color="#009933">回复</font></a>  <a title="查看该作者发表过的评论" href="/comment?author=dreamstone" target="_blank"><font color="#009933">更多评论</font></a><a id="AjaxHolder_Comments_CommentList_ctl03_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl03$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl03_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 访问差异类型的集合类--visitor模式入门" href="/dreamstone/archive/2006/12/18/88623.aspx#88918">
						<font color="#009933">#</font>
				</a> <a name="88918"></a>re: 访问差异类型的集合类--visitor模式入门 <span><font color="#999999">2006-12-19 22:31 </font></span><a id="AjaxHolder_Comments_CommentList_ctl04_NameLink" href="/dreamstone/" target="_blank"><font color="#009933">dreamstone</font></a></h4>
		<p>另外，加入了source的下载，见文章开始，虽然简单，但是可以看看。 <br />个人感觉visitor模式是模式中比较复杂的。实现起来也是比较巧的.两次this的利用。好像有一种学术的叫法"返还球"  <a onclick="return SetReplyAuhor(&quot;dreamstone&quot;)" href="/dreamstone/archive/2006/12/18/88623.aspx#post"><font color="#009933">回复</font></a>  <a title="查看该作者发表过的评论" href="/comment?author=dreamstone" target="_blank"><font color="#009933">更多评论</font></a><a id="AjaxHolder_Comments_CommentList_ctl04_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl04$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl04_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 访问差异类型的集合类--visitor模式入门" href="/dreamstone/archive/2006/12/18/88623.aspx#88964">
						<font color="#009933">#</font>
				</a> <a name="88964"></a>re: 访问差异类型的集合类--visitor模式入门 <span><font color="#999999">2006-12-20 09:22 </font></span><a id="AjaxHolder_Comments_CommentList_ctl05_NameLink" target="_blank">hannyu</a></h4>
		<p>多谢，看了源代码终于明白了，visitor模式绕来绕去的真难理解。接口P应该只起来一个辅助作用，如果有个特殊点的命名就容易理解一些了。比如visitee？  <a onclick="return SetReplyAuhor(&quot;hannyu&quot;)" href="/dreamstone/archive/2006/12/18/88623.aspx#post"><font color="#009933">回复</font></a>  <a title="查看该作者发表过的评论" href="/comment?author=hannyu" target="_blank"><font color="#009933">更多评论</font></a><a id="AjaxHolder_Comments_CommentList_ctl05_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl05$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl05_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 访问差异类型的集合类--visitor模式入门" href="/dreamstone/archive/2006/12/18/88623.aspx#90281">
						<font color="#009933">#</font>
				</a> <a name="90281"></a>re: 访问差异类型的集合类--visitor模式入门 <span><font color="#999999">2006-12-27 13:07 </font></span><a id="AjaxHolder_Comments_CommentList_ctl06_NameLink" target="_blank">jounyc</a></h4>
		<p>我觉得把Visitor中 <br /><br />public void run(Person p) <br />{ <br />p.accept(this); <br />} <br /><br />去掉也可以运行， <br />因为在 p.accept(v); 时父类向下转型，执行子类的accept(Visitor v)， <br />然后就执行子类在Visitor中对应的run()了，和上面那段没有关系阿。 <br /><br />楼主出来解释下。  <a onclick="return SetReplyAuhor(&quot;jounyc&quot;)" href="/dreamstone/archive/2006/12/18/88623.aspx#post"><font color="#009933">回复</font></a>  <a title="查看该作者发表过的评论" href="/comment?author=jounyc" target="_blank"><font color="#009933">更多评论</font></a><a id="AjaxHolder_Comments_CommentList_ctl06_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl06$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl06_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 访问差异类型的集合类--visitor模式入门" href="/dreamstone/archive/2006/12/18/88623.aspx#90371">
						<font color="#009933">#</font>
				</a> <a name="90371"></a>re: 访问差异类型的集合类--visitor模式入门 <span><font color="#999999">2006-12-27 19:52 </font></span><a id="AjaxHolder_Comments_CommentList_ctl07_NameLink" target="_blank">dreamstone[匿名]</a></h4>
		<p>呵呵，其实我当时写这个是为了这样的情况，可能这种情况用的更多 <br />Visitor v = new Visitor(); <br />Iterator ie = list.iterator(); <br />while (ie.hasNext()) { <br />P p = (P)ie.next(); <br />v.run(p); <br />} <br />这个时候那个函数就必须有了。因为run(p)的时候必须在编译器有一个对应的函数，这两个的区别是看想问题的角度了。 <br />是让visitor 访问每一个p <br />还是让每一个P运行。 <br />不过更多情况应该是v.run(p)；更复合思考的习惯。后来发文的时候简化了一下。 <br /><br /><br />  <a onclick="return SetReplyAuhor(&quot;dreamstone[匿名]&quot;)" href="/dreamstone/archive/2006/12/18/88623.aspx#post"><font color="#009933">回复</font></a>  <a title="查看该作者发表过的评论" href="/comment?author=dreamstone%5b%e5%8c%bf%e5%90%8d%5d" target="_blank"><font color="#009933">更多评论</font></a><a id="AjaxHolder_Comments_CommentList_ctl07_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl07$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl07_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 访问差异类型的集合类--visitor模式入门[未登录]" href="/dreamstone/archive/2006/12/18/88623.aspx#98966">
						<font color="#009933">#</font>
				</a> <a name="98966"></a>re: 访问差异类型的集合类--visitor模式入门[未登录]<a name="Post"></a><span><font color="#999999">2007-02-09 11:52 </font></span><a id="AjaxHolder_Comments_CommentList_ctl08_NameLink" target="_blank">xmlspy</a></h4>
		<p>代码中 <br /><br />for(int i=0;i&lt;list.size();i++){ <br />P p = (P)list.get(i); <br />p.accept(v); <br />} <br /><br />这种方式严重影响性能!! <br /><br />改成: <br /><br />P p =null; <br />for(int i=0;i&lt;list.size();i++){ <br />p = (P)list.get(i); <br />p.accept(v); <br />} <br />  <a onclick="return SetReplyAuhor(&quot;xmlspy&quot;)" href="/dreamstone/archive/2006/12/18/88623.aspx#post"><font color="#009933">回复</font></a>  <a title="查看该作者发表过的评论" href="/comment?author=xmlspy" target="_blank"><font color="#009933">更多评论</font></a><a id="AjaxHolder_Comments_CommentList_ctl08_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl08$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl08_EditLink"></a></p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/100672.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-02-26 09:34 <a href="http://www.blogjava.net/liaojiyong/archive/2007/02/26/100672.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>探索Java NIO的历程（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100671.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Mon, 26 Feb 2007 01:33:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100671.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/100671.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100671.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/100671.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/100671.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 探索Java NIO的历程前段时间有些时间，打算看看NIO的东西，本来以为很快可以了解的东西，却用了很多时间。首先Goole NIO可以看到很多的教程，非阻塞,Buffer,内存映射，块读取前三个很快就有所了解尝试着写了些小程序，学习东西的时候总喜欢写点小例子。唯独块读取没有找到对应的东西。（在过程中，主要看了IBM 的NIO入门)		首先，IBM NIO入门中的语句-------------...&nbsp;&nbsp;<a href='http://www.blogjava.net/liaojiyong/archive/2007/02/26/100671.html'>阅读全文</a><img src ="http://www.blogjava.net/liaojiyong/aggbug/100671.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-02-26 09:33 <a href="http://www.blogjava.net/liaojiyong/archive/2007/02/26/100671.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重载overloading和覆写overriding哪个更早起作用-- visitor帮助篇(转)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100670.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Mon, 26 Feb 2007 01:31:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100670.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/100670.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100670.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/100670.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/100670.html</trackback:ping><description><![CDATA[
		<p>接受建议，改一下标题.例子不太恰当，我删除了。换成了回文中的例子。<br />重载overloading和覆写overriding哪个更早执行--   visitor帮助篇 <br />一：问题提出<br />虽然我们经常写程序用到重载和覆写，但是很少会考虑他们的执行顺序。下边的内容就是关于，他们同时出现时<br />哪个先起作用：<br />二：问题分析<br />Java是"动态单分派静态多分派语言"，这个定义已经多次提起，如果你不了解这些概念，看这里"visitor模式准备"<br />所以就注定了重载(静态多分派)要早于覆写(动态单分派)，因为静态分派是编绎期实现的，动态分派是执行期实现的。<br />三：验证<br /><a href="/dreamstone/archive/2006/12/20/88942.html">见这里</a><br /><br />最后的部分：</p>
		<p>看完本文，如果你对visitor模式有更多的兴趣，想了解更多请看如下几篇文章。<br />1,<a href="/dreamstone/archive/2006/12/20/88947.html">静态分派，动态分派，多分派，单分派 --------------   visitor模式准备<br /></a>2<a href="/dreamstone/archive/2006/12/18/88623.html">,访问差异类型的集合类 ------------------------   visitor模式入门</a><br />3,visitor模式理论及学术概念-------------－-----   visitor模式进一步<br />4，重载overloading和覆写overriding哪个更早执行--   visitor帮助篇 （本文）<br />虽然排列顺序是1,2,3,4但是我个人建议的学习方式是2,1,3,4因为这个顺序更方便一般人理解<br /><br /><br /><br /></p>
		<h4>
				<a title="permalink: re: 重载overloading和覆写overriding哪个更早执行--   visitor帮助篇 " href="/dreamstone/archive/2006/12/18/88625.aspx#88815">#</a> <a name="88815"></a>re: 重载overloading和覆写overriding哪个更早执行-- visitor帮助篇 <span>2006-12-19 15:42 </span><a id="AjaxHolder_Comments_CommentList_ctl00_NameLink" href="/yunjingxinwu/" target="_blank">云静心舞</a></h4>
		<p>.....字这么大....  <a onclick="return SetReplyAuhor(&quot;云静心舞&quot;)" href="/dreamstone/archive/2006/12/18/88625.aspx#post">回复</a>  <a title="查看该作者发表过的评论" href="/comment?author=%e4%ba%91%e9%9d%99%e5%bf%83%e8%88%9e" target="_blank">更多评论</a><a id="AjaxHolder_Comments_CommentList_ctl00_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl00$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl00_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 重载overloading和覆写overriding哪个更早执行--   visitor帮助篇 " href="/dreamstone/archive/2006/12/18/88625.aspx#88860">#</a> <a name="88860"></a>re: 重载overloading和覆写overriding哪个更早执行-- visitor帮助篇 <span>2006-12-19 18:11 </span><a id="AjaxHolder_Comments_CommentList_ctl01_NameLink" href="http://blog.csdn.net/lesky" target="_blank">圣川</a></h4>
		<p>我感觉不是这样的 <br />因为你是这样定义的 <br />Parent p = new Child(); <br /><br />这样p其实并不知道它的子类有个 run（String）方法，这种现象在继承中叫切割现象，所以p会调用自己的run（Object）方法，之所以会是子类的结果是因为这个时候发生了一个向下转型而已。如果你换成Child p = new Child()就是另一个结果了。 <br />  <a onclick="return SetReplyAuhor(&quot;圣川&quot;)" href="/dreamstone/archive/2006/12/18/88625.aspx#post">回复</a>  <a title="查看该作者发表过的评论" href="/comment?author=%e5%9c%a3%e5%b7%9d" target="_blank">更多评论</a><a id="AjaxHolder_Comments_CommentList_ctl01_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl01$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl01_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 重载overloading和覆写overriding哪个更早执行--   visitor帮助篇 " href="/dreamstone/archive/2006/12/18/88625.aspx#88912">#</a> <a name="88912"></a>re: 重载overloading和覆写overriding哪个更早执行-- visitor帮助篇 <span>2006-12-19 21:59 </span><a id="AjaxHolder_Comments_CommentList_ctl02_NameLink" href="/dreamstone/" target="_blank">dreamstone</a></h4>
		<p>to 圣川: <br />如果是Child p = new Child()就没有区别了，因为这样无论怎么执行结果是一样的。 <br />不过仔细想想我的例子可能并不恰当，例子展示的好像是向下转型和重载哪个发生更早些。不过这个说法应该是对的，因为重载是编译器确定的.  <a onclick="return SetReplyAuhor(&quot;dreamstone&quot;)" href="/dreamstone/archive/2006/12/18/88625.aspx#post">回复</a>  <a title="查看该作者发表过的评论" href="/comment?author=dreamstone" target="_blank">更多评论</a><a id="AjaxHolder_Comments_CommentList_ctl02_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl02$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl02_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 重载overloading和覆写overriding哪个更早执行--   visitor帮助篇 " href="/dreamstone/archive/2006/12/18/88625.aspx#88913">#</a> <a name="88913"></a>re: 重载overloading和覆写overriding哪个更早执行-- visitor帮助篇 <span>2006-12-19 22:04 </span><a id="AjaxHolder_Comments_CommentList_ctl03_NameLink" href="http://gg_shily@163.com/" target="_blank">gg_shily</a></h4>
		<p>@圣川 <br />对，Parent p = new Child(); 这样定义以后，p只能调用Parent的run方法和Child overriding 后的run方法，你如果调用Child overloading后的方法必须要向下转型，也就是说你的Parent类里如果没有run(Object)这个方法，你的这条语句：p.run(str); 也是不能调用的 <br />  <a onclick="return SetReplyAuhor(&quot;gg_shily&quot;)" href="/dreamstone/archive/2006/12/18/88625.aspx#post">回复</a>  <a title="查看该作者发表过的评论" href="/comment?author=gg_shily" target="_blank">更多评论</a><a id="AjaxHolder_Comments_CommentList_ctl03_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl03$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl03_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 重载overloading和覆写overriding哪个更早执行--   visitor帮助篇 " href="/dreamstone/archive/2006/12/18/88625.aspx#88915">#</a> <a name="88915"></a>re: 重载overloading和覆写overriding哪个更早执行-- visitor帮助篇 <span>2006-12-19 22:11 </span><a id="AjaxHolder_Comments_CommentList_ctl04_NameLink" href="http://gg_shily@163.com/" target="_blank">gg_shily</a></h4>
		<p>我觉得重载和重构本身就是两个不相干的事情，不会存在那个更早执行的问题，因为他们两个是不会重复的，你的方法要么是重载要么是重构，怎么会有个方法既是重写又是重构呢？举个例子先  <a onclick="return SetReplyAuhor(&quot;gg_shily&quot;)" href="/dreamstone/archive/2006/12/18/88625.aspx#post">回复</a>  <a title="查看该作者发表过的评论" href="/comment?author=gg_shily" target="_blank">更多评论</a><a id="AjaxHolder_Comments_CommentList_ctl04_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl04$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl04_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 重载overloading和覆写overriding哪个更早执行--   visitor帮助篇 " href="/dreamstone/archive/2006/12/18/88625.aspx#88920">#</a> <a name="88920"></a>re: 重载overloading和覆写overriding哪个更早执行-- visitor帮助篇 <span>2006-12-19 22:44 </span><a id="AjaxHolder_Comments_CommentList_ctl05_NameLink" href="/dreamstone/" target="_blank">dreamstone</a></h4>
		<p>to gg_shily : <br />现在想来我的例子可能有些问题，但是重载和覆写还是可以同时出现的： <br />class Parent { <br />public void run(Object o) { <br />System.out.println(" in Parent +param:object "); <br />} <br /><br />public void run(String str) { <br />System.out.println(" in Parent + param:int "); <br />} <br />} <br /><br />class Child extends Parent { <br /><br />public void run(Object o) { <br />System.out.println(" in Child +param:Object "); <br />} <br /><br />public void run(String str) { <br />System.out.println(" in Child + param:String "); <br />} <br /><br />public static void main(String[] args) { <br />Parent p = new Child(); <br />String str = new String(); <br />p.run(str); <br />} <br />} <br />下边这种情况in Child + param:String 打印出来，必定是经历了一次重载和一次向下转型，没有向下转型Parent不可能变成child，无论是在父类还是子类的两个函数中选择必定就是重载，所以重复出现是可能的。 <br />只是这样就体现不出来执行顺序了，所以我改了一个版本出来，现在向来但是的更改有写欠考虑。但是这个问题肯定是存在的。 <br />  <a onclick="return SetReplyAuhor(&quot;dreamstone&quot;)" href="/dreamstone/archive/2006/12/18/88625.aspx#post">回复</a>  <a title="查看该作者发表过的评论" href="/comment?author=dreamstone" target="_blank">更多评论</a><a id="AjaxHolder_Comments_CommentList_ctl05_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl05$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl05_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 重载overloading和覆写overriding哪个更早执行--   visitor帮助篇 " href="/dreamstone/archive/2006/12/18/88625.aspx#88927">#</a> <a name="88927"></a>re: 重载overloading和覆写overriding哪个更早执行-- visitor帮助篇 <span>2006-12-19 23:01 </span><a id="AjaxHolder_Comments_CommentList_ctl06_NameLink" href="http://gg_shily@163.com/" target="_blank">gg_shily</a></h4>
		<p>我觉得你的这两个方法都是对父类方法的overriding 而不是overloading 所以程序发生了多态效应，run（String）方法通过动态邦定运行的是子类的方法，而没有经历重载  <a onclick="return SetReplyAuhor(&quot;gg_shily&quot;)" href="/dreamstone/archive/2006/12/18/88625.aspx#post">回复</a>  <a title="查看该作者发表过的评论" href="/comment?author=gg_shily" target="_blank">更多评论</a><a id="AjaxHolder_Comments_CommentList_ctl06_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl06$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl06_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 重载overloading和覆写overriding哪个更早执行--   visitor帮助篇 " href="/dreamstone/archive/2006/12/18/88625.aspx#88928">#</a> <a name="88928"></a>re: 重载overloading和覆写overriding哪个更早执行-- visitor帮助篇 <span>2006-12-19 23:05 </span><a id="AjaxHolder_Comments_CommentList_ctl07_NameLink" href="http://gg_shily@163.com/" target="_blank">gg_shily</a></h4>
		<p>有时间可以直接交流一下，我的qq：30622882 我晚上一般在但都是隐身  <a onclick="return SetReplyAuhor(&quot;gg_shily&quot;)" href="/dreamstone/archive/2006/12/18/88625.aspx#post">回复</a>  <a title="查看该作者发表过的评论" href="/comment?author=gg_shily" target="_blank">更多评论</a><a id="AjaxHolder_Comments_CommentList_ctl07_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl07$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl07_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 重载overloading和覆写overriding哪个更早执行--   visitor帮助篇 " href="/dreamstone/archive/2006/12/18/88625.aspx#88940">#</a> <a name="88940"></a>re: 重载overloading和覆写overriding哪个更早执行-- visitor帮助篇 <span>2006-12-20 00:09 </span><a id="AjaxHolder_Comments_CommentList_ctl08_NameLink" href="/dreamstone/" target="_blank">dreamstone</a></h4>
		<p>对啊，是对父类的overriding，但是到了子类后就需要overloading了。 <br />所以你认为是先向下转型，然后在子类内overloading ? <br /><br />我很少用qq，给你发邮件了，看看收到没，我发到gg_shily(AT)163.com了。  <a onclick="return SetReplyAuhor(&quot;dreamstone&quot;)" href="/dreamstone/archive/2006/12/18/88625.aspx#post">回复</a>  <a title="查看该作者发表过的评论" href="/comment?author=dreamstone" target="_blank">更多评论</a><a id="AjaxHolder_Comments_CommentList_ctl08_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl08$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl08_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 重载overloading和覆写overriding哪个更早执行--   visitor帮助篇 " href="/dreamstone/archive/2006/12/18/88625.aspx#88943">#</a> <a name="88943"></a>re: 重载overloading和覆写overriding哪个更早执行-- visitor帮助篇 <span>2006-12-20 00:38 </span><a id="AjaxHolder_Comments_CommentList_ctl09_NameLink" href="/dreamstone/" target="_blank">dreamstone</a></h4>
		<p>另外我又从另一个角度看了一下，你看看这个文章： <br /><a href="/dreamstone/archive/2006/12/20/88942.html" target="_new">http://www.blogjava.net/dreamstone/archive/2006/12/20/88942.html</a>  <a onclick="return SetReplyAuhor(&quot;dreamstone&quot;)" href="/dreamstone/archive/2006/12/18/88625.aspx#post">回复</a>  <a title="查看该作者发表过的评论" href="/comment?author=dreamstone" target="_blank">更多评论</a><a id="AjaxHolder_Comments_CommentList_ctl09_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl09$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl09_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 重载overloading和覆写overriding哪个更早执行--   visitor帮助篇 " href="/dreamstone/archive/2006/12/18/88625.aspx#88982">#</a> <a name="88982"></a>re: 重载overloading和覆写overriding哪个更早执行-- visitor帮助篇 <span>2006-12-20 10:28 </span><a id="AjaxHolder_Comments_CommentList_ctl10_NameLink" target="_blank">daydream</a></h4>
		<p>觉得overload和override是不同的两回事，不存在哪个先执行的问题。 <br /><br />overload是在编译期间根据变量的声明类型，在声明类型中寻找最匹配的方法原型， <br />Parent p = new Child(); <br />p.run("..."); <br />在编译期间会在Parent类中寻找一个最匹配的方法原型（方法签名）， <br /><br />然后运行期间，因为run方法在Parent类中不是静态的、也不是final的（java中的方法默认是override的），所以，会再根据实际的对象类型，查找从实际类型到Parent类型之间、所有重写了同一个方法签名的所有方法（这儿查找的是相同的方法签名），如果找到了，就执行子类的方法。  <a onclick="return SetReplyAuhor(&quot;daydream&quot;)" href="/dreamstone/archive/2006/12/18/88625.aspx#post">回复</a>  <a title="查看该作者发表过的评论" href="/comment?author=daydream" target="_blank">更多评论</a><a id="AjaxHolder_Comments_CommentList_ctl10_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl10$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl10_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 重载overloading和覆写overriding哪个更早执行--   visitor帮助篇 " href="/dreamstone/archive/2006/12/18/88625.aspx#88984">#</a> <a name="88984"></a>re: 重载overloading和覆写overriding哪个更早执行-- visitor帮助篇 <span>2006-12-20 10:32 </span><a id="AjaxHolder_Comments_CommentList_ctl11_NameLink" target="_blank">daydream</a></h4>
		<p>补充一下，就是说，overload和override是两个阶段的概念。 <br />在编译期没有override的概念，同样，在运行期，也没有overload的概念。  <a onclick="return SetReplyAuhor(&quot;daydream&quot;)" href="/dreamstone/archive/2006/12/18/88625.aspx#post">回复</a>  <a title="查看该作者发表过的评论" href="/comment?author=daydream" target="_blank">更多评论</a><a id="AjaxHolder_Comments_CommentList_ctl11_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl11$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl11_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 重载overloading和覆写overriding哪个更早执行--   visitor帮助篇 " href="/dreamstone/archive/2006/12/18/88625.aspx#88990">#</a> <a name="88990"></a>re: 重载overloading和覆写overriding哪个更早执行-- visitor帮助篇 <span>2006-12-20 10:49 </span><a id="AjaxHolder_Comments_CommentList_ctl12_NameLink" href="/wolfsquare/" target="_blank">wolfsquare</a></h4>
		<p>在每个类中,所有的方法入口偏移编译后都是已确定的, <br />所以无论你如何overload和overwrite,它的执行顺序也必是确定的,也就是说 <br />public static void test(Parent p,String str){ <br />p.run(str); <br />}编译时,已经知道了会最终调run(Object o) 还是run(String str),但这时候还不知道是哪个类的,当有overwrite的方法时,会转向overwrite的方法. <br />综上所述,如果是问执行顺序的话,LZ的问题就没有意义. <br />如果是问谁先确定,则是overload  <a onclick="return SetReplyAuhor(&quot;wolfsquare&quot;)" href="/dreamstone/archive/2006/12/18/88625.aspx#post">回复</a>  <a title="查看该作者发表过的评论" href="/comment?author=wolfsquare" target="_blank">更多评论</a><a id="AjaxHolder_Comments_CommentList_ctl12_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl12$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl12_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 重载overloading和覆写overriding哪个更早执行--   visitor帮助篇 " href="/dreamstone/archive/2006/12/18/88625.aspx#89033">#</a> <a name="89033"></a>re: 重载overloading和覆写overriding哪个更早执行-- visitor帮助篇 <span>2006-12-20 14:30 </span><a id="AjaxHolder_Comments_CommentList_ctl13_NameLink" target="_blank">mu!!</a></h4>
		<p>这里面是两个问题 <br />1，继承中的切割现象。 <br />楼上的兄弟也说了 <br />就是说子类中的Overload函数，通过父类的对象是调不到的。 <br />Parent p = new Child(); <br />定义后，p不可能直接调到Child中比Parent多出来的任何方法。 <br /><br />2，仅仅参数类型不同，而且是类型不同是发生在基类和子类之间的Overload的函数如何被调用。 <br />这里的原则就是传什么，调什么。 <br />比如 <br />Child p = new Child(); <br />p.run(str); -&gt;出String <br />p.run((Object)str); -&gt;出Object <br /><br />说到底，Override和多态通过虚函数表实现。 <br />Overload通过Name-Marshalling实现。 <br /><br />另外，我不是很确定，但你的Vistor好像理解得有点问题。 <br />  <a onclick="return SetReplyAuhor(&quot;mu!!&quot;)" href="/dreamstone/archive/2006/12/18/88625.aspx#post">回复</a>  <a title="查看该作者发表过的评论" href="/comment?author=mu!!" target="_blank">更多评论</a><a id="AjaxHolder_Comments_CommentList_ctl13_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl13$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl13_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 重载overloading和覆写overriding哪个更早执行--   visitor帮助篇 " href="/dreamstone/archive/2006/12/18/88625.aspx#89035">#</a> <a name="89035"></a>re: 重载overloading和覆写overriding哪个更早执行-- visitor帮助篇 <span>2006-12-20 14:34 </span><a id="AjaxHolder_Comments_CommentList_ctl14_NameLink" target="_blank">mu!!</a></h4>
		<p>楼上的楼上的说得很好， <br />编译完之后，只剩下一个多态的问题了。 <br />重载在编译完成就没什么不确定的了。  <a onclick="return SetReplyAuhor(&quot;mu!!&quot;)" href="/dreamstone/archive/2006/12/18/88625.aspx#post">回复</a>  <a title="查看该作者发表过的评论" href="/comment?author=mu!!" target="_blank">更多评论</a><a id="AjaxHolder_Comments_CommentList_ctl14_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl14$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl14_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 重载overloading和覆写overriding哪个更早执行--   visitor帮助篇 " href="/dreamstone/archive/2006/12/18/88625.aspx#89055">#</a> <a name="89055"></a>re: 重载overloading和覆写overriding哪个更早执行-- visitor帮助篇 <span>2006-12-20 15:39 </span><a id="AjaxHolder_Comments_CommentList_ctl15_NameLink" href="/dreamstone/" target="_blank">dreamstone</a></h4>
		<p>to daydream : <br />觉得overload和override是不同的两回事，不存在哪个先执行的问题。 <br />～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～ <br />我并没有说两个是一会事，我只是说这两个的发生顺序不同。一个发生在编译器，一个发生在执行期。这个是我文章 一开始就说的。不过可能我的用词不太恰当。 <br />应该是说哪个最先发生  <a onclick="return SetReplyAuhor(&quot;dreamstone&quot;)" href="/dreamstone/archive/2006/12/18/88625.aspx#post">回复</a>  <a title="查看该作者发表过的评论" href="/comment?author=dreamstone" target="_blank">更多评论</a><a id="AjaxHolder_Comments_CommentList_ctl15_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl15$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl15_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 重载overloading和覆写overriding哪个更早执行--   visitor帮助篇 " href="/dreamstone/archive/2006/12/18/88625.aspx#89058">#</a> <a name="89058"></a>re: 重载overloading和覆写overriding哪个更早执行-- visitor帮助篇 <span>2006-12-20 15:51 </span><a id="AjaxHolder_Comments_CommentList_ctl16_NameLink" href="/dreamstone/" target="_blank">dreamstone</a></h4>
		<p>to wolfsquare : <br />在文章一开始我就说了： <br />所以就注定了重载(静态多分派)要早于覆写(动态单分派)，因为静态分派是编绎期实现的，动态分派是执行期实现的。 <br /><br />所以我们说的是一会事，不过我的文章题目有问题，应该改成哪个先起作用，或者先确定。谢谢指正。 <br /><br />另外其实很多东西有专业的术语，我可以直接引用，这样可以保正确切，并且不出问题，但是这些专业的术语经常会造成懂的人懂，不懂的人还是不懂，所以我想尽量用一些简单的平常的话来描述，这是我开始的想法，所以我的所有文章看起来并不是那么简练。在过程中经常会因为考虑不当，犯些错误，让人误解，甚至误导别人，所以谢谢你的指正，我会在有时间的时候修正这些错误。  <a onclick="return SetReplyAuhor(&quot;dreamstone&quot;)" href="/dreamstone/archive/2006/12/18/88625.aspx#post">回复</a>  <a title="查看该作者发表过的评论" href="/comment?author=dreamstone" target="_blank">更多评论</a><a id="AjaxHolder_Comments_CommentList_ctl16_DeleteLink" href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl16$DeleteLink','')"></a>  <a id="AjaxHolder_Comments_CommentList_ctl16_EditLink"></a></p>
		<h4>
				<a title="permalink: re: 重载overloading和覆写overriding哪个更早执行--   visitor帮助篇 " href="/dreamstone/archive/2006/12/18/88625.aspx#89062">#</a> <a name="89062"></a>re: 重载overloading和覆写overriding哪个更早执行-- visitor帮助篇 <a name="Post"></a><span>2006-12-20 15:55 </span><a id="AjaxHolder_Comments_CommentList_ctl17_NameLink" href="/dreamstone/" target="_blank">dreamstone</a></h4>
		<p>to mu!! : <br />我不知道你说的，我对Vistor好像理解得有点问题。 是指什么地方， <br />我这篇文章是为了在使用visitor模式中长出现的一些问题或者名词做个说明，并不是讲的visitor模式。 <br />如果你认为我对visitor模式的理解有问题的话，麻烦说明什么地方有问题？ <br /><br />另外你所说的切割现象是没问题的，我也知到，但是我们说的不是同一个东西。 </p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/100670.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-02-26 09:31 <a href="http://www.blogjava.net/liaojiyong/archive/2007/02/26/100670.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于声明变量的性能问题 (转)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100667.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Mon, 26 Feb 2007 01:21:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100667.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/100667.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100667.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/100667.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/100667.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 开启一个新的问题（关于声明变量的性能问题） (问题结束)		在我们编程的过程中经常会遇到这样的问题。for (int i=0;i&lt;n;i++){    String str = //}String str = null;for(int i=0;i&lt;n;i++){    str = //}在印象中一直认为方法二的性能好于方法一，但是差距应该很小。但因为一位别人的回文说方法一极大的影响...&nbsp;&nbsp;<a href='http://www.blogjava.net/liaojiyong/archive/2007/02/26/100667.html'>阅读全文</a><img src ="http://www.blogjava.net/liaojiyong/aggbug/100667.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-02-26 09:21 <a href="http://www.blogjava.net/liaojiyong/archive/2007/02/26/100667.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jdk1.5 annotation(转)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100666.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Mon, 26 Feb 2007 01:16:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100666.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/100666.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/02/26/100666.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/100666.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/100666.html</trackback:ping><description><![CDATA[
		<p>Jdk1.5 annotation 内置注释<br />1，什么是元数据:<br />元数据就是 关于数据的数据<br />2，元数据的作用<br />数据的好处分为三类：文档编制、编译器检查和代码分析。代码级文档最常被引用。元数据提供了一种有用的方法来<br />指明方法是否取决于其他方法，它们是否完整，特定类是否必须引用其他类，等等。这确实非常有用，但对于将元数<br />据添加到 Java 语言中来说，文档编制可能是 最不相关的理由。Javadoc 已经提供了非常容易理解和健壮的方<br />法来文档化代码。同时由于已经存在文档编制工具，并且在大多数时候都工作得很好时，所以基本上不需要编写<br />文档编制工具。</p>
		<p>内置的注释<br />Override它指明注释的方法将覆盖超类中的方法<br />如果你有一个父类如下：<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img id="Codehighlighter1_19_60_Open_Image" onclick="this.style.display='none'; Codehighlighter1_19_60_Open_Text.style.display='none'; Codehighlighter1_19_60_Closed_Image.style.display='inline'; Codehighlighter1_19_60_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_19_60_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_19_60_Closed_Text.style.display='none'; Codehighlighter1_19_60_Open_Image.style.display='inline'; Codehighlighter1_19_60_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> Parent</span>
				<span id="Codehighlighter1_19_60_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_19_60_Open_Text">
						<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_55_58_Open_Image" onclick="this.style.display='none'; Codehighlighter1_55_58_Open_Text.style.display='none'; Codehighlighter1_55_58_Closed_Image.style.display='inline'; Codehighlighter1_55_58_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_55_58_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_55_58_Closed_Text.style.display='none'; Codehighlighter1_55_58_Open_Image.style.display='inline'; Codehighlighter1_55_58_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> methodOne(String str)</span>
						<span id="Codehighlighter1_55_58_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_55_58_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />一个子类如下<br /><img id="Codehighlighter1_103_155_Open_Image" onclick="this.style.display='none'; Codehighlighter1_103_155_Open_Text.style.display='none'; Codehighlighter1_103_155_Closed_Image.style.display='inline'; Codehighlighter1_103_155_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_103_155_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_103_155_Closed_Text.style.display='none'; Codehighlighter1_103_155_Open_Image.style.display='inline'; Codehighlighter1_103_155_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> Child </span>
				<span style="COLOR: #0000ff">extends</span>
				<span style="COLOR: #000000"> Parent </span>
				<span id="Codehighlighter1_103_155_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_103_155_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    @Override<br /><img id="Codehighlighter1_150_153_Open_Image" onclick="this.style.display='none'; Codehighlighter1_150_153_Open_Text.style.display='none'; Codehighlighter1_150_153_Closed_Image.style.display='inline'; Codehighlighter1_150_153_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_150_153_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_150_153_Closed_Text.style.display='none'; Codehighlighter1_150_153_Open_Image.style.display='inline'; Codehighlighter1_150_153_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> methodOne(String str)</span>
						<span id="Codehighlighter1_150_153_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_150_153_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
		<p>你想让子类Override父类的方法methodOne(String str);如果不加入@Override注释，并且刚好你写错了方法<br />例如写成public void methodone(String str)，这个时候时不会报错的。编译器正常通过，等以后你要寻找这个<br />错误的时候需要花费大量的时间。如果这个时候你写了@Override注释，编译器会检查父类中是否有这个方法，如果没有<br />就提示错误。这样可以尽早的发现错误。</p>
		<p>Deprecated与 Override 一样， Deprecated 是标记注释。可以使用 Deprecated 来对不应再使用的方法进行注释。<br />这个不详细了说了，JDK里边有大量的应用，平时应用也不少，就是标记一些方法不建议使用。例如Date的很多方法。</p>
		<p>SuppressWarnings用来阻止一些无所谓的警告<br />在使用JDK1.5后，如果你写如下一个方法：<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img id="Codehighlighter1_33_83_Open_Image" onclick="this.style.display='none'; Codehighlighter1_33_83_Open_Text.style.display='none'; Codehighlighter1_33_83_Closed_Image.style.display='inline'; Codehighlighter1_33_83_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_33_83_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_33_83_Closed_Text.style.display='none'; Codehighlighter1_33_83_Open_Image.style.display='inline'; Codehighlighter1_33_83_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> methodOne(String str)</span>
				<span id="Codehighlighter1_33_83_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_33_83_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    List list </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> ArrayList();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    list.add(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">str</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>编绎器会提示警告，而这个代码本身是没有错误的，如果你想禁止这些无所谓的警告，就要使用SuppressWarnings了<br />有两种形式：<br />@SuppressWarnings("unchecked")<br />@SuppressWarnings(value={"unchecked"})<br />这两种都可以，如果你要阻止多个警告，就必须要使用第二种了，如下<br />@SuppressWarnings(value={"unchecked","fallthrough"})<br />上边的代码加入注释后如下：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">@SuppressWarnings(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">unchecked</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br /><img id="Codehighlighter1_64_114_Open_Image" onclick="this.style.display='none'; Codehighlighter1_64_114_Open_Text.style.display='none'; Codehighlighter1_64_114_Closed_Image.style.display='inline'; Codehighlighter1_64_114_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_64_114_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_64_114_Closed_Text.style.display='none'; Codehighlighter1_64_114_Open_Image.style.display='inline'; Codehighlighter1_64_114_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> methodOne(String str)</span><span id="Codehighlighter1_64_114_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_64_114_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    List list </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArrayList();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    list.add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">str</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>Jdk1.5 annotation 自定义注释<br />这里有一个写的不错的文章，我就不再重复了。<br /><a href="http://www.ibm.com/developerworks/cn/java/j-annotate2.html"><font color="#009933">http://www.ibm.com/developerworks/cn/java/j-annotate2.html</font></a><br /><a href="http://www.javaeye.com/subject/Annotation">http://www.javaeye.com/subject/Annotation</a><img src ="http://www.blogjava.net/liaojiyong/aggbug/100666.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-02-26 09:16 <a href="http://www.blogjava.net/liaojiyong/archive/2007/02/26/100666.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>