﻿<?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-Sung in Blog-文章分类-Ｊａｖａ</title><link>http://www.blogjava.net/qq13367612/category/3953.html</link><description>&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font class="subhead" size=3&gt;&lt;b&gt;一些技术文章 &amp; 一些生活杂碎&lt;/b&gt;&lt;/font&gt;</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 08:39:12 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 08:39:12 GMT</pubDate><ttl>60</ttl><item><title>AJAX基础教程</title><link>http://www.blogjava.net/qq13367612/articles/18822.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Tue, 08 Nov 2005 09:49:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/18822.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/18822.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/18822.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/18822.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/18822.html</trackback:ping><description><![CDATA[这篇文章将带您浏览整个AJAX的基本概貌,并展示两个简单的例子让您轻松上路. <BR><BR>　　什么是 AJAX? <BR>　　AJAX (异步 JavaScript 和 XML) 是个新产生的术语,专为描述JavaScript的两项强大性能.这两项性能在多年来一直被网络开发者所忽略,直到最近Gmail, Google suggest和google Maps的横空出世才使人们开始意识到其重要性. <BR><BR>　　这两项被忽视的性能是: <BR>　　无需重新装载整个页面便能向服务器发送请求. <BR>　　对XML文档的解析和处理．<BR><BR><FONT size=4><B>步骤 1 – "请!" --- 如何发送一个HTTP请求</B></FONT><BR><BR>　　为了用JavaScript向服务器发送一个HTTP请求, 需要一个具备这种功能的类实例. 这样的类首先由Internet Explorer以ActiveX对象引入, 被称为XMLHTTP. 后来Mozilla, Safari 和其他浏览器纷纷仿效, 提供了XMLHttpRequest类,它支持微软的ActiveX对象所提供的方法和属性. <BR><BR>　　因此, 为了创建一个跨浏览器的这样的类实例(对象), 可以应用如下代码: <BR>
<P class=code>if&nbsp;(window.XMLHttpRequest)&nbsp;{&nbsp;//&nbsp;Mozilla,&nbsp;Safari,&nbsp;...<BR>&nbsp;&nbsp;&nbsp;&nbsp;http_request&nbsp;=&nbsp;new&nbsp;XMLHttpRequest();<BR>}&nbsp;else&nbsp;if&nbsp;(window.ActiveXObject)&nbsp;{&nbsp;//&nbsp;IE<BR>&nbsp;&nbsp;&nbsp;&nbsp;http_request&nbsp;=&nbsp;new&nbsp;ActiveXObject("Microsoft.XMLHTTP");<BR>}</P>　　(上例对代码做了一定简化,这是为了解释如何创建XMLHTTP类实例. 实际的代码实例可参阅本篇步骤3.) <BR><BR>　　如果服务器的响应没有XML mime-type header,某些Mozilla浏览器可能无法正常工作. 为了解决这个问题, 如果服务器响应的header不是text/xml,可以调用其它方法修改该header. <BR>
<P class=code>http_request&nbsp;=&nbsp;new&nbsp;XMLHttpRequest();<BR>http_request.overrideMimeType('text/xml');</P>　　接下来要决定当收到服务器的响应后,需要做什么.这需要告诉HTTP请求对象用哪一个JavaScript函数处理这个响应.可以将对象的onreadystatechange属性设置为要使用的JavaScript的函数名,如下所示: <BR><BR>http_request.onreadystatechange = nameOfTheFunction; <BR><BR>　　注意:在函数名后没有括号,也无需传递参数.另外还有一种方法,可以在扉页(fly)中定义函数及其对响应要采取的行为,如下所示: <BR>
<P class=code>http_request.onreadystatechange&nbsp;=&nbsp;function(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;do&nbsp;the&nbsp;thing<BR>};</P>　　在定义了如何处理响应后,就要发送请求了.可以调用HTTP请求类的open()和send()方法, 如下所示: <BR>
<P class=code>http_request.open('GET',&nbsp;'http://www.example.org/some.file',&nbsp;true);<BR>http_request.send(null);</P>　　open()的第一个参数是HTTP请求方式 – GET, POST, HEAD 或任何服务器所支持的您想调用的方式. 按照HTTP规范,该参数要大写;否则,某些浏览器(如Firefox)可能无法处理请求.有关HTTP请求方法的详细信息可参考http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html W3C specs <BR>　　第二个参数是请求页面的URL.由于自身安全特性的限制,该页面不能为第三方域名的页面.同时一定要保证在所有的页面中都使用准确的域名,否则调用open()会得到"permission denied"的错误提示.一个常见的错误是访问站点时使用domain.tld,而当请求页面时,却使用www.domain.tld. <BR>　　第三个参数设置请求是否为异步模式.如果是TRUE, JavaScript函数将继续执行,而不等待服务器响应.这就是"AJAX"中的"A". <BR>　　如果第一个参数是"POST",send()方法的参数可以是任何想送给服务器的数据. 这时数据要以字符串的形式送给服务器,如下所示: <BR>
<P class=code>name=value&amp;anothername=othervalue&amp;so=on&nbsp;</P><BR><FONT size=4><B>步骤 2 – "收到!" --- 处理服务器的响应 </B></FONT><BR><BR>　　当发送请求时,要提供指定处理响应的JavaScript函数名. <BR>
<P class=code>http_request.onreadystatechange&nbsp;=&nbsp;nameOfTheFunction;&nbsp;</P>　　我们来看看这个函数的功能是什么.首先函数会检查请求的状态.如果状态值是4,就意味着一个完整的服务器响应已经收到了,您将可以处理该响应. <BR>
<P class=code>if&nbsp;(http_request.readyState&nbsp;==&nbsp;4)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;everything&nbsp;is&nbsp;good,&nbsp;the&nbsp;response&nbsp;is&nbsp;received<BR>}&nbsp;else&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;still&nbsp;not&nbsp;ready<BR>}</P>　　readyState的取值如下: <BR>　　0 (未初始化) <BR>　　1 (正在装载) <BR>　　2 (装载完毕) <BR>　　3 (交互中) <BR>　　4 (完成) <BR><BR>　　接着,函数会检查HTTP服务器响应的状态值. 完整的状态取值可参见 W3C site. 我们着重看值为200 OK的响应. <BR>
<P class=code>if&nbsp;(http_request.status&nbsp;==&nbsp;200)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;perfect!<BR>}&nbsp;else&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;there&nbsp;was&nbsp;a&nbsp;problem&nbsp;with&nbsp;the&nbsp;request,<BR>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;for&nbsp;example&nbsp;the&nbsp;response&nbsp;may&nbsp;be&nbsp;a&nbsp;404&nbsp;(Not&nbsp;Found)<BR>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;or&nbsp;500&nbsp;(Internal&nbsp;Server&nbsp;Error)&nbsp;response&nbsp;codes<BR>}</P>　　在检查完请求的状态值和响应的HTTP状态值后, 您就可以处理从服务器得到的数据了.有两种方式可以得到这些数据: <BR>
<P class=code>http_request.responseText&nbsp;–&nbsp;以文本字符串的方式返回服务器的响应&nbsp;<BR>http_request.responseXML&nbsp;–&nbsp;以XMLDocument对象方式返回响应.处理XMLDocument对象可以用JavaScript&nbsp;DOM函数&nbsp;</P><BR><FONT size=4><B>步骤 3 – "万事俱备!" - 简单实例</B></FONT><BR><BR>　　我们现在将整个过程完整地做一次,发送一个简单的HTTP请求. 我们用JavaScript请求一个HTML文件, test.html, 文件的文本内容为"I'm a test.".然后我们"alert()"test.html文件的内容. <BR>
<P class=code>&lt;script&nbsp;type="text/javascript"&nbsp;language="javascript"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;http_request&nbsp;=&nbsp;false;<BR>&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;makeRequest(url)&nbsp;{<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http_request&nbsp;=&nbsp;false;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(window.XMLHttpRequest)&nbsp;{&nbsp;//&nbsp;Mozilla,&nbsp;Safari,...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http_request&nbsp;=&nbsp;new&nbsp;XMLHttpRequest();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(http_request.overrideMimeType)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http_request.overrideMimeType('text/xml');<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(window.ActiveXObject)&nbsp;{&nbsp;//&nbsp;IE<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http_request&nbsp;=&nbsp;new&nbsp;ActiveXObject("Msxml2.XMLHTTP");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(e)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http_request&nbsp;=&nbsp;new&nbsp;ActiveXObject("Microsoft.XMLHTTP");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(e)&nbsp;{}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!http_request)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('Giving&nbsp;up&nbsp;:(&nbsp;Cannot&nbsp;create&nbsp;an&nbsp;XMLHTTP&nbsp;instance');<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http_request.onreadystatechange&nbsp;=&nbsp;alertContents;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http_request.open('GET',&nbsp;url,&nbsp;true);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http_request.send(null);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;alertContents()&nbsp;{<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(http_request.readyState&nbsp;==&nbsp;4)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(http_request.status&nbsp;==&nbsp;200)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(http_request.responseText);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('There&nbsp;was&nbsp;a&nbsp;problem&nbsp;with&nbsp;the&nbsp;request.');<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&lt;/script&gt;<BR>&lt;span<BR>&nbsp;&nbsp;&nbsp;&nbsp;style="cursor:&nbsp;pointer;&nbsp;text-decoration:&nbsp;underline"<BR>&nbsp;&nbsp;&nbsp;&nbsp;onclick="makeRequest('test.html')"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Make&nbsp;a&nbsp;request<BR>&lt;/span&gt;</P><BR>　　本例中: <BR>　　用户点击浏览器上的"请求"链接; <BR>　　接着函数makeRequest()将被调用.其参数 – HTML文件test.html在同一目录下; <BR>　　这样就发起了一个请求.onreadystatechange的执行结果会被传送给alertContents(); <BR>　　alertContents()将检查服务器的响应是否成功地收到,如果是,就会"alert()"test.html文件的内容. <BR><BR><FONT size=4><B>步骤 4 – "X-文档" --- 处理XML响应</B></FONT><BR><BR>　　在前面的例子中,当服务器对HTTP请求的响应被收到后,我们会调用请求对象的reponseText属性.该属性包含了test.html文件的内容.现在我们来试试responseXML属性. <BR><BR>　　首先,我们新建一个有效的XML文件,后面我们将使用这个文件.该文件(test.xml)源代码如下所示: <BR>
<P class=code>&lt;?xml&nbsp;version="1.0"&nbsp;?&gt;<BR>&lt;root&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;I'm&nbsp;a&nbsp;test.<BR>&lt;/root&gt;</P>　　在该脚本中,我们只需修改请求部分: <BR>
<P class=code>...<BR>onclick="makeRequest('test.xml')"&gt;<BR>...</P>　　接着,在alertContents()中,我们将alert()的代码alert(http_request.responseText);换成: <BR>
<P class=code>　　var&nbsp;xmldoc&nbsp;=&nbsp;http_request.responseXML;<BR>　　var&nbsp;root_node&nbsp;=&nbsp;xmldoc.getElementsByTagName('root').item(0);<BR>　　alert(root_node.firstChild.data);<BR></P><BR>　　这里,我们使用了responseXML提供的XMLDocument对象并用DOM方法获取存于XML文件中的内容.<img src ="http://www.blogjava.net/qq13367612/aggbug/18822.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qq13367612/" target="_blank">Sung</a> 2005-11-08 17:49 <a href="http://www.blogjava.net/qq13367612/articles/18822.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK5.0的11个主要新特征</title><link>http://www.blogjava.net/qq13367612/articles/18800.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Tue, 08 Nov 2005 08:39:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/18800.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/18800.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/18800.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/18800.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/18800.html</trackback:ping><description><![CDATA[<DIV><B>1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </B><B>泛型(Generic)</B></DIV>
<DIV><B>1.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </B><B>说明</B></DIV>
<DIV>增强了java的类型<A href="http://www.gamvan.com/server/" target=_blank>安全</A>，可以在编译期间对容器内的对象进行类型检查，在运行期不必进行类型的转换。而在j2se5之前必须在运行期动态进行容器内对象的检查及转换</DIV>
<DIV>减少含糊的容器，可以定义什么类型的数据放入容器</DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>ArrayList&lt;Integer&gt;&nbsp;listOfIntegers;&nbsp;//&nbsp;&lt;TYPE_NAME&gt;&nbsp;is&nbsp;new&nbsp;to&nbsp;the&nbsp;syntax <BR>Integer&nbsp;integerObject; <BR>listOfIntegers&nbsp;=&nbsp;new&nbsp;ArrayList&lt;Integer&gt;();&nbsp;//&nbsp;&lt;TYPE_NAME&gt;&nbsp;is&nbsp;new&nbsp;to&nbsp;the&nbsp;syntax <BR>listOfIntegers.add(new&nbsp;Integer(10));&nbsp;//&nbsp;只能是Integer类型 <BR>integerObject&nbsp;=&nbsp;listOfIntegers.get(0);&nbsp;//&nbsp;取出对象不需要转换</TD></TR></TBODY></TABLE></DIV>
<DIV><B>1.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </B><B>用法</B></DIV>
<DIV><B>声明及实例化泛型类：</B></DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>HashMap&lt;String,Float&gt;&nbsp;hm&nbsp;=&nbsp;new&nbsp;HashMap&lt;String,Float&gt;(); <BR>//不能使用原始类型 <BR>GenList&lt;int&gt;&nbsp;nList&nbsp;=&nbsp;new&nbsp;GenList&lt;int&gt;();&nbsp;&nbsp;//编译错误 <BR>J2SE&nbsp;5.0目前不支持原始类型作为类型参数(type&nbsp;parameter)</TD></TR></TBODY></TABLE></DIV>
<DIV><B>定义泛型接口：</B></DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>public&nbsp;interface&nbsp;GenInterface&lt;T&gt;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;func(T&nbsp;t); <BR>}</TD></TR></TBODY></TABLE></DIV>
<DIV><B>定义泛型类：</B></DIV>
<DIV>public class ArrayList&lt;ItemType&gt; { ... }</DIV>
<DIV>public class GenMap&lt;T, V&gt; { ... }</DIV>
<DIV>例1：</DIV>
<DIV>&nbsp;</DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容<BR><FONT color=#000000>public class MyList&lt;Element&gt; extends LinkedList&lt;Element&gt;</FONT></FONT><BR>{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;swap(int&nbsp;i,&nbsp;int&nbsp;j) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Element&nbsp;temp&nbsp;=&nbsp;this.get(i); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.set(i,&nbsp;this.get(j)); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.set(j,&nbsp;temp); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyList&lt;String&gt;&nbsp;list&nbsp;=&nbsp;new&nbsp;MyList&lt;String&gt;(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add("hi"); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add("andy"); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(list.get(0)&nbsp;+&nbsp;"&nbsp;"&nbsp;+&nbsp;list.get(1)); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.swap(0,1); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(list.get(0)&nbsp;+&nbsp;"&nbsp;"&nbsp;+&nbsp;list.get(1)); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>}</TD></TR></TBODY></TABLE></DIV>
<DIV>例2：</DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>public&nbsp;class&nbsp;GenList&nbsp;&lt;T&gt;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;T[]&nbsp;elements; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;size&nbsp;=&nbsp;0; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;length&nbsp;=&nbsp;0; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;GenList(int&nbsp;size)&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elements&nbsp;=&nbsp;(T[])new&nbsp;Object[size]; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.size&nbsp;=&nbsp;size; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;T&nbsp;get(int&nbsp;i)&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(i&nbsp;&lt;&nbsp;length)&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;elements[i]; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;add(T&nbsp;e)&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(length&nbsp;&lt;&nbsp;size&nbsp;-&nbsp;1) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elements[length++]&nbsp;=&nbsp;e; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>}</TD></TR></TBODY></TABLE></DIV>
<DIV><B>泛型方法：</B></DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>public&nbsp;class&nbsp;TestGenerics{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;&lt;T&gt;&nbsp;String&nbsp;getString(T&nbsp;obj)&nbsp;{&nbsp;//实现了一个泛型方法 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;obj.toString(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;[]&nbsp;args){ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TestGenerics&nbsp;t&nbsp;=&nbsp;new&nbsp;TestGenerics(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s&nbsp;=&nbsp;"Hello"; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;i&nbsp;=&nbsp;100; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(t.getString(s)); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(t.getString(i)); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>}</TD></TR></TBODY></TABLE></DIV>
<DIV><B>1.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </B><B>受限泛型</B></DIV>
<DIV>　　受限泛型是指类型参数的取值范围是受到限制的. extends关键字不仅仅可以用来声明类的继承关系, 也可以用来声明类型参数(type parameter)的受限关系.例如, 我们只需要一个存放数字的列表, 包括整数(Long, Integer, Short), 实数(Double, Float), 不能用来存放其他类型, 例如字符串(String), 也就是说, 要把类型参数T的取值泛型限制在Number极其子类中.在这种情况下, 我们就可以使用extends关键字把类型参数(type parameter)限制为数字</DIV>
<DIV>示例</DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>public&nbsp;class&nbsp;Limited&lt;T&nbsp;extends&nbsp;Number&gt;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Limited&lt;Integer&gt;&nbsp;number;&nbsp;&nbsp;&nbsp;//正确 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Limited&lt;String&gt;&nbsp;str;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//编译错误 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>}</TD></TR></TBODY></TABLE></DIV>
<DIV><B>1.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </B><B>泛型与异常</B></DIV>
<DIV>类型参数在catch块中不允许出现，但是能用在方法的throws之后。例：</DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>import&nbsp;java.io.*; <BR>interface&nbsp;Executor&lt;E&nbsp;extends&nbsp;Exception&gt;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;execute()&nbsp;throws&nbsp;E; <BR>} <BR><BR>public&nbsp;class&nbsp;GenericExceptionTest&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Executor&lt;IOException&gt;&nbsp;e&nbsp;=&nbsp;new&nbsp;Executor&lt;IOException&gt;()&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;execute()&nbsp;throws&nbsp;IOException{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;code&nbsp;here&nbsp;that&nbsp;may&nbsp;throw&nbsp;an <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;IOException&nbsp;or&nbsp;a&nbsp;subtype&nbsp;of <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;IOException <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.execute(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch(IOException&nbsp;ioe)&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("IOException:&nbsp;"&nbsp;+&nbsp;ioe); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ioe.printStackTrace(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>}</TD></TR></TBODY></TABLE></DIV>
<DIV><B>1.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </B><B>泛型的通配符"?"</B></DIV>
<DIV>"?"可以用来代替任何类型, 例如使用通配符来实现print方法。</DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>public&nbsp;static&nbsp;void&nbsp;print(GenList&lt;?&gt;&nbsp;list)&nbsp;{})</TD></TR></TBODY></TABLE></DIV>
<DIV><B>1.6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </B><B>泛型的一些局限型</B></DIV>
<DIV>不能实例化泛型</DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>T&nbsp;t&nbsp;=&nbsp;new&nbsp;T();&nbsp;//error</TD></TR></TBODY></TABLE></DIV>
<DIV>不能实例化泛型类型的数组</DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>T[]&nbsp;ts=&nbsp;new&nbsp;T[10];&nbsp;&nbsp;&nbsp;//编译错误</TD></TR></TBODY></TABLE></DIV>
<DIV>不能实例化泛型参数数</DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>Pair&lt;String&gt;[]&nbsp;table&nbsp;=&nbsp;new&nbsp;Pair&lt;String&gt;(10);&nbsp;//&nbsp;ERROR</TD></TR></TBODY></TABLE></DIV>
<DIV>类的静态变量不能声明为类型参数类型</DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>public&nbsp;class&nbsp;GenClass&lt;T&gt;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;T&nbsp;t;&nbsp;&nbsp;&nbsp;&nbsp;//编译错误 <BR>}</TD></TR></TBODY></TABLE></DIV>
<DIV>泛型类不能继承自Throwable以及其子类</DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>public&nbsp;GenExpection&lt;T&gt;&nbsp;extends&nbsp;Exception{}&nbsp;&nbsp;&nbsp;&nbsp;//编译错误&nbsp;</TD></TR></TBODY></TABLE></DIV>
<DIV>不能用于基础类型int等</DIV>
<DIV>
<DIV><FONT face=宋体><B></B></FONT></DIV><B>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>Pair&lt;double&gt;&nbsp;//error <BR>Pair&lt;Double&gt;&nbsp;//right</TD></TR></TBODY></TABLE>2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </B><B>增强循环(Enhanced for Loop)</B></DIV>
<DIV>旧的循环</DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>LinkedList&nbsp;list&nbsp;=&nbsp;new&nbsp;LinkedList();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>list.add("Hi"); <BR>list.add("everyone!"); <BR>list.add("Was"); <BR>list.add("the"); <BR>list.add("pizza"); <BR>list.add("good?");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;list.size();&nbsp;i++) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println((String)&nbsp;list.get(i)); <BR>//或者用以下循环 <BR>//for(Iterator&nbsp;iter&nbsp;=&nbsp;list.iterator();&nbsp;iter.hasNext();&nbsp;)&nbsp;{ <BR>//Integer&nbsp;stringObject&nbsp;=&nbsp;(String)iter.next(); <BR>//&nbsp;...&nbsp;more&nbsp;statements&nbsp;to&nbsp;use&nbsp;stringObject...&nbsp; <BR>//} <BR>新的循环 <BR>LinkedList&lt;String&gt;&nbsp;list&nbsp;=&nbsp;new&nbsp;LinkedList&lt;String&gt;();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>list.add("Hi"); <BR>list.add("everyone!"); <BR>list.add("Was"); <BR>list.add("the"); <BR>list.add("pizza"); <BR>list.add("good?");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>for&nbsp;(String&nbsp;s&nbsp;:&nbsp;list) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(s);</TD></TR></TBODY></TABLE></DIV>
<DIV>很清晰、方便，一看便知其用法</DIV>
<DIV><B>3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </B><B>可变参数(Variable Arguments)</B></DIV>
<DIV>实现了更灵活的方法参数传入方式，System.out.printf是个很好的例子</DIV>
<DIV>用法：void test(Object … args)</DIV>
<DIV>一个很容易理解的例子</DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>public&nbsp;static&nbsp;int&nbsp;add(int&nbsp;...&nbsp;args){ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;total&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;args.length;&nbsp;i++) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total&nbsp;+=&nbsp;args[i];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;total; <BR>} <BR>public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args){ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;a; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;Varargs.add(1,&nbsp;2,&nbsp;3,&nbsp;4,&nbsp;5,&nbsp;6,&nbsp;7,&nbsp;8,&nbsp;9,&nbsp;10); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(a); <BR>}</TD></TR></TBODY></TABLE></DIV>
<DIV><B>4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </B><B>自动实现装箱和解箱操作(Boxing/Unboxing Conversions)</B></DIV>
<DIV>说明：实现了基本类型与外覆类之间的隐式转换。基本类型至外覆类的转换称为装箱，外覆类至基本类型的转换为解箱。这些类包括</DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>Primitive&nbsp;Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reference&nbsp;Type <BR>boolean&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Boolean <BR>byte&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Byte <BR>char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Character <BR>short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Short <BR>int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer <BR>long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Long <BR>float&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Float <BR>double&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Double <BR>例如，旧的实现方式 <BR>Integer&nbsp;intObject; <BR>int&nbsp;intPrimitive; <BR>ArrayList&nbsp;arrayList&nbsp;=&nbsp;new&nbsp;ArrayList(); <BR>intPrimitive&nbsp;=&nbsp;11; <BR>intObject&nbsp;=&nbsp;new&nbsp;Integer(intPrimitive); <BR>arrayList.put(intObject);&nbsp;//&nbsp;不能放入int类型，只能使Integer <BR>新的实现方式 <BR>int&nbsp;intPrimitive; <BR>ArrayList&nbsp;arrayList&nbsp;=&nbsp;new&nbsp;ArrayList(); <BR>intPrimitive&nbsp;=&nbsp;11; <BR>//在这里intPrimitive被自动的转换为Integer类型 <BR>arrayList.put(intPrimitive);</TD></TR></TBODY></TABLE></DIV>
<DIV><B>5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </B><B>静态导入(Static Imports)</B></DIV>
<DIV>很简单的东西，看一个例子：</DIV>
<DIV>没有静态导入</DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>Math.sqrt(Math.pow(x,&nbsp;2)&nbsp;+&nbsp;Math.pow(y,&nbsp;2));</TD></TR></TBODY></TABLE></DIV>
<DIV>有了静态导入</DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>import&nbsp;static&nbsp;java.lang.Math.*; <BR>sqrt(pow(x,&nbsp;2)&nbsp;+&nbsp;pow(y,&nbsp;2));</TD></TR></TBODY></TABLE></DIV>
<DIV>&nbsp;</DIV>
<DIV>其中import static java.lang.Math.*;就是静态导入的语法，它的意思是导入Math类中的所有static方法和属性。这样我们在使用这些方法和属性时就不必写类名。</DIV>
<DIV>需要注意的是默认包无法用静态导入，另外如果导入的类中有重复的方法和属性则需要写出类名，否则编译时无法通过。</DIV>
<DIV><B>6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </B><B>枚举类(Enumeration Classes)</B></DIV>
<DIV>用法：public enum Name {types, ….}</DIV>
<DIV>简单的例子：</DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>public&nbsp;enum&nbsp;Colors&nbsp;{Red,&nbsp;Yellow,&nbsp;Blue,&nbsp;Orange,&nbsp;Green,&nbsp;Purple,&nbsp;Brown,&nbsp;Black} <BR>public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args){ <BR>&nbsp;&nbsp;&nbsp;&nbsp;Colors&nbsp;myColor&nbsp;=&nbsp;Colors.Red; <BR>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(myColor); <BR>}</TD></TR></TBODY></TABLE></DIV>
<DIV>又一个简单例子：</DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>import&nbsp;java.util.*; <BR>enum&nbsp;OperatingSystems&nbsp;{windows,&nbsp;unix,&nbsp;linux,&nbsp;macintosh} <BR>public&nbsp;class&nbsp;EnumExample1&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OperatingSystems&nbsp;os; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os&nbsp;=&nbsp;OperatingSystems.windows; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch(os)&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;windows: <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(“You&nbsp;chose&nbsp;Windows!”); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;unix: <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(“You&nbsp;chose&nbsp;Unix!”); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;linux: <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(“You&nbsp;chose&nbsp;Linux!”); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;macintosh: <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(“You&nbsp;chose&nbsp;Macintosh!”); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default: <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(“I&nbsp;don’t&nbsp;know&nbsp;your&nbsp;OS.”); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR>}</TD></TR></TBODY></TABLE></DIV>
<DIV>应运enum简写的例子：</DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>import&nbsp;java.util.*; <BR>public&nbsp;class&nbsp;EnumTest <BR>{ <BR>&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args) <BR>&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Scanner&nbsp;in&nbsp;=&nbsp;new&nbsp;Scanner(System.in); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print("Enter&nbsp;a&nbsp;size:&nbsp;(SMALL,&nbsp;MEDIUM,&nbsp;LARGE,&nbsp;EXTRA_LARGE)&nbsp;"); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;input&nbsp;=&nbsp;in.next().toUpperCase(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Size&nbsp;size&nbsp;=&nbsp;Enum.valueOf(Size.class,&nbsp;input); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("size="&nbsp;+&nbsp;size); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("abbreviation="&nbsp;+&nbsp;size.getAbbreviation()); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(size&nbsp;==&nbsp;Size.EXTRA_LARGE) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Good&nbsp;job--you&nbsp;paid&nbsp;attention&nbsp;to&nbsp;the&nbsp;_."); <BR>&nbsp;&nbsp;&nbsp;} <BR>} <BR><BR>enum&nbsp;Size <BR>{ <BR>&nbsp;&nbsp;&nbsp;SMALL("S"),&nbsp;MEDIUM("M"),&nbsp;LARGE("L"),&nbsp;EXTRA_LARGE("XL"); <BR><BR>&nbsp;&nbsp;&nbsp;private&nbsp;Size(String&nbsp;abbreviation)&nbsp;{&nbsp;this.abbreviation&nbsp;=&nbsp;abbreviation;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getAbbreviation()&nbsp;{&nbsp;return&nbsp;abbreviation;&nbsp;} <BR><BR>&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;abbreviation; <BR>} <BR>enum类中拥有方法的一个例子： <BR>enum&nbsp;ProgramFlags&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;showErrors(0x01), <BR>&nbsp;&nbsp;&nbsp;&nbsp;includeFileOutput(0x02), <BR>&nbsp;&nbsp;&nbsp;&nbsp;useAlternateProcessor(0x04); <BR>&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;bit; <BR>&nbsp;&nbsp;&nbsp;&nbsp;ProgramFlags(int&nbsp;bitNumber)&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bit&nbsp;=&nbsp;bitNumber; <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;getBitNumber()&nbsp;&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(bit); <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR>} <BR>public&nbsp;class&nbsp;EnumBitmapExample&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;&nbsp;{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProgramFlags&nbsp;flag&nbsp;=&nbsp;ProgramFlags.showErrors; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(“Flag&nbsp;selected&nbsp;is:&nbsp;“&nbsp;+ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag.ordinal()&nbsp;+ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;“&nbsp;which&nbsp;is&nbsp;“&nbsp;+ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag.name()); <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR>}</TD></TR></TBODY></TABLE></DIV>
<DIV><B>7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </B><B>元数据(Meta data)</B></DIV>
<DIV>请参考</DIV>
<DIV><A href="http://www-900.ibm.com/developerWorks/cn/java/j-annotate1/">http://www-900.ibm.com/developerWorks/cn/java/j-annotate1/</A></DIV>
<DIV><A href="http://www-900.ibm.com/developerworks/cn/java/j-annotate2.shtml">http://www-900.ibm.com/developerworks/cn/java/j-annotate2.shtml</A><B></B></DIV>
<DIV><B>8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </B><B>Building Strings(StringBuilder</B><B>类)</B></DIV>
<DIV>在JDK5.0中引入了StringBuilder类，该类的方法不是同步(synchronized)的，这使得它比StringBuffer更加轻量级和有效。</DIV>
<DIV><B>9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </B><B>控制台输入(Console Input)</B></DIV>
<DIV>在JDK5.0之前我们只能通过JOptionPane.showInputDialog进行输入，但在5.0中我们可以通过类Scanner在控制台进行输入操作</DIV>
<DIV>例如在1.4中的输入</DIV>
<DIV><B>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>String&nbsp;input&nbsp;=&nbsp;JOptionPane.showInputDialog(prompt); <BR>int&nbsp;n&nbsp;=&nbsp;Integer.parseInt(input); <BR>double&nbsp;x&nbsp;=&nbsp;Double.parseDouble(input); <BR>s&nbsp;=&nbsp;input; <BR>在5.0中我们可以 <BR>Scanner&nbsp;in&nbsp;=&nbsp;new&nbsp;Scanner(System.in); <BR>System.out.print(prompt); <BR>int&nbsp;n&nbsp;=&nbsp;in.nextInt(); <BR>double&nbsp;x&nbsp;=&nbsp;in.nextDouble(); <BR>String&nbsp;s&nbsp;=&nbsp;in.nextLine();</TD></TR></TBODY></TABLE>10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </B><B>Covariant Return Types(</B><B>不晓得怎么翻译)</B></DIV>
<DIV>JDK5之前我们覆盖一个方法时我们无法改变被方法的返回类型，但在JDK5中我们可以改变它</DIV>
<DIV>例如1.4中我们只能</DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>public&nbsp;Object&nbsp;clone()&nbsp;{&nbsp;...&nbsp;} <BR>... <BR>Employee&nbsp;cloned&nbsp;=&nbsp;(Employee)&nbsp;e.clone();</TD></TR></TBODY></TABLE></DIV>
<DIV>但是在5.0中我们可以改变返回类型为Employee</DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>public&nbsp;Employee&nbsp;clone()&nbsp;{&nbsp;...&nbsp;} <BR>... 
<DIV>Employee cloned = e.clone();</DIV></TD></TR></TBODY></TABLE></DIV>
<DIV><B>11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </B><B>格式化I/O(Formatted I/O)</B></DIV>
<DIV>增加了类似C的格式化输入输出，简单的例子：</DIV>
<DIV>
<TABLE style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 1px; BORDER-RIGHT-WIDTH: 1px" borderColor=#e0e0e0 cellSpacing=1 cellPadding=4 width="95%" align=center border=1 fixed TABLE-LAYOUT:>
<TBODY>
<TR>
<TD style="HEIGHT: 25px; WORD-WRAP: break-word" vAlign=top bgColor=#f6f6f6><FONT style="COLOR: #b0b0b0">代码内容</FONT><BR>public&nbsp;class&nbsp;TestFormat{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args){ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;a&nbsp;=&nbsp;150000,&nbsp;b&nbsp;=&nbsp;10; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;c&nbsp;=&nbsp;5.0101f,&nbsp;d&nbsp;=&nbsp;3.14f; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.printf("%4d&nbsp;%4d%n",&nbsp;a,&nbsp;b); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.printf("%x&nbsp;%x%n",&nbsp;a,&nbsp;b); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.printf("%3.2f&nbsp;%1.1f%n",&nbsp;c,&nbsp;d); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.printf("%1.3e&nbsp;%1.3e%n",&nbsp;c,&nbsp;d*100); <BR>&nbsp;&nbsp;&nbsp;&nbsp;} <BR>}</TD></TR></TBODY></TABLE></DIV>
<DIV>输出结果为：</DIV>
<DIV>150000&nbsp;&nbsp; 10</DIV>
<DIV>249f0 a</DIV>
<DIV>5.01 3.1</DIV>
<DIV>5.010e+00 3.140e+02</DIV>
<DIV>下面是一些格式化参数说明(摘自Core Java 2 Volume I - Fundamentals, Seventh Edition)</DIV>
<DIV align=center><B>Table 3-5. Conversions for printf</B></DIV>
<TABLE cellSpacing=0 cellPadding=0 width=584 border=0>
<TBODY>
<TR>
<TD vAlign=bottom width=85>
<DIV align=left><B>Conversion Character</B></DIV></TD>
<TD vAlign=bottom width=324>
<DIV align=left><B>Type</B></DIV></TD>
<TD vAlign=bottom width=175>
<DIV align=left><B>Example</B></DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>d</DIV></TD>
<TD vAlign=top width=324>
<DIV align=left>Decimal integer</DIV></TD>
<TD vAlign=top width=175>
<DIV align=left>159</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>x</DIV></TD>
<TD vAlign=top width=324>
<DIV align=left><A name=RANGE!B3>Hexadecimal integer</A></DIV></TD>
<TD vAlign=top width=175>
<DIV align=left>9f</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>o</DIV></TD>
<TD vAlign=top width=324>
<DIV align=left>Octal integer</DIV></TD>
<TD vAlign=top width=175>
<DIV align=left>237</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>f</DIV></TD>
<TD vAlign=top width=324>
<DIV align=left>Fixed-point floating-point</DIV></TD>
<TD vAlign=top width=175>
<DIV align=left>15.9</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>e</DIV></TD>
<TD vAlign=top width=324>
<DIV align=left>Exponential floating-point</DIV></TD>
<TD vAlign=top width=175>
<DIV align=left>1.59E+01</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>g</DIV></TD>
<TD vAlign=top width=324>
<DIV align=left>General floating-point (the shorter of e and f)</DIV></TD>
<TD vAlign=top width=175>
<DIV align=left>&nbsp;</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>a</DIV></TD>
<TD vAlign=top width=324>
<DIV align=left>Hexadecimal floating point</DIV></TD>
<TD vAlign=top width=175>
<DIV align=left>0x1.fccdp3</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>s</DIV></TD>
<TD vAlign=top width=324>
<DIV align=left>String</DIV></TD>
<TD vAlign=top width=175>
<DIV align=left>Hello</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>c</DIV></TD>
<TD vAlign=top width=324>
<DIV align=left>Character</DIV></TD>
<TD vAlign=top width=175>
<DIV align=left>H</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>b</DIV></TD>
<TD vAlign=top width=324>
<DIV align=left>Boolean</DIV></TD>
<TD vAlign=top width=175>
<DIV align=left>TRUE</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>h</DIV></TD>
<TD vAlign=top width=324>
<DIV align=left>Hash code</DIV></TD>
<TD vAlign=top width=175>
<DIV align=left>42628b2</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>tx</DIV></TD>
<TD vAlign=top width=324>
<DIV align=left>Date and time</DIV></TD>
<TD vAlign=top width=175>
<DIV align=left><U><A HREF="/gufen/admin/EditPosts.aspx#RANGE!ch03table07#RANGE!ch03table07">See Table 3-7</A></U></DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>%</DIV></TD>
<TD vAlign=top width=324>
<DIV align=left>The percent symbol</DIV></TD>
<TD vAlign=top width=175>
<DIV align=left>%</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>n</DIV></TD>
<TD vAlign=top width=324>
<DIV align=left>The platform-dependent line separator</DIV></TD>
<TD vAlign=top width=175>
<DIV align=left>&nbsp;</DIV></TD></TR></TBODY></TABLE>
<DIV>&nbsp;</DIV>
<DIV align=center><B>Table 3-7. Date and Time Conversion Characters</B></DIV>
<TABLE cellSpacing=0 cellPadding=0 width=584 border=0>
<TBODY>
<TR>
<TD vAlign=bottom width=85>
<DIV align=left><B>Conversion Character</B></DIV></TD>
<TD vAlign=bottom width=304>
<DIV align=left><B>Type</B></DIV></TD>
<TD vAlign=bottom width=195>
<DIV align=left><B>Example</B></DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>C</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>Complete date and time</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>Mon Feb 09 18:05:19 PST 2004</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>F</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>ISO 8601 date</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>2004-02-09</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>D</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>U.S. formatted date (month/day/year)</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>02/09/2004</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>T</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>24-hour time</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>18:05:19</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>r</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>12-hour time</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>06:05:19 pm</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>R</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left><A name=RANGE!B7>24-hour time, no seconds</A></DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>18:05</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>Y</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>Four-digit year (with leading zeroes)</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>2004</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>y</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>Last two digits of the year (with leading zeroes)</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>04</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>C</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>First two digits of the year (with leading zeroes)</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>20</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>B</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>Full month name</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>February</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>b or h</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left><A name=RANGE!B12>Abbreviated month name</A></DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>Feb</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>m</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>Two-digit month (with leading zeroes)</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>02</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>d</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left><A name=RANGE!B14>Two-digit day (with leading zeroes)</A></DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>09</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>e</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>Two-digit day (without leading zeroes)</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>9</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>A</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>Full weekday name</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>Monday</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>a</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>Abbreviated weekday name</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>Mon</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>j</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>Three-digit day of year (with leading zeroes), between 001 and 366</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>069</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>H</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>Two-digit hour (with leading zeroes), between 00 and 23</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>18</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>k</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>Two-digit hour (without leading zeroes), between 0 and 23</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>18</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>I</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>Two-digit hour (with leading zeroes), between 01 and 12</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>06</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>l</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>Two-digit hour (without leading zeroes), between 1 and 12</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>6</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>M</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>Two-digit minutes (with leading zeroes)</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>05</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>S</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>Two-digit seconds (with leading zeroes)</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>19</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>L</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>Three-digit milliseconds (with leading zeroes)</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>047</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>N</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>Nine-digit nanoseconds (with leading zeroes)</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>047000000</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>P</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>Uppercase morning or afternoon marker</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>PM</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>p</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>Lowercase morning or afternoon marker</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>pm</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>z</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>RFC 822 numeric offset from GMT</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>-0800</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>Z</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>Time zone</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>PST</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>s</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left>Seconds since 1970-01-01 00:00:00 GMT</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>1078884319</DIV></TD></TR>
<TR>
<TD vAlign=top width=85>
<DIV align=left>E</DIV></TD>
<TD vAlign=top width=304>
<DIV align=left><A name=RANGE!B32>Milliseconds since 1970-01-01 00:00:00 GMT</A></DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>1078884319047</DIV></TD></TR></TBODY></TABLE>
<DIV align=center><B></B>&nbsp;</DIV>
<DIV align=center><B>Table 3-6. Flags for printf</B></DIV>
<TABLE cellSpacing=0 cellPadding=0 width=584 border=0>
<TBODY>
<TR>
<TD vAlign=top width=157>
<DIV align=left><B>Flag</B></DIV></TD>
<TD vAlign=top width=232>
<DIV align=left><B>Purpose</B></DIV></TD>
<TD vAlign=top width=195>
<DIV align=left><B>Example</B></DIV></TD></TR>
<TR>
<TD vAlign=top width=157>
<DIV align=left>+</DIV></TD>
<TD vAlign=top width=232>
<DIV align=left>Prints sign for positive and negative numbers</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>+3333.33</DIV></TD></TR>
<TR>
<TD vAlign=top width=157>
<DIV align=left>space</DIV></TD>
<TD vAlign=top width=232>
<DIV align=left>Adds a space before positive numbers</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>| 3333.33|</DIV></TD></TR>
<TR>
<TD vAlign=top width=157>
<DIV align=left>0</DIV></TD>
<TD vAlign=top width=232>
<DIV align=left>Adds leading zeroes</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>003333.33</DIV></TD></TR>
<TR>
<TD vAlign=top width=157>
<DIV align=left>-</DIV></TD>
<TD vAlign=top width=232>
<DIV align=left>Left-justifies field</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>|3333.33 |</DIV></TD></TR>
<TR>
<TD vAlign=top width=157>
<DIV align=left>(</DIV></TD>
<TD vAlign=top width=232>
<DIV align=left>Encloses negative number in parentheses</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>(3333.33)</DIV></TD></TR>
<TR>
<TD vAlign=top width=157>
<DIV align=left>,</DIV></TD>
<TD vAlign=top width=232>
<DIV align=left>Adds group separators</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>3,333.33</DIV></TD></TR>
<TR>
<TD vAlign=top width=157>
<DIV align=left># (for f format)</DIV></TD>
<TD vAlign=top width=232>
<DIV align=left>Always includes a decimal point</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>3,333.</DIV></TD></TR>
<TR>
<TD vAlign=top width=157>
<DIV align=left># (for x or o format)</DIV></TD>
<TD vAlign=top width=232>
<DIV align=left>Adds 0x or 0 prefix</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>0xcafe</DIV></TD></TR>
<TR>
<TD vAlign=top width=157>
<DIV align=left>^</DIV></TD>
<TD vAlign=top width=232>
<DIV align=left>Converts to upper case</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>0XCAFE</DIV></TD></TR>
<TR>
<TD vAlign=top width=157>
<DIV align=left>$</DIV></TD>
<TD vAlign=top width=232>
<DIV align=left>Specifies the index of the argument to be formatted; for example, %1$d %1$x prints the first argument in decimal and hexadecimal</DIV></TD>
<TD vAlign=top width=195>
<DIV align=left>159 9F</DIV></TD></TR>
<TR>
<TD vAlign=top width=157>
<DIV align=left>&lt;&nbsp;</DIV></TD>
<TD vAlign=top width=232>
<DIV align=left>Formats the same value as the previous specification; for example, %d %&lt;x prints the same number in decimal and hexadecimal</DIV></TD>
<TD noWrap width=195>
<DIV align=left>&nbsp;</DIV></TD></TR></TBODY></TABLE>
<DIV>&nbsp;</DIV>
<DIV>这里是一些简单的介绍，更详细的说明请参考：</DIV>
<DIV>Core Java 2 Volume I - Fundamentals, Seventh Edition</DIV>
<DIV>Core Java 2 Volume II - Advanced Features, Seventh Edition</DIV>
<DIV>里面都有一些很精彩的描述，中文名称就是《Java核心技术》。只有第七版才有J2SE5.0的介绍</DIV><img src ="http://www.blogjava.net/qq13367612/aggbug/18800.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qq13367612/" target="_blank">Sung</a> 2005-11-08 16:39 <a href="http://www.blogjava.net/qq13367612/articles/18800.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>详解如何利用iText在JSP中生成PDF报表</title><link>http://www.blogjava.net/qq13367612/articles/18151.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Fri, 04 Nov 2005 07:24:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/18151.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/18151.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/18151.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/18151.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/18151.html</trackback:ping><description><![CDATA[前久做了一个通过JSP生成PDF报表的小项目，算得上开了一次眼界。企业的一些信息通过网络形成Html报表，虽然IE可以直接打印显示在其中的内容，但是从界面上来看，如果直接将Html的显示结果打印出来，显得不太美观。如果将它转成PDF文件再打印，则打印效果会好很多。<BR><BR>2、iText简介<BR><BR>iText是一个开放源码的Java类库，可以用来方便地生成PDF文件。大家通过访问http://sourceforge.net/project/showfiles.php?group_id=15255&amp;release_id=167948下载最新版本的类库，下载完成之后会得到一个.jar包，把这个包加入JDK的classpath即可使用。<BR><BR>如果生成的PDF文件中需要出现中文、日文、韩文字符，则还需要通过访问http://itext.sourceforge.net/downloads/iTextAsian.jar下载iTextAsian.jar包。<BR><BR>关于iText类库的使用，http://www.lowagie.com/iText/tutorial/index.html有比较详细的教程。该教程从入门开始，比较系统地介绍了在PDF文件中放入文字、图片、表格等的方法和技巧。<BR><BR>读完这片教程，大致就可以做一些从简单到复杂的PDF文件了。不过，试图通过教程解决在生成PDF文件过程中遇到的所有困难无疑是一种奢望。所以，阅读iText的api文档显得非常重要。读者在下载类库的同时，也可以下载类库的文档。<BR><BR>3、如何利用iText在java程序中生成PDF报表<BR><BR>以下是上述教程中一个最简单的例子，这个例子刻画了通过iText生成PDF文件的一般程序框架。读者只需要在document.open();和document.close();两条语句中间加入自己希望放在PDF文件中的内容即可。该例子只在PDF文件中加了“Hello World“一行文字。<BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>Document document = new Document();
   try 
   { 
  PdfWriter.getInstance
  (document, new FileOutputStream
  ("Chap0101.pdf"));
            document.open();
 document.add(new Paragraph("Hello World"));
        }
        catch(DocumentException de) 
		{
            System.err.println(de.getMessage());
        }
        catch(IOException ioe) 
		{
            System.err.println(ioe.getMessage());
        }
        document.close();</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>由以上的例子可见，程序的框架十分清楚明了。然而在PDF中指定文字、图画、表格的位置是一件非常麻烦的事情。除了不断地在程序中修改位置、然后运行程序、生成PDF文件、观察元素在PDF中的位置是否合理这样的过程以外，似乎还没有其它更好的方法。 <BR><BR>4、如何通过JSP生成PDF报表 <BR><BR>这一部分是在iText的教程中所没有的，网上的相关资料也比较少。我经过一段时间研究发现：先在服务器上生成PDF文件，然后用户通过点击指向PDF文件的超链接选择下载或打开。这是一个思路，或者说是思路之一。本文实现了这个思路，又给出另外一个思路并通过两种途径实现之。 <BR><BR>1）直接在服务器上生成PDF文件。 <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>&lt;%@ page import ="com.lowagie.text.*
,com.lowagie.text.pdf.*, java.io.*"%&gt;
&lt;%
   String filename = 
   "PDF"+(new Random()).nextInt()+".pdf" ;
Document document = 
new Document(PageSize.A4);
 ServletOutputStream out1
 = response.getOutputStream();
 try{
 PdfWriter writer = 
 PdfWriter.getInstance(document, 
 new FileOutputStream(filename) );
            document.open();
  document.add(new Paragraph("Hello World"));
            document.close();
    }
            catch(Exception e){}
%&gt;</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>上面的程序在服务器上生成了一个静态的PDF文件。显然，每次运行所得的PDF文件的名称应该是独一无二不能有重的。本程序通过随机函数来命名生成的PDF文件。本程序的缺点就是，每次运行都会在服务器上产生一个PDF文件，如果不及时删除，数量会越来越大，这显然是站点维护者所不愿意看到的。 <BR><BR>2）将PDF文件通过流的形式输送到客户端的缓存。这样做的好处是不会在服务器上留下任何“遗迹”。 <BR><BR>i）直接通过JSP页面生成 <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>&lt;%@
       page import="java.io.*,
	   java.awt.Color,com.lowagie.text.*,
	   com.lowagie.text.pdf.*"%&gt;
&lt;%
response.setContentType
( "application/pdf" );
Document document = new Document();
ByteArrayOutputStream buffer
= new ByteArrayOutputStream();
PdfWriter writer=
PdfWriter.getInstance( document, buffer );
document.open();
document.add(new Paragraph("Hello World"));
document.close();
DataOutput output = 
new DataOutputStream
( response.getOutputStream() );
byte[] bytes = buffer.toByteArray();
response.setContentLength(bytes.length);
for( int i = 0;
i &lt; bytes.length; 
i++ ) 
{ 
output.writeByte( bytes[i] ); 
}
%&gt;</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>ii）通过Servlet生成 <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.lowagie.text.*;
import com.lowagie.text.pdf.*;
public void doGet
(HttpServletRequest request,
HttpServletResponse response)
 throws IOException,ServletException
{
  Document document = 
  new Document(PageSize.A4, 36,36,36,36);
  ByteArrayOutputStream ba
  = new ByteArrayOutputStream();
  try
  {
     PdfWriter writer = 
	 PdfWriter.getInstance(document, ba);
     document.open();
     document.add(new 
	 Paragraph("Hello World"));
  }
  catch(DocumentException de)
  {
    de.printStackTrace();
    System.err.println
	("A Document error:" +de.getMessage());
   }
  document.close();
  response.setContentType
  ("application/pdf");
  response.setContentLength(ba.size());
  ServletOutputStream out 
  = response.getOutputStream();
  ba.writeTo(out);
  out.flush();
}</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>5、结束 <BR><BR>我在项目中采用的是第二种方法。本文的源码在我的tomcat4上面都是调试通过的。希望可以给大家带来方便。 <BR><img src ="http://www.blogjava.net/qq13367612/aggbug/18151.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qq13367612/" target="_blank">Sung</a> 2005-11-04 15:24 <a href="http://www.blogjava.net/qq13367612/articles/18151.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用HttpSessionListener统计在线人数</title><link>http://www.blogjava.net/qq13367612/articles/18144.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Fri, 04 Nov 2005 07:03:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/18144.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/18144.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/18144.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/18144.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/18144.html</trackback:ping><description><![CDATA[JSP显示在线人数代码<BR><BR>编写以下SessionCounter.java 并编译为SessiionCounter.class 然后放到你的网站的classpath的 SessionCount(自己建立此目录)下面<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>package SessionCount;  
import javax.servlet.*;  
import javax.servlet.http.*;  

public class SessionCounter implements HttpSessionListener {  

private static int activeSessions = 0;  

public void sessionCreated(HttpSessionEvent se) {  
activeSessions++;  
}  

public void sessionDestroyed(HttpSessionEvent se) {  
if(activeSessions &gt; 0)  
activeSessions--;  
}  

public static int getActiveSessions() {  
return activeSessions;  
}  
}</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>接着建立online.jsp文件用于显示在线人数 <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>&lt;%@ page import="SessionCount.SessionCounter" %&gt;</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>在线： <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>&lt;%= SessionCounter.getActiveSessions() %&gt;</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>然后需要在你的网站的WEB-INF中建立web.xml 文件内容如下： <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>&lt;!-- Web.xml --&gt;  
&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;  
&lt;!DOCTYPE web-app  
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"  
"http://java.sun.com/j2ee/dtds/web-app_2.3.dtd"&gt;  

&lt;web-app&gt;  

&lt;!-- Listeners --&gt;  
&lt;listener&gt;  
&lt;listener-class&gt;  
SessionCount.SessionCounter  
&lt;/listener-class&gt;  
&lt;/listener&gt;  

&lt;/web-app&gt;</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>然后重新启动你的应用服务器，访问online.jsp检查是否显示正确。 <BR><img src ="http://www.blogjava.net/qq13367612/aggbug/18144.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qq13367612/" target="_blank">Sung</a> 2005-11-04 15:03 <a href="http://www.blogjava.net/qq13367612/articles/18144.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java应用开发技巧：尽可能使用堆栈变量</title><link>http://www.blogjava.net/qq13367612/articles/18145.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Fri, 04 Nov 2005 07:03:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/18145.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/18145.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/18145.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/18145.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/18145.html</trackback:ping><description><![CDATA[如果您频繁存取变量，就需要考虑从何处存取这些变量。变量是static变量，还是堆栈变量，或者是类的实例变量？变量的存储位置对存取它的代码的性能有明显的影响？例如，请考虑下面这段代码：<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>　　class StackVars
　　{
　　private int instVar;
　　private static int staticVar;
　　
　　//存取堆栈变量
　　void stackAccess(int val)
　　{
　　int j=0;
　　for (int i=0; i&lt;val; i++)
　　j += 1;
　　}
　　
　　//存取类的实例变量
　　void instanceAccess(int val)
　　{
　　for (int i=0; i&lt;val; i++)
　　instVar += 1;
　　}   
　　
　　//存取类的 static 变量
　　void staticAccess(int val)
　　{
　　for (int i=0; i&lt;val; i++)
　　staticVar += 1;
　　}
　　}</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>这段代码中的每个方法都执行相同的循环，并反复相同的次数。唯一的不同是每个循环使一个不同类型的变量递增。方法stackAccess使一个局部堆栈变量递增，instanceAccess使类的一个实例变量递增，而 staticAccess 使类的一个 static 变量递增。 <BR><BR>instanceAccess和staticAccess的执行时间基本相同。但是，stackAccess要快两到三倍。存取堆栈变量如此快是因为，JVM存取堆栈变量比它存取static变量或类的实例变量执行的操作少。请看一下为这三个方法生成的字节码： <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>Method void stackAccess(int)
　　0 iconst_0         //将 0 压入堆栈。
　　1 istore_2         //弹出 0 并将它存储在局部分变量表中索引为 2 的位置 (j)。
　　2 iconst_0         //压入 0。
　　3 istore_3         //弹出 0 并将它存储在局部变量表中索引为 3 的位置 (i)。
　　4 goto 13          //跳至位置 13。
　　7 iinc 2 1         //将存储在索引 2 处的 j 加 1。
　　10 iinc 3 1         //将存储在索引 3 处的 i 加 1。
　　13 iload_3          //压入索引 3 处的值 (i)。
 
　　14 iload_1          //压入索引 1 处的值 (val)。
　　15 if_icmplt 7      //弹出 i 和 val。如果 i 小于 val，则跳至位置 7。
　　18 return           //返回调用方法。
　　
　　Method void instanceAccess(int)
　　0 iconst_0         //将 0 压入堆栈。
　　1 istore_2         //弹出 0 并将它存储在局部变量表中索引为 2 的位置 (i)。
　　2 goto 18          //跳至位置 18。
　　5 aload_0          //压入索引 0 (this)。
　　6 dup              //复制堆栈顶的值并将它压入。
　　7 getfield #19 &lt;Field int instVar&gt;
　　//弹出 this 对象引用并压入 instVar 的值。
　　10 iconst_1         //压入 1。
　　11 iadd             //弹出栈顶的两个值，并压入它们的和。
　　12 putfield #19 &lt;Field int instVar&gt;
　　//弹出栈顶的两个值并将和存储在 instVar 中。
　　15 iinc 2 1         //将存储在索引 2 处的 i 加 1。
　　18 iload_2          //压入索引 2 处的值 (i)。
　　19 iload_1          //压入索引 1 处的值 (val)。
　　20 if_icmplt 5      //弹出 i 和 val。如果 i 小于 val，则跳至位置 5。
　　23 return           //返回调用方法。
 
　　
 　　Method void staticAccess(int)
　　0 iconst_0         //将 0 压入堆栈。
　　1 istore_2         //弹出 0 并将它存储在局部变量表中索引为 2 的位置 (i)。
　　2 goto 16          //跳至位置 16。
　　5 getstatic #25 &lt;Field int staticVar&gt;
　　//将常数存储池中 staticVar 的值压入堆栈。
　　8 iconst_1         //压入 1。
　　9 iadd             //弹出栈顶的两个值，并压入它们的和。
　　10 putstatic #25 &lt;Field int staticVar&gt;
　　//弹出和的值并将它存储在 staticVar 中。
　　13 iinc 2 1         //将存储在索引 2 处的 i 加 1。
　　16 iload_2          //压入索引 2 处的值 (i)。
　　17 iload_1          //压入索引 1 处的值 (val)。
　　18 if_icmplt 5      //弹出 i 和 val。如果 i 小于 val，则跳至位置 5。
　　21 return           //返回调用方法。</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>查看字节码揭示了堆栈变量效率更高的原因。JVM是一种基于堆栈的虚拟机，因此优化了对堆栈数据的存取和处理。所有局部变量都存储在一个局部变量表中，在Java操作数堆栈中进行处理，并可被高效地存取。存取static变量和实例变量成本更高，因为JVM必须使用代价更高的操作码，并从常数存储池中存取它们。（常数存储池保存一个类型所使用的所有类型、字段和方法的符号引用。） <BR><BR>通常，在第一次从常数存储池中访问static变量或实例变量以后，JVM将动态更改字节码以使用效率更高的操作码。尽管有这种优化，堆栈变量的存取仍然更快。考虑到这些事实，就可以重新构建前面的代码，以便通过存取堆栈变量而不是实例变量或 static 变量使操作更高效。请考虑修改后的代码： <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>　　class StackVars
　　{
　　//与前面相同...
　　void instanceAccess(int val)
　　{
　　int j = instVar;
　　for (int i=0; i&lt;val; i++)
　　j += 1;
　　instVar = j;
　　}  
　　
　　void staticAccess(int val)
　　{
　　int j = staticVar;
　　for (int i=0; i&lt;val; i++)
　　j += 1;
　　staticVar = j;
　　}
　　}</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>方法 instanceAccess 和 staticAccess 被修改为将它们的实例变量或 static 变量复制到局部堆栈变量中。当变量的处理完成以后，其值又被复制回实例变量或 static 变量中。这种简单的更改明显提高了 instanceAccess 和 staticAccess 的性能。这三个方法的执行时间现在基本相同，instanceAccess 和 staticAccess 的执行速度只比 stackAccess 的执行速度慢大约 4%。 <BR><BR>这并不表示您应该避免使用 static 变量或实例变量。您应该使用对您的设计有意义的存储机制。例如，如果您在一个循环中存取 static 变量或实例变量，则您可以临时将它们存储在一个局部堆栈变量中，这样就可以明显地提高代码的性能。这将提供最高效的字节码指令序列供 JVM 执行。 <BR><img src ="http://www.blogjava.net/qq13367612/aggbug/18145.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qq13367612/" target="_blank">Sung</a> 2005-11-04 15:03 <a href="http://www.blogjava.net/qq13367612/articles/18145.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常见的十四种Java开发工具及其特点</title><link>http://www.blogjava.net/qq13367612/articles/18132.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Fri, 04 Nov 2005 06:03:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/18132.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/18132.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/18132.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/18132.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/18132.html</trackback:ping><description><![CDATA[1、JDK （Java Development Kit）Java开发工具集<BR><BR>从初学者角度来看，采用JDK开发Java程序能够很快理解程序中各部分代码之间的关系，有利于理解Java面向对象的设计思想。JDK的另一个显著特点是随着Java （J2EE、J2SE以及J2ME）版本的升级而升级。但它的缺点也是非常明显的就是从事大规模企业级Java应用开发非常困难，不能进行复杂的Java软件开发，也不利于团体协同开发。<BR><BR>2、Java Workshop <BR><BR>3、NetBeans 与Sun Java Studio 5<BR><BR>NetBeans是开放源码的Java集成开发环境(IDE)，适用于各种客户机和Web应用。Sun Java Studio是Sun公司最新发布的商用全功能Java IDE，支持Solaris、Linux和Windows平台，适于创建和部署2层Java Web应用和n层J2EE应用的企业开发人员使用。<BR><BR>NetBeans是业界第一款支持创新型Java开发的开放源码IDE。开发人员可以利用业界强大的开发工具来构建桌面、Web或移动应用。同时，通过NetBeans和开放的API的模块化结构，第三方能够非常轻松地扩展或集成NetBeans平台。<BR><BR>NetBeans3.5.1主要针对一般Java软件的开发者，而Java One Studio5则主要针对企业做网络服务等应用的开发者。Sun不久还将推出Project Rave，其目标是帮助企业的开发者进行软件开发。<BR><BR>NetBeans 3.5.1版本与其他开发工具相比，最大区别在于不仅能够开发各种台式机上的应用，而且可以用来开发网络服务方面的应用，可以开发基于J2ME的移动设备上的应用等。在NetBeans 3.5.1基础上，Sun开发出了Java One Studio5，为用户提供了一个更加先进的企业编程环境。<BR><BR>在新的Java One Studio5里有一个应用框架，开发者可以利用这些模块快速开发自己在网络服务方面的各种应用程序。<BR><BR>4、Borland 的JBuilder<BR><BR>Jbuilder进入了Java集成开发环境的王国，它满足很多方面的应用，尤其是对于服务器方以及EJB开发者们来说。下面简单介绍一下Jbuilder的特点: <BR><BR>1）Jbuilder支持最新的Java技术，包括Applets、JSP/Servlets、JavaBean以及EJB(Enterprise JavaBeans)的应用。<BR><BR>2）用户可以自动地生成基于后端数据库表的EJB Java类，Jbuilder同时还简化了EJB的自动部署功能.此外它还支持CORBA，相应的向导程序有助于用户全面地管理IDL(分布应用程序所必需的接口定义语言Interface Definition Language)和控制远程对象。<BR><BR>3）Jbuilder支持各种应用服务器。Jbuilder与Inprise Application Server紧密集成，同时支持WebLogic Server，支持EJB 1.1和EJB 2.0，可以快速开发J2EE的电子商务应用。<BR><BR>4）Jbuilder能用Servlet和JSP开发和调试动态Web 应用。<BR><BR>5）利用Jbuilder可创建(没有专有代码和标记)纯Java2应用。由于Jbuilder是用纯Java语言编写的，其代码不含任何专属代码和标记，它支持最新的Java标准。<BR><BR>6）Jbuilder拥有专业化的图形调试介面，支持远程调试和多线程调试，调试器支持各种JDK版本,包括J2ME/J2SE/J2EE。<BR><BR>JBuilder环境开发程序方便，它是纯的Java 开发环境，适合企业的J2EE开发；缺点是往往一开始人们难于把握整个程序各部分之间的关系，对机器的硬件要求较高，比较吃内存，这时运行速度显得较慢。<BR>5、Oracle 的JDeveloper<BR><BR>Oracle9i JDeveloper（定为9.0版，最新为10g）为构建具有J2EE功能，XML和Web services的复杂的，多层的Java应用程序提供了一个完全集成的开发环境。它为运用Oracle9i数据库和应用服务器的开发人员提供特殊的功能和增强性能，除此以外，它也有资格成为用于多种用途Java开发的一个强大的工具。<BR><BR>Oracle9i JDeveloper的主要特点如下：<BR><BR>①具有UML（Unified Modeling Language，一体化建模语言）建模功能。可以将业务对象及e-business应用模型化。<BR><BR>②配备有高速Java调试器（Debuger）、内置Profiling工具、提高代码质量的工具“CodeCoach”等。<BR><BR>③支持SOAP（Simple Object Access Protocol）“简单对象访问协议”、UDDI（Universal Description, Discovery and Integration）“统一描述、发现和集成协议”、WSDL（Web Services Description Language）“WEB服务描述语言”等Web服务标准。<BR><BR>JDeveloper 不仅仅是很好的 Java 编程工具，而且是 Oracle Web 服务的延伸，支 Apache SOAP，以及 9iAS ，可扩充的环境和 XML 和 WSDL 语言紧密相关。Oracle9i Jdeveloper完全利用Java编写，能够与以前的Oracle服务器软件以及其他厂商支持J2EE的应用服务器产品相兼容，而且在设计时着重针对Oracle9i，能够无缝化跨平台之间的应用开发，提供了业界第一个完整的、集成了J2EE和XML的开发环境。<BR><BR>允许开发者快速开发可以通过Web、无线设备及语音界面访问的Web服务和交易应用，以往只能通过将传统Java编程技巧与最新模块化方式结合到一个单一集成的开发环境中之后才能完成J2EE应用开发生命周期管理的事实，从根本上得到改变。缺点就是对于初学者来说，较复杂，也比较难。<BR><BR>6、IBM的Visual Age for Java<BR><BR>Visual Age for Java是一个非常成熟的开发工具，它的特性以于IT开发者和业余的Java编程人员来说都是非常用有用的。它提供对可视化编程的广泛支持，支持利用CICS连接遗传大型机应用，支持EJB的开发应用，支持与Websphere的集成开发，方便的bean创建和良好的快速应用开发(RAD)支持和无文件式的文件处理。<BR><BR>IBM为建设Web站点所推出的WebSphere Studio Advanced Edition及其包含的Visua Age for Java Professional Edition软件已全面转向以Java为中心，这样，Java开发人员对WebSphere全套工具的感觉或许会好了许多。<BR><BR>Studio所提供的工具有：Web站点管理、快速开发 JDBC页向导程序、HTML编辑器和HTML语法检查等。这确实是个不错的HTML站点页面编辑环境。Studio和VisualAge集成度很高，菜单中提供了在两种软件包之间快速移动代码的选项。这就让使用Studio的Web页面设计人员和使用VisualAge的Java程序员可以相互交换文件、协同工作。<BR><BR>Visual Age for Java支持团队开发，内置的代码库可以自动地根据用户做出改动而修改程序代码，这样就可以很方便地将目前代码和早期版本做出比较。<BR><BR>与Visual Age紧密结合的Websphere Studio本身并不提供源代码和版本管理的支持，它只是包含了一个内置文件锁定系统,当编辑项目的时候可以防止其他人对这些文件的错误修改，软件还支持诸如Microsoft Visual SourceSafe这样的第三方源代码控制系统。Visual Age for Java完全面向对象的程序设计思想使得开发程序非常快速、高效。你可以不编写任何代码就可以设计出一个典型的应用程序框架。<BR><BR>Visual Age for Java作为IBM电子商务解决方案其中产品之一，可以无缝地与其他IBM产品，如WebSphere、DB2融合, 迅速完成从设计、开发到部署应用的整个过程。<BR><BR>Visual Age for Java独特的管理文件方式使其集成外部工具非常困难,你无法让Visual Age for Java与其他工具一起联合开发应用。<BR>7、BEA 的 WebLogic Workshop<BR><BR>BEA WebLogic Workshop是一个统一、简化、可扩展的开发环境，使所有的开发人员都能在 BEA WebLogic Enterprise Platform之上构建基于标准的企业级应用，从而提高了开发部门的生产力水平，加快了价值的实现。<BR><BR>WebLogic Workshop除了提供便捷的Web服务之外，它能够用于创建更多种类的应用。作为整个BEA WebLogic Platform的开发环境。不管是创建门户应用、编写工作流、还是创建Web应用，Workshop 8.1都可以帮助开发人员更快更好地完成。<BR><BR>WebLogic Workshop的主要特点如下：<BR><BR>① 使 J2EE 开发切实可行，提高开发效率<BR><BR>BEA WebLogic Workshop 使开发人员远离 J2EE 内在的复杂性，集中精力专注业务逻辑，无须操心单调乏味的基础结构代码。这种创新意味着，已被企业验证的 J2EE 的强大功能，最终被大多数不熟悉 Java 和 J2EE 的应用开发人员所掌握，从而使 IT 部门的工作效率提高一个数量级。<BR><BR>可视化设计器以及直观的概念，如事件、属性和控件等，实现了基于事件的开发。Workshop 简化的程序设计模型，使开发人员不必掌握复杂的 J2EE API 和面向对象的程序设计原理。<BR><BR>所有开发人员，包括 J2EE 专家和具有可视化和过程化语言技能的应用开发人员在内，都可以共同工作在 BEA WebLogic Enterprise Platform 之上。Workshop 的可视化开发环境，创建带有代码注释的标准 Java 文件，用来说明由运行时框架实施的企业级需求。<BR><BR>J2EE 和其他高级开发人员，借助功能强大的代码编辑功能，可以访问 Java 源代码，从而弥补了可视化设计器的不足。<BR><BR>② 构建企业级应用<BR><BR>通过在可伸缩、安全可靠的企业级架构上实施各种应用，BEA WebLogic Workshop 大大降低了开发风险。<BR><BR>而且，所有应用的创建都使用标准的 J2EE 组件，既保护了您的技术投资，又保持了最大的灵活性。 BEA WebLogic Workshop 运行框架，是统一整个架构的汇聚层，使单一、简化的程序设。<BR><BR>计模型扩展到所有的 BEA WebLogic Enterprise Platform 应用类型。通过解释设计时创建的注释代码，运行时框架可以实现必要的 J2EE 组件，并且提取出与 J2EE 应用开发有关的所有底层细节。<BR><BR>③ 降低 IT 复杂性<BR><BR>BEA WebLogic Workshop 提供各种 Java 控件，使得与 IT 资源的连接更轻而易举。另外，在构建任何 BEA WebLogic Platform 的应用中，Java 控件不仅可扩展而且完全相同。<BR><BR>这种强大、有效的方法能够：降低 IT 技术的复杂性，优化信息的可用性，推动包含"最佳业务方案"的可重用服务的开发，使开发人员能以更低的成本、更短的时间实现更大的产出。<BR><BR>利用 BEA WebLogic Workshop，任何开发人员都能以最大的生产效率，构建各种Web 服务、Web 应用、门户和集成项目。BEA WebLogic Workshop是BEA的产品战略核心，它帮助客户接触和利用面向服务架构(SOA)的强大功能。<BR><BR>BEA Weblogic Workshop 8.1极大简化了当前实际企业集成环境中企业级应用和服务的构建，并成为全面支持关键企业级应用(如异步、真正松耦合和粗粒度消息传送等)的自然选择。它的缺点就是过于复杂，对于初学者来说，理解起来较为困难。<BR>8、WebGain 的Visual Cafe for Java<BR><BR>Visual Cafe 是只能在Symantec公司的Java虚拟机、Netscape公司的Java虚拟机和Microsoft虚拟机上工作的调试器。这对于开发者来讲是一个重要的特性,因为用户开发的Java代码中的许多软件bug就可能中会在某种特定的虚拟机上起作用。<BR><BR>在修改后进行编译基继续进行调试时,Visual Cafe会自动将文件存盘，使用Visual Cafe创建的原生应用具有许多特点。除了明显的速度提高之外,Symantec使类库的二进制方式比正常的JDK小Visual Cafe为所指定的关系自动生成或更新必要的Java代码。利用Visual Cafe，用户可以从一个标准对象数据库中集合完整的Java应用程序和Applet，而不必再编写源代码。Visual Cafe还提供了一个扩充的源代码开发工具集。<BR><BR>Visual Cafe综合了Java软件的可视化源程序开发工具，它允许开发人员在可视化视图和源视图之间进行有效地转换。在可视化视图中进行的修改立即反映在源代码中。对源代码的改变自动更新可视化视图。<BR><BR>Visual Cafe具有许多源文件方面的特性，如全局检索和替换。绝大多数Java开发工具的文献的问题在于简单地挨个介绍开发工具的每部分组件，但用户在开应用时还需要一个面向任务的手册，利用这个手册你可以不必知道工具每一部分的特定功能就可以开始创建自己的应用。<BR><BR>Visual Cafe提供了非常全面的用户指南,它对最开始的安装到创建第一个Java应用和Applet都提供了全面的帮助，Visual Cafe将自动生成所指明关系的必要Java代码。Visual Cafe可以在Windows 95和Windows NT平台下运行，Symantec公司为Java开发工作提供一个在Macintosh操作系统下可以运行的RAD工具。Visual Cafe编译器速度很快，在国际化支持方面比较突出；缺点就是对于初学者来说，较复杂，也比较难。<BR><BR>9、Macromedia的JRUN<BR><BR>Macromedia公司的JRun是一个具有最广阔适用性的Java引擎，用于开发及实施由Java Servlets和JavaServer Pages编写的服务器端Java应用。<BR><BR>JRun是第一个完全支持JSP 1.0 规格书的商业化产品，全球有超过80,000名开发人员使用JRun在他们已有的Web服务器上添加服务器端Java的功能。其中Web服务器包括了Microsoft IIS，Netscape Enterprise Server，Apache等。<BR><BR>JRun是开发实施服务器端Java的先进引擎。如果我们希望在我们的Web应用中添加服务器端Java功能，那么JRun将成为我们的正确选择。<BR><BR>JRun目前有3个版本，它是第一个支持Java Server Pages(JSP)规格书1.0的商业化产品。JSP是一种强大的服务器端技术，它是用于创建复杂Web应用的一整套快速应用开发系统。<BR><BR>JRun可以使我们开始开发并测试Java应用。它最多接受5个并发的连接并且包括全部Java Servlet API，支持JavaServer Pages(JSP)，支持所有主要的Web servers和计算机平台。 JRun Pro能够在生产环境下承受大访问量的负载，帮助我们实施应用、服务或Web站点（包括内联网）。<BR><BR>JRun Pro 支持无限量并发式连接运行多个Java虚拟机，包括多个并发的Java虚拟机（JVM）。提供一个远程管理applet以及一个远程可再分布式的管理applet。JRun Pro Unlimited包括了所有JRun Pro的功能，除次以外，还可以运行无限量的，并发的JVM。<BR><BR>JRun依靠其内置的JRun Web Server可以单独运行。使用服务器端Java，用户可以开发出复杂的商业应用系统。最重要的一点是，由于servlets的平台独立性，以及更加简单的开发、更快速的实施、更经济的维护成本，它是CGI(Common Gateway Interface)或Perl scripts的极佳的替代产品。缺点就是对于初学者来说，较复杂，也比较难。<BR><BR>10、JCreator<BR><BR>JCreator 是一个Java程序开发工具，也是一个Java集成开发环境（IDE）。无论你是要开发Java应用程序或者网页上的Applet元件都难不倒它。在功能上与Sun公司所公布的JDK等文字模式开发工具相较之下来得容易，还允许使用者自订义操作窗口界面及无限Undo/Redo等功能。<BR><BR>JCreator为用户提供了相当强大的功能，例如项目管理功能，项目模板功能，可个性化设置语法高亮属性、行数、类浏览器、标签文档、多功能编绎器，向导功能以及完全可自定义的用户界面。通过JCreator，我们不用激活主文档而直接编绎或运行我们的JAVA程序。<BR><BR>JCreator能自动找到包含主函数的文件或包含Applet的Html文件，然后它会运行适当的工具。在JCreator中，我们可以通过一个批处理同时编绎多个项目。JCreator的设计接近Windows界面风格，用户对它的界面比较熟悉。其最大特点是与我们机器中所装的JDK完美结合，是其它任何一款IDE所不能比拟的。它是一种初学者很容易上手的java开发工具，缺点是只能进行简单的程序开发，不能进行企业J2EE的开发应用。<BR><BR>11、Microsoft VJ++ <BR><BR>Visual J++ 是Microsoft 公司推出的可视化的Java 语言集成开发环境(IDE)，为Java 编程人员提供了一个新的开发环境，是一个相当出色的开发工具。无论集成性、编译速度、调试功能、还是易学易用性，都体现了Microsoft 的一惯风格。Visual J++ 具有下面的特点：<BR><BR>1）Visual J++ 把Java 虚拟机(JVM)作为独立的操作系统组件放入Windows，使之从浏览器中独立出来。<BR><BR>2）Microsoft 的应用基本类库(AFC,Application Foundation Class Library)对SUN 公司的JDK 作了扩展，使应用基本类库更加适合在Windows 下使用。<BR><BR>3） Visual J++ 的调试器支持动态调试，包括单步执行、设置断点、观察变量数值等。<BR><BR>4） Visual J++ 提供了一些程序向导(Wizards)和生成器(Builders)，它们可以方便地帮助用户快速地生成Java 程序，帮助你在自己的工程中创建和修改文件。<BR><BR>5） Visual J++ 界面友好，其代码编辑器具有智能感知、联机编译等功能，使程序编写十分方便。Visual J++ 中建立了Java 的WFC，这一新的应用程序框架能够直接访问Windows 应用程序接口(API)，使你能够用Java 语言编写完全意义上的Windows 应用程序。<BR><BR>6）Visual J++ 中表单设计器的快速应用开发特性使用WFC 创建基于表单的应用程序变得轻松、简单。<BR><BR>通过WFC 可以方便地使用ActiveX 数据对象(ADO,ActiveX Data Objects)来检索数据和执行简单数据的绑定。通过在表单设计器中使用ActiveX 数据对象，可以快速地在表单中访问和显示数据。<BR><BR>Visual J++能结合微软的一贯的编程风格，很方便进行Java 的应用开发，但它的移植性较差，不是纯的Java 开发环境。<BR>12、Eclipse <BR><BR>Eclipse是一种可扩展的开放源代码IDE。2001年11月，IBM公司捐出价值4,000万美元的源代码组建了Eclipse联盟，并由该联盟负责这种工具的后续开发。集成开发环境(IDE)经常将其应用范围限定在“开发、构建和调试”的周期之中。<BR><BR>为了帮助集成开发环境(IDE)克服目前的局限性，业界厂商合作创建了Eclipse平台。Eclipse允许在同一IDE中集成来自不同供应商的工具，并实现了工具之间的互操作性，从而显著改变了项目工作流程，使开发者可以专注在实际的嵌入式目标上。<BR><BR>Eclipse框架的这种灵活性来源于其扩展点。它们是在XML中定义的已知接口，并充当插件的耦合点。扩展点的范围包括从用在常规表述过滤器中的简单字符串，到一个Java类的描述。<BR><BR>任何Eclipse插件定义的扩展点都能够被其它插件使用，反之，任何Eclipse插件也可以遵从其它插件定义的扩展点。除了解由扩展点定义的接口外，插件不知道它们通过扩展点提供的服务将如何被使用。<BR><BR>利用Eclipse，我们可以将高级设计(也许是采用UML)与低级开发工具(如应用调试器等)结合在一起。如果这些互相补充的独立工具采用Eclipse扩展点彼此连接，那么当我们用调试器逐一检查应用时，UML对话框可以突出显示我们正在关注的器件。<BR><BR>事实上，由于Eclipse并不了解开发语言，所以无论Java语言调试器、C/C++调试器还是汇编调试器都是有效的，并可以在相同的框架内同时瞄准不同的进程或节点。<BR><BR>Eclipse的最大特点是它能接受由Java开发者自己编写的开放源代码插件，这类似于微软公司的Visual Studio和Sun微系统公司的NetBeans平台。<BR><BR>Eclipse为工具开发商提供了更好的灵活性，使他们能更好地控制自己的软件技术。Eclipse联盟已经宣布将在2004年中期发布其3.0版软件。这是一款非常受欢迎的java开发工具，这国内的用户越来越多，实际上实用它java开发人员是最多的。缺点就是较复杂，对初学者来说，理解起来比较困难。<BR><BR>13、Ant <BR><BR>Another Neat Tool(Ant)是一种基于Java的build工具。理论上来说，它有些类似于（Unix）C中的make ，但没有make的缺陷。因为Ant的原作者在多种(硬件)平台上开发软件时，无法忍受这些工具的限制和不便。<BR><BR>类似于make的工具本质上是基于shell（语言）的：他们计算依赖关系，然后执行命令（这些命令与你在命令行敲的命令没太大区别）。这就意味着你可以很容易地通过使用OS特有的或编写新的（命令）程序扩展该工具；然而，这也意味着你将自己限制在了特定的OS，或特定的OS类型上，如Unix。Ant就不同了。<BR><BR>与基于shell命令的扩展模式不同，Ant用Java的类来扩展。（用户）不必编写shell命令，配置文件是基于XML的，通过调用target树，就可执行各种task。每个task由实现了一个实现了特定Task接口的对象来运行。<BR><BR>Ant支持一些可选task，一个可选task一般需要额外的库才能工作。可选task与Ant的内置task分开，单独打包。这个可选包可以从你下载Ant的同一个地方下载。ANT本身就是这样一个流程脚本引擎，用于自动化调用程序完成项目的编译，打包，测试等。<BR><BR>除了基于JAVA是平台无关的外，脚本的格式是基于XML的，比make脚本来说还要好维护一些。Ant是Apache提供给Java开发人员的构建工具，它可以在Windows OS和Unix OS下运行，它不仅开放源码并且还是一个非常好用的工具。<BR><BR>Ant是Apache Jakarta中一个很好用的Java开发工具，Ant配置文件采用XML文档编写，所以Java程序员对其语法相当熟悉，Ant是专用于Java项目平台，能够用纯Java来开发，它能够运行于Java安装的平台，即体现了它的跨平台功能。它的缺点显示执行结果只能是DOS字符界面，不能进行复杂的java程序开发。<BR>14、IntelliJ<BR><BR>Intellij IDEA是一款综合的Java 编程环境，被许多开发人员和行业专家誉为市场上最好的IDE。它提供了一系列最实用的的工具组合：智能编码辅助和自动控制，支持J2EE，Ant，JUnit和CVS集成，非平行的编码检查和创新的GUI设计器。<BR><BR>IDEA把Java开发人员从一些耗时的常规工作中解放出来，显著地提高了开发效率。具有运行更快速，生成更好的代码；持续的重新设计和日常编码变得更加简易，与其它工具的完美集成；很高的性价比等特点。在4.0版本中支持Generics，BEA WebLogic集成，改良的CVS集成以及GUI设计器。<BR><BR>IntelliJ IDEA能尽可能地促进程序员的编程速度。它包括了很多辅助的功能，并且与Java结合得相当好。不同的工具窗口围绕在主编程窗口周围，当鼠标点到时即可打开，无用时也可轻松关闭，使用户得到了最大化的有效屏幕范围。<BR><BR>以技术为导向的IDEA集成了调试器，支持本地和远程的调试，即使我们需要修改一些设置上的东西使我们的工作顺利进展。另外，它还提供了通常的监视，分步调试以及手动设置断点功能，在这种断点模式下，我们可以自动地在断点之外设置现场访问，甚至可以浏览不同的变量的值。<BR><BR>IDE支持多重的JVM设置，几个编译程序和Ant建造系统，并且，它使得设置多重的自定义的类途径变得简单。<BR><BR>IntelliJ Idea是一个相对较新的Java IDE。它是Java开发环境中最为有用的一个。高度优化的IntelleJ Idea使普通任务变得相当容易，Idea支持很多整合功能，更重要的使它们设计的好容易使用。Idea支持XML中的代码实现，Idea同时还会校正XML，Idea支持JSP的结构。<BR><BR>作用于普通Java代码的众多功能同样适用于JSP（比如整合功能），同时支持JSP调试；支持EJB，尽管它不包括对个别应用服务器的特殊支持。Idea支持Ant建立工具，不仅是运行目标它还支持编译与运行程序前后运行目标，另外也支持绑定键盘快捷键。<BR><BR>在编辑一个Ant建立XML文件时，Idea还对组成Ant工程的XML部分提供支持。IntelliJ IDEA 被称为是最好的JAVA IDE开发平台，这套软件就是以其聪明的即时分析和方便的 refactoring 功能深获大家所喜爱。缺点是较复杂，对初学者来说，理解起来比较困难。<BR><BR>小结<BR><BR>现在常用的Java项目开发环境有：JBuilder、VisualAge for Java、Forte for Java, Visual Cafe、Eclipse、NetBeans IDE、JCreator +J2SDK、jdk+记事本、EditPlus+ J2SDK等等。一般开发J2EE项目时都需要安装各公司的应用服务器（中间件）和相应的开发工具，在使用这些开发工具之前，我们最好能熟知这些软件的优点和缺点，以便根据实际情况选择应用。<BR><BR>编程工具只是工具，为了方便人们工作而开发的，各有特点，因此，选工具主要的依据自己将要从事的领域是什么，而不是盲目的认为那种工具好，那种工具不好。最后希望大家都能找到自己合适的java 开发工具。<BR><img src ="http://www.blogjava.net/qq13367612/aggbug/18132.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qq13367612/" target="_blank">Sung</a> 2005-11-04 14:03 <a href="http://www.blogjava.net/qq13367612/articles/18132.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDO技术分析及如何进入企业应用的研究</title><link>http://www.blogjava.net/qq13367612/articles/18130.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Fri, 04 Nov 2005 05:53:00 GMT</pubDate><guid>http://www.blogjava.net/qq13367612/articles/18130.html</guid><wfw:comment>http://www.blogjava.net/qq13367612/comments/18130.html</wfw:comment><comments>http://www.blogjava.net/qq13367612/articles/18130.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qq13367612/comments/commentRss/18130.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qq13367612/services/trackbacks/18130.html</trackback:ping><description><![CDATA[JDO（Java Data Object）是JCP中较早开发出来并形成规范的JSR12，该规范对数据的持久化存储进行了一系列规范，并已有众多的商业产品和开源项目是基于该规范。作为一种需要引起重视的技术，研究并探讨其企业应用可行性是十分重要的。 <BR><BR>前言 <BR><BR>在企业级的应用开发中，常需要有良好的持久化技术来支持数据存储。通过良好的规范或API，将企业的领域业务对象进行持久化存储，大多采用O/R映射技术来进行模式化的数据转换及自动映射工作。 <BR><BR>JDO（Java Data Object）是JCP中较早开发出来并形成规范的JSR12，该规范对数据的持久化存储进行了一系列规范，并已有众多的商业产品和开源项目是基于该规范。作为一种需要引起重视的技术，研究并探讨其企业应用可行性是十分重要的。 <BR><BR>以下主要对JDO（JDO 1.0规范）的应用开发技术作扼要介绍，通过该文，可以由浅入深、并较为全面地了解JDO，掌握主要的技术细节及过程，理解其运行机制，并对企业级应用有个总体的把握，这将有助于企业应用软件的技术选型、体系架构及分析设计活动。 <BR><BR>该文适合企业应用架构师、及关心数据持久层设计开发人员。 <BR><BR>JDO基本思想及特点 <BR><BR>企业信息系统的一个重要问题是解决数据的存储，即持久化。在软件开发过程中，分析员分析领域业务，提取出领域业务模型，并对应设计出数据库中需要进行存储业务数据的数据库表及相应字段。 <BR><BR>并根据业务流程，设计业务处理逻辑单元，进行数据的加工、处理及存储、查询等业务。其中一个较为繁烦、枯燥的工作，就是处理大量的数据持久化代码。 <BR><BR>为了解决数据从业务对象层向数据存储层之间的转换工作，JDO提供了相应的开发规范及API，解决了由Java对象直接存储为数据库相应表的底层处理过程，有助于设计人员更加专注于面向业务流程、面向业务对象等较高层次的应用。 <BR><BR>由于采用JDO的映射机制，能降低了业务系统与数据存储系统的耦合，使得业务系统相对于关系数据库或对象型数据库，具有可移植性，同时，由于采用面向对象（而非传统的面向记录）的持久化技术，系统更为轻便、简洁，增强了可维护性。 <BR><BR>JDO应用示例及分析 <BR><BR>以下将通过一些示例，由浅及深地讲解JDO技术。 <BR><BR>临时对象与持久对象 <BR><BR>这是一个普通的业务对象的代码。<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>package business.model; 
public class Book 
{ 
  private String isbn; 
  private String name; 
  private Date publishDate; 
  public void setISBN(String isbn)
  { 
    this.isbn = isbn; 
  } 
  public String getISBN()
  { 
    return this.isbn; 
  } 
  public void setName(String name)
  { 
    this.name = name; 
  } 
  public String getName()
  { 
    return this.name; 
  } 
  public void 
  setPublishDate(Date pubDate)
  { 
    this.publishDate = pubDate; 
  } 
  public Date getPublishDate()
  { 
    return this.publishDate; 
  } 
}</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>现在将它作为一个JDO中对象保存到数据库中。代码如下： <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>Book book = new Book(); 
book.setISBN(“isbn-1234567”); 
book.setName(“Java设计模式”); 

PersistenceManager 
manager = persistenceManagerFactory.
getPersistenceManager(); 
manager.currentTransaction().begin(); 
manager.makePersistence(book); 
manager.currentTransaction().commit();</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>Book类的实例book对JDO的API而言，就是一个持久对象。类Book是可持久类。那任何一个普通java类都是JDO的可持久类吗？不是的。只有具备以下的条件，一个对象才可以被JDO持久到数据库中。 <BR><BR>它所属类应标记为可持久的类，有以下两种方法： <BR><BR>显式：实现接口，javax.jdo.PersistenceCapable即可； <BR><BR>隐式：以Sun的JDO参考实现为例，Book.java类的相同路径下还须有Book.jdo文件。 <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>&lt;?xml version=“1.0” 
encoding = “UTF-8”?&gt; 
&lt;!DOCTYPE jdo SYSTEM “jdo.dtd”&gt; 
&lt;jdo&gt; 
  &lt;package name = “business.model”&gt; 
     &lt;class name = “Book”/&gt; 
  &lt;/package&gt; 
&lt;/jdo&gt;</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>并通过字节码增强工具（本例采用Sun的字节码增强工具）处理: <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>javac Book.java 
java com.sun.jdori.enhancer.Main 
Book.class Book.jdo</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>通过上述两种方法，获得的Book.class才是一个可持久的类。 <BR><BR>字节码增强的有如下功能：当应用程序通过set方法修改某个字段1时，由于通过增强过程，在其内部插入了某些代码，JDO会获得数据状态变化的信息，从而在持久过程中，进行有选择性的处理。 <BR><BR>按照JDO规范，增强后的类可以在不同的JDO实现上使用，而无需重新编译或增强。 <BR><BR>并不是所有Book对象都是持久对象，只有当makePersistence后，该对象才是持久对象，并会通过JDO实现存储到数据库中。通过JDO的供应商扩展标记符（vendor-extension），可详细描述Book类的存储特性，如为该可持久类指定数据库表和对应字段。 <BR><BR>持久对象查询 <BR><BR>JDO查询主要有以下两种方式。 <BR><BR>使用Extend查询 <BR><BR>Extend可以查询指定类及子类的持久对象。 <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>PersistenceManager
manager = persistenceManagerFactory.
getPersistenceManager(); 
manager.currentTransaction().begin(); 
Extend extend =
manager.getExtend(Book.class,true);
//true表明同时查询子类 
Iterator it = extend.iterator(); 
while(it.hasNext())
{ 
  Book book = (Book)it.next(); 
  System.out.println(book.getISBN()); 
} 
extend.closeAll(); 
manager.currentTransaction().commit();</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>Extend查询方法，提供了一种基于类的查询途径，它可以与下面的Query构成更为强大的查询。 <BR><BR>使用Query查询 <BR><BR>Query可以指定过滤条件，是一种常用的查询方式。 <BR><BR>下例是查找条件为“书名以‘Java设计模式’开头且出版日期小于今天”的书籍。 <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>String filter = 
“((String)name).startsWith(\”Java设计模式\”)
&amp;&amp; publishDate &lt; today”; 
Query query = 
pm.getQuery(Book.class,filter); 
query.declareImports(“import java.util.Date”); 
query.declareParameters(“Date today); 

Date today = new Date(); 
results = (Collection)
query.execute(today);
//传入参数值today 
if (results.isEmpty())
{ 
  System.out.println(“No data!”); 
}else{ 
  Iterator it = results.iterator(); 
  while(it.hasNext())
  { 
    Book book = (Book)it.next(); 
    System.out.println
	(“Book Name:” + book.getName()
	+ “, ISBN:” + book.getISBN()); 
  } 
}</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>注：该条件使用了一个变元‘today’，通过“declareParameters”来声明该变量，并在“execute”方法中传入该变量的实例。这种带参数的查询，很类似于我们以前采用JDBC的带?的查询方式。 <BR><BR>其中startsWith(String s)是JDO提供的标准字符方法，类似的方法还有endsWith(String s)。 <BR><BR>JDOQL：上述使用的就是一个JDOQL样例，JDOQL是JDO规范一个组成部分。使用JDOQL可以使用应用在不同的JDO实现上运行。为了解决JDOQL的某些不足，JDO规范提供了支持特定JDO供应商查询语句接口。 <BR><BR>查询排序 <BR><BR>下例是将查询结果按“出版日期降序、书名升序”进行排序。 <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>Query query = 
pm.newQuery(Book.class, filter); 

String orderStr = 
“publishDate decending, name ascending”; 
query.setOrdering(orderStr); 

results = query.execute(today);</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER>对象更新 <BR><BR>当客户端对业务数据进行了更新后，需要通过业务过程将其更新到持久层中。这有两个过程，首先根据主键找到该实例，接着更新字段及提交。如下例，将指定书目编号的书本的出版日期进行更改。<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>public void updateBookPublishDate
(String isbn, Date newDate)
{ 
  PersistenceManager pm = null; 
  try{ 
pm = pmf.getPersistenceManager(); 
Object obj = 
pm.newObjectIdInstance(Book.class,isbn); 
Book book = 
(Book)pm.getObjectById(obj,true); 
book.setPublishDate(newDate); 
  }catch(Exception e)
  { 
xxxContext.setRollbackOnly(); 
throw new Exception(e); 
  }finally{ 
    try{ 
if (pm != null &amp;&amp; !pm.isClosed())
{ 
    pm.close(); 
} 
}catch(Exception ex)
{ 
  System.out.println(ex); 
  } 
}</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>注，在PersistenceManager使用newObjectIdInstance（）方法时，JDO是如何知道通过书目编号ISBN来找到该对象呢？其实在本可持久类Book的jdo描述文件中，还需提供如下信息： <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>&lt;?xml version=“1.0” 
encoding = “UTF-8”?&gt; 
&lt;!DOCTYPE jdo SYSTEM “jdo.dtd”&gt; 
&lt;jdo&gt; 
  &lt;package name = “business.model”&gt; 
     &lt;class name = “Book”
	 identity-type=“application”
	 objectid-class=“BookKey” &gt; 
          &lt;field name=“isbn”
		  primary-key=“true”/&gt; 
     &lt;/class&gt; 
  &lt;/package&gt; 
&lt;/jdo&gt;</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>其中“identity-type=“application””声明可持久类Book采用程序标识方式，即应用程序传入ID（字段isbn为“primary-key”）信息，JDO实现构造出指定的“objectid-class”的实例（即newObjectIdInstance过程），并由JDO来检索出指定的持久化对象（即getObjectById）。 <BR><BR>BookKey类源码如下： <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>package businesss.model; 
public class BookKey implements
java.io.Serializable
{ 
      public String isbn; 
      public BookKey()
	  { 
      } 
      public BookKey(String oid)
	  { 
    isbn = oid; 
    } 
    public String toString()
	{ 
          return isbn; 
    } 
    public Boolean equals(Object obj)
	{ 
      return isbn.equals
	  ((BookKey)obj).isbn); 
    } 
    public int hashCode()
	{ 
          return isbn.hashCode(); 
    } 
}</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>符合 JDO 的“objectid-class”类，如“BookKey”，须具备以下条件： <BR><BR>类声明为 public，并实现 java.io.Serializable； <BR><BR>带有一个公有且不带参数的构造方法； <BR><BR>当字段作为主键时，须有公有的，且名称和类型与持久类的字段一致，如：public String isbn； <BR><BR>equals 和 hashCode 须使用全部（特指多字段的联合主键）的主键字段值； <BR><BR>类必须有一个构造方法，与 toString 方法的处理过程是逆向过程；即将 toString 的输出值，作为该构造方法的输入值，又可以重新生成该实例（如构造方法“public BookKey(String oid)”）。 <BR><BR>综上所述，如果Book由两个字段作为主键，如isbn和name，则可能的代码是pm.newObjectIdInstance(Book.class,isbn+“#”+name)，且BookKey的构造方法作相应更改，并有两个公有字段“isbn”和“name”。 <BR><BR>对象删除 <BR><BR>对象删除采用方法deletePersistence。示例如下：<BR><BR><BR><BR><BR><BR><BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>pm.currentTransaction().begin(); 
Object obj = 
pm.newObjectIdInstance
(Book.class,isbn); 
Book book = 
(Book)pm.getObjectById(obj,true); 
pm.deletePersistence(book); 
pm.currentTransaction().commit();</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>获得PersistenceManager实例 <BR><BR>上述的所有操作与需要PersistenceManager实例，它可以在两种环境方法下获得：非受管环境和受管环境。 <BR><BR>非受管环境 <BR><BR>非受管环境是多指两层开发模式，应用程序直接获得资源对象，进行业务操作。一般事务管理、安全管理或资源管理都需要应用程序自行维护。 <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>Properties properties =
new Properties(); 
properties.put(“javax.jdo.
PersistenceManagerFactoryClass”,
“com.xxx.jdo.xxxPMFClass”); 
properties.put(“javax.jdo.
option.ConnectionURL”, “xxx”); 
properties.put(“javax.jdo.
option.ConnectionUserName”, “xxx”); 
properties.put(“javax.jdo.
option.ConnectionPassword”, “xxx”); 
PersistenceManagerFactory pmf = 
JDOHelper.getPersistence
ManagerFactory(properties); 
PersistenceManager pm = 
pmf.getPersistenceManager();</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>与JDBC获取类似。 <BR><BR>受管环境 <BR><BR>受管环境一般是多层开发模式，尤其是处于J2EE应用环境中，程序通过容器获得资源对象，进行业务操作，由于在容器环境下，事务、安全及资源管理都由容器进行统一集中管理，从而简化了代码结构。 <BR><BR>以下是EJB（EntityBean、SessionBean、MessageDrivenBean）中的setXXXContext中的代码示例。 <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>private PersistenceManagerFactory pmf; 
public void setXXXContext
(XXXContext context)
{ 
  try{ 
    InitialContext ctx =
	new InitialContext(); 
    Object obj = ctx.lookup
	(“java:compenvjdofactory”); 
    pmf = (PersistenceManagerFactory)
	PortableRemoteObject.narrow
	(o,PersistenceManagerFactory.class); 
  }catch(NamingException e)
  { 
    throw new Exception(e); 
  } 
}</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>PMF是如何绑定到J2EE环境下的JNDI上，有兴趣可参考JCA相关的技术文档。 <BR><BR>事务管理 <BR><BR>事务管理及使用，主要有以下三种情形。 <BR><BR>使用JDO事务的Bean管理情形 <BR><BR>一般在非J2EE环境下，使用该事务管理模式。 <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=bla