﻿<?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-justinlei-文章分类-Java</title><link>http://www.blogjava.net/justinlei/category/2530.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 18 Dec 2009 23:33:54 GMT</lastBuildDate><pubDate>Fri, 18 Dec 2009 23:33:54 GMT</pubDate><ttl>60</ttl><item><title>Java设计模式之计数代理模式</title><link>http://www.blogjava.net/justinlei/articles/19875.html</link><dc:creator>JustinLei</dc:creator><author>JustinLei</author><pubDate>Tue, 15 Nov 2005 06:25:00 GMT</pubDate><guid>http://www.blogjava.net/justinlei/articles/19875.html</guid><wfw:comment>http://www.blogjava.net/justinlei/comments/19875.html</wfw:comment><comments>http://www.blogjava.net/justinlei/articles/19875.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/justinlei/comments/commentRss/19875.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/justinlei/services/trackbacks/19875.html</trackback:ping><description><![CDATA[描述：<br>
<br>
　　计数代理模式在客户对象调用服务提供者对象上方法的前后执行诸如日志（logging）和计数（counting）一系列附加
功能时很有用。计数代理模式建议把这些附加功能封装在一个单独的对象，这个对象就是指计数代理对象，而不是把这些附加的功能实现放到服务提供者的内部。良
好的对象设计的一个特征就是对象要专注于提供特定的功能。换句话说，理想的对象不应该做各种不相干的事情。把诸如日志（logging）和计数
（counting）等类似的功能封装为一个单独的对象，而让服务提供者对象仅提供它自己的特定功能。也就是说，只允许服务提供者对象执行定义良好、特定
的任务。<br>
<br>
　　计数代理被设计成可以被客户访问的与服务提供者具有相同接口的对象。客户对象不是直接访问服务提供者，而是调用计数代理对象上的方法，计数代理执行必要的纪录日志（logging）和计数（counting）功能后，再把方法调用传递给服务提供着对象。如图1<br>
<br>
<table align="center" border="0" width="90%">
<tbody><tr><td><div align="center"><img src="http://yesky.anhuinews.com/imagelist/05/11/2828o18m1i2q.bmp"><br>Figure1: Generic Class Association When the Counting Proxy Pattern Is Applied </div></td></tr></tbody>
</table>
<br>
<br>
　　下面的例子说明了如何在应用程序中利用计数代理。<br>
<br>
　　例子：<br>
<br>
　　让我们设计一个Order类，类层次如图2，OrderIF接口声明了getAllOrders读取数据库中所有订单的简单方法。<br>
<br>
<table align="center" border="0" width="90%">
<tbody><tr><td><div align="center"><img src="http://yesky.anhuinews.com/imagelist/05/11/q0hxcf0kyz9y.bmp"><br>Figure2: Order Class Hierarchy </div></td></tr></tbody>
</table>
<br>
<table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%">
<tbody><tr><td>public <a class="bluekey" href="http://www.yesky.com/key/1507/116507.html" target="_blank">interface</a> OrderIF { <br>public Vector getAllOrders(); <br>} </td></tr></tbody>
</table>
<br>
　　作为getAllOrders方法实现的一部分，Order类实用了FileUtil工具类从order.txt文件中读取订单项。<br>
<br>
<table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%">
<tbody><tr><td>public class Order <a class="bluekey" href="http://www.yesky.com/key/1898/116898.html" target="_blank">implements</a> OrderIF { <br>　public Vector getAllOrders() { <br>　　FileUtil fileUtil = new FileUtil(); <br>　　Vector v = fileUtil.fileToVector("orders.txt"); <br>　　return v; <br>　} <br>} </td></tr></tbody>
</table>
<br>
　　让我们假定在调用getAllOrders()时，需要把取数据文件所花费的时间和记录条数要记录的log日志文件中。<br>
<br>
　　这个附加的功能可以设计一个单独的OrderProxy类来实现，它与真实对象Order一样实现OrderIF接口。这样保证了OrderProxy对象提供给客户与真实对象Order一样的接口。如图3<br>
<br>
<table align="center" width="90%">
<tbody><tr><td><div align="center"><img src="http://yesky.anhuinews.com/imagelist/05/11/6l0166q4mc67.bmp"><br>Figure3: Order Class Hierarchy <a class="bluekey" href="http://www.yesky.com/key/1588/96588.html" target="_blank">with</a> the Counting Proxy </div></td></tr></tbody>
</table>
<br>
<table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%">
<tbody><tr><td>public class OrderProxy implements OrderIF { <br>　private <a class="bluekey" href="http://www.yesky.com/key/1772/116772.html" target="_blank">int</a> counter = 0; <br>　public Vector getAllOrders() { <br>　　Order order = new Order(); <br>　　counter++; <br>　　long t1 = System.currentTimeMillis (); <br>　　Vector v = order.getAllOrders(); <br>　　long t2 = System.currentTimeMillis(); <br>　　long timeDiff = t2 ? t1; <br>　　String <a class="bluekey" href="http://www.yesky.com/key/1978/111978.html" target="_blank">msg</a> = "Iteration=" + counter + "::Time=" + timeDiff + "ms"; <br>　　//log the message <br>　　FileUtil fileUtil = new FileUtil(); <br>　　fileUtil.writeToFile("log.txt”,msg, true, true); <br>　　return v; <br>　} <br>} </td></tr></tbody>
</table>
<br>
　
　客户对象MainApp就想调用真实对象Order一样调用OrderProxy对象上的getAllOrders()方法，OrderProxy对象
传递这个调用给真实对象Order,计算读取所有订单所花费的时间并使用FileUtil帮助类将其纪录的log日志文件中。在这个过程中，
OrderProxy扮演者计数代理的角色。<br>
<br>
public class MainApp { <br>
　public static void main(String[] args) { <br>
　　OrderIF order = new OrderProxy(); <br>
　　Vector v = order.getAllOrders(); <br>
　　v = order.getAllOrders(); <br>
　　v = order.getAllOrders(); <br>
　　v = order.getAllOrders(); <br>
　} <br>
}<img src ="http://www.blogjava.net/justinlei/aggbug/19875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/justinlei/" target="_blank">JustinLei</a> 2005-11-15 14:25 <a href="http://www.blogjava.net/justinlei/articles/19875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA的类反射</title><link>http://www.blogjava.net/justinlei/articles/19874.html</link><dc:creator>JustinLei</dc:creator><author>JustinLei</author><pubDate>Tue, 15 Nov 2005 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/justinlei/articles/19874.html</guid><wfw:comment>http://www.blogjava.net/justinlei/comments/19874.html</wfw:comment><comments>http://www.blogjava.net/justinlei/articles/19874.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/justinlei/comments/commentRss/19874.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/justinlei/services/trackbacks/19874.html</trackback:ping><description><![CDATA[<p>/**<br>&nbsp; * 类反射实现动态类调用<br>&nbsp; * @param instance&nbsp; 一个信息获取类的实例<br>&nbsp; * @param methodName 方法名称<br>&nbsp; * @param classes 参数类型数组<br>&nbsp; * @param objects 参数数组<br>&nbsp; * @return Object 返回了方法执行后的结果<br>&nbsp; */<br>&nbsp;private Object invokeInstanceMethod(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final Object instance, final String methodName, <br>&nbsp;&nbsp;&nbsp;final Class[] classes, final Object[] objects) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method method;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
method = instance.getClass().getDeclaredMethod(methodName, classes);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (NoSuchMethodException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
method = instance.getClass().getMethod(methodName, classes);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method.setAccessible(true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return method.invoke(instance, objects);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (NoSuchMethodException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new RuntimeException(e.getMessage());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (IllegalAccessException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new RuntimeException(e.getMessage());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (InvocationTargetException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
throw new RuntimeException(e.getTargetException().getMessage());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;/* （非 Javadoc）<br>&nbsp; * @see com.eware.dataBaseOperation.dataOperateToolKit<br>&nbsp; * .dataBaseOperate.InterFaceGetOwnerDataInfo#getOwnerTables()<br>&nbsp; */<br>&nbsp;/**<br>&nbsp; * 实现了接口方法获取当前用户所有表的信息<br>&nbsp; */<br>&nbsp;public ResultSet getOwnerTables() {<br>&nbsp;&nbsp;// TODO 自动生成方法存根<br>&nbsp;&nbsp;return (ResultSet)invokeInstanceMethod(goic, "getOwnerTables", <br>&nbsp;&nbsp;&nbsp;&nbsp;new Class[]{}, new Object[]{});<br>&nbsp;}</p>
<img src ="http://www.blogjava.net/justinlei/aggbug/19874.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/justinlei/" target="_blank">JustinLei</a> 2005-11-15 14:24 <a href="http://www.blogjava.net/justinlei/articles/19874.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA内部类的基本特征</title><link>http://www.blogjava.net/justinlei/articles/19873.html</link><dc:creator>JustinLei</dc:creator><author>JustinLei</author><pubDate>Tue, 15 Nov 2005 06:23:00 GMT</pubDate><guid>http://www.blogjava.net/justinlei/articles/19873.html</guid><wfw:comment>http://www.blogjava.net/justinlei/comments/19873.html</wfw:comment><comments>http://www.blogjava.net/justinlei/articles/19873.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/justinlei/comments/commentRss/19873.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/justinlei/services/trackbacks/19873.html</trackback:ping><description><![CDATA[<p style="font-family: arial;"><font size="5">内部类是<span style="font-size: 10pt;" lang="EN-US">Java</span><span style="font-size: 10pt;">语言一个重要的基本特性，在</span><span style="font-size: 10pt;" lang="EN-US">Java</span><span style="font-size: 10pt;">开发的许多领域都会经常用到。内部类的定义说简单一点就是将一个类定义在另外一个类的内部。内部类允许你把一些逻辑相关的类组织在一起，控制内部类代码的可视性，它和类的组合是完全不同的概念。内部类主要有以下比较关键的特性：</span><span style="font-size: 10pt;" lang="EN-US"></span></font> </p>
<p style="font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">&nbsp;</span></font></p>
<p style="font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">1.&nbsp; </span><span style="font-size: 10pt;">普通的非内部类不能被声明为</span><span style="font-size: 10pt;" lang="EN-US">private</span><span style="font-size: 10pt;">或</span><span style="font-size: 10pt;" lang="EN-US">protected</span><span style="font-size: 10pt;">，否则就失去了创建该类的意义。但是内部类通常可以被声明为</span><span style="font-size: 10pt;" lang="EN-US">private</span><span style="font-size: 10pt;">或</span><span style="font-size: 10pt;" lang="EN-US">protected</span><span style="font-size: 10pt;">类型，因为这样可以防止他人对该内部类实现的功能进行修改，达到隐藏实现细节的目的。例如：</span><span style="font-size: 10pt;" lang="EN-US"></span></font></p>
<p style="font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">class Fruit {</span></font></p>
<p style="font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US"><span>&nbsp; </span>private class Weight {</span></font></p>
<p style="text-indent: 21.75pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">private String i;</span></font></p>
<p style="text-indent: 21.75pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">private Weight(String j) {</span></font></p>
<p style="text-indent: 21.75pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US"><span>&nbsp; </span>i = j;</span></font></p>
<p style="text-indent: 21.75pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">}</span></font></p>
<p style="text-indent: 21.75pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">public String read() {</span></font></p>
<p style="text-indent: 21.75pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US"><span>&nbsp; </span>return i;</span></font></p>
<p style="text-indent: 21.75pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">}</span></font></p>
<p style="text-indent: 10pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">}</span></font></p>
<p style="font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">}</span></font></p>
<p style="font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">class test {</span></font></p>
<p style="font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US"><span>&nbsp; </span>public static void main(String[] args) {</span></font></p>
<p style="text-indent: 21.75pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">Fruit f = new Fruit();</span></font></p>
<p style="text-indent: 21.75pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">f.Weight w = f.new Weight(); //</span><span style="font-size: 10pt;">不能访问</span><span style="font-size: 10pt;" lang="EN-US">private</span><span style="font-size: 10pt;">类，如果</span><span style="font-size: 10pt;" lang="EN-US">Weight</span><span style="font-size: 10pt;">为</span><span style="font-size: 10pt;" lang="EN-US">protected</span><span style="font-size: 10pt;">类型则可以</span><span style="font-size: 10pt;" lang="EN-US"></span></font></p>
<p style="text-indent: 10pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">}</span></font></p>
<p style="font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">}</span></font></p>
<p style="font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">2.&nbsp; </span><span style="font-size: 10pt;">在方法或某控制语句</span><span style="font-size: 10pt;" lang="EN-US">(if/for/while</span><span style="font-size: 10pt;">等</span><span style="font-size: 10pt;" lang="EN-US">)</span><span style="font-size: 10pt;">的作用域内定义内部类，将只能在该范围内调用内部类的方法和成员变量。</span><span style="font-size: 10pt;" lang="EN-US"></span></font></p>
<p style="font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">3.&nbsp; </span><span style="font-size: 10pt;">匿名内部类是一种特殊的内部类，如果希望它使用一个在其外部定义的对象，那么编译器会要求其参数引用是</span><span style="font-size: 10pt;" lang="EN-US">final</span><span style="font-size: 10pt;">的。</span><span style="font-size: 10pt;" lang="EN-US"></span></font></p>
<p style="font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">public class Fruit {</span></font></p>
<p style="font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US"><span>&nbsp; </span>public Tea cont(final int j) {</span></font></p>
<p style="text-indent: 21.75pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">return new Tea() {</span></font></p>
<p style="text-indent: 21.75pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US"><span>&nbsp; </span>private int i = j;</span></font></p>
<p style="text-indent: 21.75pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US"><span>&nbsp; </span>public int read() {</span></font></p>
<p style="text-indent: 21.75pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>return i;</span></font></p>
<p style="text-indent: 30.7pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">}</span></font></p>
<p style="text-indent: 21.75pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">}; //</span><span style="font-size: 10pt;">注意这里的分号</span><span style="font-size: 10pt;" lang="EN-US"></span></font></p>
<p style="text-indent: 10pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">}</span></font></p>
<p style="text-indent: 10pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">public static void main(String[] args) {</span></font></p>
<p style="text-indent: 10pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US"><span>&nbsp; </span>Fruit f = new Fruit();</span></font></p>
<p style="text-indent: 10pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US"><span>&nbsp; </span>Tea t = f.cont;</span></font></p>
<p style="text-indent: 10pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">}</span></font></p>
<p style="font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">}</span></font></p>
<p style="text-indent: 21pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;">而当方法</span><span style="font-size: 10pt;" lang="EN-US">cont(final int j)</span><span style="font-size: 10pt;">中的参数</span><span style="font-size: 10pt;" lang="EN-US">j</span><span style="font-size: 10pt;">只是被传递到匿名类中的构造器时，可以不用被声明为</span><span style="font-size: 10pt;" lang="EN-US">final</span><span style="font-size: 10pt;">类型，如</span><span style="font-size: 10pt;" lang="EN-US">return new Tea(j)</span><span style="font-size: 10pt;">。这里提到了匿名内部类的构造器，那么它是怎么被初始化的呢？</span><span style="font-size: 10pt;" lang="EN-US"></span></font></p>
<p style="font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">public class Fruit {</span></font></p>
<p style="font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US"><span>&nbsp;</span><span>&nbsp;</span>public Tea cont(int j) {</span></font></p>
<p style="text-indent: 21.75pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">return new Tea(j) {</span></font></p>
<p style="text-indent: 21.75pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">System.out.println(j);</span></font></p>
<p style="text-indent: 21.75pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">}; </span></font></p>
<p style="text-indent: 10pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">}</span></font></p>
<p style="font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">}</span></font></p>
<p style="font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt;">还可以这样初始化匿名内部类：</span><span style="font-size: 10pt;" lang="EN-US"></span></font></p>
<p style="font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">public class Fruit {</span></font></p>
<p style="font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US"><span>&nbsp; </span>public Tea cont(final int j) {</span></font></p>
<p style="text-indent: 21.75pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">return new Tea(j) {</span></font></p>
<p style="text-indent: 21.75pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US"><span>&nbsp; </span>int i;</span></font></p>
<p style="text-indent: 21.75pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US"><span>&nbsp; </span>// </span><span style="font-size: 10pt;">初始化匿名内部类</span><span style="font-size: 10pt;" lang="EN-US"></span></font></p>
<p style="text-indent: 21.75pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US"><span>&nbsp; </span>{</span></font></p>
<p style="text-indent: 21.75pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US"><span>&nbsp; </span>i = j;</span></font></p>
<p style="text-indent: 21.75pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US"><span>&nbsp; </span>System.out.print(i);</span></font></p>
<p style="text-indent: 30.7pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">}</span></font></p>
<p style="text-indent: 21.75pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">}; </span></font></p>
<p style="text-indent: 10pt; font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">}</span></font></p>
<p style="font-family: arial;"><font size="5"><span style="font-size: 10pt;" lang="EN-US">}</span></font></p>
<font style="font-family: arial;" size="5"><span style="font-size: 10pt;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt;">方法</span><span style="font-size: 10pt;" lang="EN-US">cont()</span><span style="font-size: 10pt;">可以被称为实例初始化方法，使得匿名内部类通过构造器而被初始化，在实际应用中，我们不能重载实例初始化方法，因为匿名内部类只能有一个构造方法。</span></font><img src ="http://www.blogjava.net/justinlei/aggbug/19873.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/justinlei/" target="_blank">JustinLei</a> 2005-11-15 14:23 <a href="http://www.blogjava.net/justinlei/articles/19873.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA派生子类和继承</title><link>http://www.blogjava.net/justinlei/articles/19872.html</link><dc:creator>JustinLei</dc:creator><author>JustinLei</author><pubDate>Tue, 15 Nov 2005 06:21:00 GMT</pubDate><guid>http://www.blogjava.net/justinlei/articles/19872.html</guid><wfw:comment>http://www.blogjava.net/justinlei/comments/19872.html</wfw:comment><comments>http://www.blogjava.net/justinlei/articles/19872.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/justinlei/comments/commentRss/19872.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/justinlei/services/trackbacks/19872.html</trackback:ping><description><![CDATA[JAVA中的类均存在于一个体系结构中.在JAVA中，一个类可以通过使用extends关键字声明为另一个类的子类(subclass)。子类可
以从其超类（superclass）继承（inherit）变量和方法，并加以使用，就如同这些变量和方法由该子类本身所声明的一样：
<p>class Animal {<br>&nbsp;&nbsp;&nbsp; float weight;<br>&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp; void eat() {<br>&nbsp;...<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; ...<br>}</p>
<p>class Mammal extends Animal {<br>&nbsp;&nbsp;&nbsp; int heartRate;<br>&nbsp;&nbsp;&nbsp; //继承weight<br>&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp; void breathe() {<br>&nbsp;...<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; //继承eat<br>}</p>
<p>类只能扩展另外的一个类。只支持单继承（single inheritance）。</p>
<p>子类可以进一步派生子类。</p>

             <img src ="http://www.blogjava.net/justinlei/aggbug/19872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/justinlei/" target="_blank">JustinLei</a> 2005-11-15 14:21 <a href="http://www.blogjava.net/justinlei/articles/19872.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java设计模式之虚拟代理模式</title><link>http://www.blogjava.net/justinlei/articles/19871.html</link><dc:creator>JustinLei</dc:creator><author>JustinLei</author><pubDate>Tue, 15 Nov 2005 06:21:00 GMT</pubDate><guid>http://www.blogjava.net/justinlei/articles/19871.html</guid><wfw:comment>http://www.blogjava.net/justinlei/comments/19871.html</wfw:comment><comments>http://www.blogjava.net/justinlei/articles/19871.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/justinlei/comments/commentRss/19871.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/justinlei/services/trackbacks/19871.html</trackback:ping><description><![CDATA[<p>虚拟代理模式(Virtual
Proxy)是一种节省内存的技术，它建议创建那些占用大量内存或处理复杂的对象时，把创建这类对象推迟到使用它的时候。在特定的应用中，不同部分的功能
由不同的对象组成，应用启动的时候，不会立即使用所有的对象。在这种情况下，虚拟代理模式建议推迟对象的创建直到应用程序需要它为止。对象被应用第一次引
用时创建并且同一个实例可以被重用。这种方法优缺点并存。 <br><br></p>
<div class="guanggao"><span id="contentAdv"></span></div>
　　优点：<br>
<br>
　　这种方法的优点是，在应用程序启动时，由于不需要创建和装载所有的对象，因此加速了应用程序的启动。<br>
<br>
　　缺点:<br>
<br>
　　因为不能保证特定的应用程序对象被创建，在访问这个对象的任何地方，都需要检测确认它不是空(null)。也就是，这种检测的时间消耗是最大的缺点。<br>
<br>
　
　应用虚拟代理模式，需要设计一个与真实对象具有相同接口的单独对象（指虚拟代理）。不同的客户对象可以在创建和使用真实对象地方用相应的虚拟对象来代
替。虚拟对象把真实对象的引用作为它的实例变量维护。代理对象不要自动创建真实对象，当客户需要真实对象的服务时，调用虚拟代理对象上的方法，并且检测真
实对象是否被创建。<br>
<br>
　　如果真实对象已经创建，代理把调用转发给真实对象，如果真实对象没有被创建：<br>
<br>
　　1） 代理对象创建真实对象<br>
<br>
　　2） 代理对象把这个对象分配给引用变量。<br>
<br>
　　3） 代理把调用转发给真实对象<br>
<br>
　
　按照这种安排，验证对象存在和转发方法调用这些细节对于客户是不可见的。客户对象就像和真实对象一样与代理对象进行交互。因此客户从检测真实对象是否为
null中解脱出来，另外，由于创建代理对象在时间和处理复杂度上要少于创建真实对象。因此，在应用程序启动的时候，用代理对象代替真实对象初始化。<br>
<br>
　　例子：<br>
<br>
　
　假设我们建立一个JAVA程序的集成开发环境（Integrated Development
Environment）,这个环境包括三个功能：编译、运行、生成JavaDoc文档。在新建和编辑Java程序时，最为常用的是编译和运行。至于生成
JavaDoc文档对于每一个Java程序不是必需的。因此，在Java开发环境启动时，不要创建和装载实现集成开发环境全部功能的所有对象，仅创建那些
在编辑、编译、运行时用到的对象，保留提供生成JavaDoc文档的对象，这是一个好的设计思想。这种对象创建策略能够高效地利用内存空间并且加快了集成
开发环境的启动速度。<br>
<br>
　　假设编译、运行、生成JavaDoc文档这些功能分别由三个工具类提供??Compiler、Runtime和JavaDoc。客户对象可以访问的不同IDE操作的接口以抽象类IDEOperation的形式定义。<br>
<br>
<table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%">
<tbody><tr><td>public abstract class IDEOperation { <br>　private Compiler cmp; <br>　private Runtime rtime; <br>　public void compile(String javaFile) { <br>　　cmp.compile(javaFile); <br>　} <br>　public void run(String classFile) { <br>　　rtime.run (classFile); <br>　} <br>　//to be delayed until needed. <br>　public abstract void generateDocs(String javaFile); <br>　public IDEOperation() { <br>　　cmp = <a class="bluekey" href="http://www.yesky.com/key/1252/161252.html" target="_blank">new</a> Compiler(); <br>　　rtime = new Runtime(); <br>　} <br>} </td></tr></tbody>
</table>
<br>
　
　类IDEOperation提供了编译、运行java程序方法的实现，作为它构造函数的一部分，IDEOperation创建和装载了进行编译和执行操
作的Compiler和Runtime对象。生成JavaDoc文档的方法generateDocs方法被设计成抽象的方法，由它的子类来实现。<br>
<br>
　　让我们定义抽象类IDEOperation的一个具体子类RealProcessor。作为RealProcessor构造函数的一部分，创建JavaDoc对象来提供生成JavaDoc文档的服务，通过使用JavaDoc对象功能实现generateDocs方法。<br>
<br>
<table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%">
<tbody><tr><td>public class RealProcessor extends IDEOperation { <br>　JavaDoc jdoc; <br>　public RealProcessor() { <br>　　super(); <br>　　jdoc = new JavaDoc(); <br>　} <br>　public void generateDocs(String javaFile) { <br>　　jdoc.generateDocs(javaFile); <br>　} <br>}</td></tr></tbody>
</table>
<br>
　
　通过上面的实现，RealProcessor类包含了编译、运行和生成JavaDoc文档的所有功能。像我们原来讨论的，生成JavaDoc文档的功能
不是每一个Java程序所必须的，当RealProcessor实例化的时候，包括负责生成JavaDoc文档的JavaDoc对象的一系列对象被创建。
推迟创建JavaDoc对象有以下优点：<br>
<br>
　　1） 加速了RealProcessor对象的创建时间，因为它的构造函数创建的很少的对象。<br>
<br>
　　2） 高效地利用内存，因为在不需要对象服务的时候，不需要把对象保持在内存中。<br>
<br>
　
　在不改变RealProcessor实现的前提下，可以通过定义IDEOperation的另外一个子类ProxyProcessor来实现虚拟代理。
因为RealProcessor和ProxyProcessor共享相同的接口，客户对象可以用ProxyProcessor代替
RealProcessor。图25.1展示了类层次；<br>
<br>
<table align="center" border="0" width="90%">
<tbody><tr><td><div align="center"><img src="http://dev.yesky.com/imagelist/05/11/rh04rjju4aj5.bmp">&nbsp;<br><br>Figure 25.1: IDEOperation Class Hierarchy </div></td></tr></tbody>
</table>
<br>
<table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%">
<tbody><tr><td>public class ProxyProcessor extends IDEOperation { <br>　private RealProcessor realProcessor; <br>　public void generateDocs(String javaFile) { <br>　　/* <br>　　In order to generate javadocs <br>　　the proxy loads the actual object and <br>　　invokes its methods. <br>　　*/ <br>　　if (realProcessor == null) { <br>　　　realProcessor = new RealProcessor(); <br>　　} <br>　　realProcessor.generateDocs(javaFile); <br>　} <br>} </td></tr></tbody>
</table>
<br>
　
　作为自己的实例变量，ProxyProcessor维护了RealProcessor对象的一个引用。作为generateDocs方法的一部分，
ProxyProcessor检测引用变量是否被初始化为RealProcessor对象。如果没有被初始化，它创建一个RealProcessor对象
并把这个对象分配给它的实例变量。一旦RealProcessor对象已经被创建，就调用其上的generateDocs方法。<br>
<br>
　　实际上，也就是当客户对象第一次请求产生javadoc文档时，RealProcessor才被初始化装入内存中。反过来，直到客户需要为Java程序生成javadocs时，JavaDoc对象才会被创建和装入内存中。<br>
<br>
　　客户对象像调用真实处理对象一样调用ProxyProcessor上的方法，并不需要关心（知道）RealProcessor对象是否存在。 至于验证、检测和ProxyProcessor和RealProcessor之间的交互、这样的细节对于客户对象是透明的。<br>
<br>
<table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%">
<tbody><tr><td>public class Client { <br>　public static void main(String[] args) { <br>　　/* <br>　　At this <a class="bluekey" href="http://www.yesky.com/key/4909/159909.html" target="_blank">point</a> <a class="bluekey" href="http://www.yesky.com/key/4694/159694.html" target="_blank">objects</a> required for <br>　　the compile and run operations are <br>　　created, but not the objects that provide the <br>　　generate Javadoc functionality. <br>　　*/ <br>　　IDEOperation IDE = new ProxyProcessor(); <br>　　IDE.compile("test.java"); <br>　　IDE.run("test.class"); <br>　　/* <br>　　The Javadoc functionality <a class="bluekey" href="http://www.yesky.com/key/2516/152516.html" target="_blank">is</a> accessed <br>　　For the first time and hence the <br>　　Object offering the Javadoc <a class="bluekey" href="http://www.yesky.com/key/809/160809.html" target="_blank">generation</a> <br>　　Functionality is loaded at this point. <br>　　*/ <br>　　IDE.generateDocs("test.java"); <br>　} <br>} </td></tr></tbody>
</table>

             <img src ="http://www.blogjava.net/justinlei/aggbug/19871.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/justinlei/" target="_blank">JustinLei</a> 2005-11-15 14:21 <a href="http://www.blogjava.net/justinlei/articles/19871.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse家族法则(扩展者)</title><link>http://www.blogjava.net/justinlei/articles/19870.html</link><dc:creator>JustinLei</dc:creator><author>JustinLei</author><pubDate>Tue, 15 Nov 2005 06:20:00 GMT</pubDate><guid>http://www.blogjava.net/justinlei/articles/19870.html</guid><wfw:comment>http://www.blogjava.net/justinlei/comments/19870.html</wfw:comment><comments>http://www.blogjava.net/justinlei/articles/19870.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/justinlei/comments/commentRss/19870.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/justinlei/services/trackbacks/19870.html</trackback:ping><description><![CDATA[<p><font size="2"><strong>扩展者</strong></font></p>
<p><font size="2">1. 贡献法则(Contributin Rule):一切皆是贡献</font></p>
<p><font size="2">2.遵循法则(Conformance Rule):插件必须遵循预期的接口</font></p>
<p><font size="2">3.共享法则(sharing Rule):增加,不要取代</font></p>
<p><font size="2">4.有样学样法则(Monkey See/Monkey Do Rule):遇到问题时,首先复制类似插件的结构</font></p>
<p><font size="2">5.相关性法则(Relevance Rule):只有在操作有可能成功时才显示你所贡献的操作</font></p>
<p><font size="2">6.整合法则(Integration Rule):要整合不要分裂</font></p>
<p><font size="2">7.责任法则(Responsibility Rule):明确 指出你开发的插件时问题的源头</font></p>
<p><font size="2">8.针对API契约编程法则(Program To API Contract Rule):首先检查Eclipse API契约,然后后针对契约编程</font></p>
<p><font size="2">9."其他"法则(Other Rule):让用户可以选择所有东西,但把那些通常不用于当前视角的选项放在Other...对话框中</font></p>
<p><font size="2">10.IResource适配法则(Adapt To IResource Rule):应该尽量为领域对象定义IResource适配器</font></p>
<p><font size="2">11.分层法则(Strata Rule):将语言无关的功能与特定于具体语言的功能分开,将核心功能与UI功能分开</font></p>
<p><font size="2">12.使用连贯性法则(User Continuity Rule):在多次回话期间,应该保持用户界面状态一致</font></p>
<img src ="http://www.blogjava.net/justinlei/aggbug/19870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/justinlei/" target="_blank">JustinLei</a> 2005-11-15 14:20 <a href="http://www.blogjava.net/justinlei/articles/19870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>传递和返回对象：传递句柄</title><link>http://www.blogjava.net/justinlei/articles/19868.html</link><dc:creator>JustinLei</dc:creator><author>JustinLei</author><pubDate>Tue, 15 Nov 2005 06:15:00 GMT</pubDate><guid>http://www.blogjava.net/justinlei/articles/19868.html</guid><wfw:comment>http://www.blogjava.net/justinlei/comments/19868.html</wfw:comment><comments>http://www.blogjava.net/justinlei/articles/19868.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/justinlei/comments/commentRss/19868.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/justinlei/services/trackbacks/19868.html</trackback:ping><description><![CDATA[<p>将句柄传递进入一个方法时，指向的仍然是相同的对象。</p>
<p>public class PassHandles {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static void f(PassHandles h) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("h inside f(): " + h);<br>}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PassHandles
p = new PassHandles();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
System.out.println("p inside main(): " + p);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f(p);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>} </p>
<p><br>toString 方法会在打印语句里自动调用，而PassHandles 直接从Object 继承，没有toString 的重新定义。<br>因此，这里会采用toString 的Object 版本，打印出对象的类，接着是那个对象所在的位置（不是句柄，而<br>是对象的实际存储位置）。输出结果如下：<br>p inside main(): <a href="mailto:PassHandles@1653748">PassHandles@1653748</a><br>h inside f() : <a href="mailto:PassHandles@1653748">PassHandles@1653748</a><br>可以看到，无论p 还是h 引用的都是同一个对象。这比复制一个新的PassHandles 对象有效多了，使我们能<br>将一个参数发给一个方法。但这样做也带来了另一个重要的问题：别名问题</p>

             <img src ="http://www.blogjava.net/justinlei/aggbug/19868.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/justinlei/" target="_blank">JustinLei</a> 2005-11-15 14:15 <a href="http://www.blogjava.net/justinlei/articles/19868.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse家族法则(促成者)</title><link>http://www.blogjava.net/justinlei/articles/19867.html</link><dc:creator>JustinLei</dc:creator><author>JustinLei</author><pubDate>Tue, 15 Nov 2005 06:15:00 GMT</pubDate><guid>http://www.blogjava.net/justinlei/articles/19867.html</guid><wfw:comment>http://www.blogjava.net/justinlei/comments/19867.html</wfw:comment><comments>http://www.blogjava.net/justinlei/articles/19867.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/justinlei/comments/commentRss/19867.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/justinlei/services/trackbacks/19867.html</trackback:ping><description><![CDATA[<p><strong>促成者:</strong></p>
<p>1.邀请法则(Invitation Rule):尽可能的邀请别人为你的作品做出贡献</p>
<p>2.懒加载法则(Lazy Loading Rule):只有在真正需要的时候才加载插件</p>
<p>3.安全平台法则(Safe Platform Rule):作为扩展点的提供者,你必须保护好自己,不要让扩展者的误操作给你造成损失</p>
<p>4.公平竞赛法则(Fair Play Rule):所有使用者遵守同样的游戏规则,包括我自己</p>
<p>5.明确扩展法则(Explicit Extension Rule):明确说明平台的什么地方可供扩展</p>
<p>6.发散性法则(Diversity Rule):一个扩展点接纳多个扩展</p>
<p>7.良好防御法则(Good Fences Rule):如果要交出程序的控制权,首先保护好你自己</p>
<p>8.用户决定法则(User Arbitration Rule):如果有多个选择,由用户决定使用哪个</p>
<p>9.明确API法则(Explicit API Rule):将API与插件内部使用的类分开</p>
<p>10.稳定性法则(Stability Rule):如果你已经开始邀请其他人作出贡献,就不要再改变规则</p>
<p>11.保守API法则(Defensive API Rule):只暴露你有信心的API,但同时也要做好准备暴露更多的API,因为使用者会邀请你这样做</p>
<img src ="http://www.blogjava.net/justinlei/aggbug/19867.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/justinlei/" target="_blank">JustinLei</a> 2005-11-15 14:15 <a href="http://www.blogjava.net/justinlei/articles/19867.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Thread类和Runnable接口</title><link>http://www.blogjava.net/justinlei/articles/19866.html</link><dc:creator>JustinLei</dc:creator><author>JustinLei</author><pubDate>Tue, 15 Nov 2005 06:14:00 GMT</pubDate><guid>http://www.blogjava.net/justinlei/articles/19866.html</guid><wfw:comment>http://www.blogjava.net/justinlei/comments/19866.html</wfw:comment><comments>http://www.blogjava.net/justinlei/articles/19866.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/justinlei/comments/commentRss/19866.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/justinlei/services/trackbacks/19866.html</trackback:ping><description><![CDATA[在创建java.lang.Thread类的一个实例时就会"诞生"一个新线程。Thread对象表示Java<br>
解释器中一个实际的线程，并作为控制和协调其执行的一个句柄。利用Thread对象，可以启动线程、<br>
等待其完成、要求它睡眠一段时间，或者时中断其活动。Thread类的构造函数可接受线程应当在哪里<br>
开始执行等等有关的信息。从概念上说，我们只希望告诉它所要运行的方法，但是由于Java中不存在<br>
方法指针（至少没有这种意义的方法指针），因此我们并不能直接指定方法。与此不同，必须采取一种<br>
迂回线路，即使用java.lang.Runnable接口来创建一个对象，此对象中包含一个“可运行”的方。<br>
Runnable接口只定义了唯一的一个通用方法。<br>
<span style="font-weight: bold;">&nbsp;public interface Runnable {</span><br style="font-weight: bold;">
<span style="font-weight: bold;">&nbsp;abstract public void run();</span><br style="font-weight: bold;">
<span style="font-weight: bold;">}</span><br>
&nbsp;每个线程的生命周期都始于执行Runnable对象中的run()方法。此对象是传递给线程构造函<br>
数的“目标对象”。run()方法可以包含任何代码、但它必须是公共的，不仅没有任何实参，而且也没<br>
有返回值，另外不会抛出任何受查异常。<br>
&nbsp;任何包含有合适的run()方法的类都可以声明它实现了Runnable接口。此类的实例就是一个<br>
可运行的对象，它可以作为一个线程的目标。如果不希望将run()直接放在对象中（而且通常不会这样<br>
做），则可以建立一个适配器类，由它作为一个Runnable类。适配器的run()方法则能够在线程启动<br>
<p>后调用任何需要的方法</p>
<img src ="http://www.blogjava.net/justinlei/aggbug/19866.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/justinlei/" target="_blank">JustinLei</a> 2005-11-15 14:14 <a href="http://www.blogjava.net/justinlei/articles/19866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ANT</title><link>http://www.blogjava.net/justinlei/articles/19865.html</link><dc:creator>JustinLei</dc:creator><author>JustinLei</author><pubDate>Tue, 15 Nov 2005 06:12:00 GMT</pubDate><guid>http://www.blogjava.net/justinlei/articles/19865.html</guid><wfw:comment>http://www.blogjava.net/justinlei/comments/19865.html</wfw:comment><comments>http://www.blogjava.net/justinlei/articles/19865.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/justinlei/comments/commentRss/19865.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/justinlei/services/trackbacks/19865.html</trackback:ping><description><![CDATA[&nbsp;Ant的构建文件是用XML编写的与大多数实际应用中的构建文件相比，它要简单一些，但确实能够说明几乎每个Java 工程所需的一些核心概念。<br>
<br>
&lt;?xml version="1.0"?&gt;<br>
&lt;!-- build.xml - a simple Ant buildfile --&gt;<br>
&lt;project name="Simple Buildfile" default="compile" basedir="."&gt;<br>
&lt;!-- The directory containing source code --&gt;<br>
&lt;property name="src.dir" value="src"/&gt;<br>
&lt;!-- Temporary build directories --&gt;<br>
&lt;property name="build.dir" value="build"/&gt;<br>
&lt;property name="build.classes" value="${build.dir}/classes"/&gt;<br>
&lt;property name="build.lib" value="${build.dir}/lib"/&gt;<br>
&lt;!-- Target to create the build directories prior to the --&gt;<br>
&lt;!-- compile target. --&gt;<br>
&lt;target name="prepare"&gt;<br>
&lt;mkdir dir="${build.dir}"/&gt;<br>
&lt;mkdir dir="${build.classes}"/&gt;<br>
&lt;mkdir dir="${build.lib}"/&gt;<br>
&lt;/target&gt;<br>
&lt;target name="clean" description="Removes all generated files."&gt;<br>
&lt;delete dir="${build.dir}"/&gt;<br>
&lt;/target&gt;<br>
&lt;target name="compile" depends="prepare"<br>
description="Compiles all source code."&gt;<br>
&lt;javac srcdir="${src.dir}" destdir="${build.classes}"/&gt;<br>
&lt;/target&gt;<br>
&lt;target name="jar" depends="compile"<br>
description="Generates test.jar in the 'dist' directory."&gt;<br>
&lt;!-- Exclude unit tests from the final JAR file --&gt;<br>
&lt;jar jarfile="${build.lib}/oreilly.jar"<br>
basedir="${build.classes}"<br>
excludes="**/*Test.class"/&gt;<br>
&lt;/target&gt;<br>
&lt;target name="all" depends="clean,jar"<br>
description="Cleans, compiles, then builds the JAR file."/&gt;<br>
&lt;/project&gt;<img src ="http://www.blogjava.net/justinlei/aggbug/19865.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/justinlei/" target="_blank">JustinLei</a> 2005-11-15 14:12 <a href="http://www.blogjava.net/justinlei/articles/19865.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>