﻿<?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-SexTian-文章分类-java特性</title><link>http://www.blogjava.net/chenkkkabc/category/39934.html</link><description>java学习</description><language>zh-cn</language><lastBuildDate>Tue, 23 Jun 2009 10:50:40 GMT</lastBuildDate><pubDate>Tue, 23 Jun 2009 10:50:40 GMT</pubDate><ttl>60</ttl><item><title>面向对象的特征</title><link>http://www.blogjava.net/chenkkkabc/articles/object_oriented_feature.html</link><dc:creator>chenkkkabc</dc:creator><author>chenkkkabc</author><pubDate>Thu, 18 Jun 2009 14:16:00 GMT</pubDate><guid>http://www.blogjava.net/chenkkkabc/articles/object_oriented_feature.html</guid><wfw:comment>http://www.blogjava.net/chenkkkabc/comments/283121.html</wfw:comment><comments>http://www.blogjava.net/chenkkkabc/articles/object_oriented_feature.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenkkkabc/comments/commentRss/283121.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenkkkabc/services/trackbacks/283121.html</trackback:ping><description><![CDATA[1. 抽象<br />
<br />
2. 封装<br />
<br />
3. 继承<br />
<br />
4. 多态
 <img src ="http://www.blogjava.net/chenkkkabc/aggbug/283121.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenkkkabc/" target="_blank">chenkkkabc</a> 2009-06-18 22:16 <a href="http://www.blogjava.net/chenkkkabc/articles/object_oriented_feature.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>内存管理</title><link>http://www.blogjava.net/chenkkkabc/articles/memory_management.html</link><dc:creator>chenkkkabc</dc:creator><author>chenkkkabc</author><pubDate>Wed, 17 Jun 2009 04:48:00 GMT</pubDate><guid>http://www.blogjava.net/chenkkkabc/articles/memory_management.html</guid><wfw:comment>http://www.blogjava.net/chenkkkabc/comments/282828.html</wfw:comment><comments>http://www.blogjava.net/chenkkkabc/articles/memory_management.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenkkkabc/comments/commentRss/282828.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenkkkabc/services/trackbacks/282828.html</trackback:ping><description><![CDATA[1.Java内存管理方式<br />
Java语言的一个优点就是通过垃圾收集器GC自动管理内存的回收，程序员不需要手动释放内存。内存管理实质上就是对内存的分配和释放问题，在Java中，程序员通过new关键字为每个对象申请内存空间（基本类型除外），所有对象都在堆中分配空间；对象的释放是由GC决定和执行的。GC为了能够准确及时的释放对象，需要监控每个对象的运行状态，包括对象的申请、引用、被引用、赋值等。一个对象被释放的根本原则就是这个对象不再被引用。<br />
2.GC的原理<br />
把对象想象成有向图的节点，引用关系想象成图的有向边，有向边从引用者指向被引用对象。大部分程序以mian线程开始，可以把其想象作main线程顶点开始的一棵树。根节点可达的对象都是有效对象，GC不可回收；而与根节点不可达关系的对象则被认为不被引用，可以通过GC回收。相对计数器模型，有向图模型可以很容易的发现变量循环引用的问题。<br />
3.内存泄露<br />
Java虽然在语言级支持垃圾回收，但是Java程序同样存在内存泄露，无用对象占用的空间不能及时释放，就造成了这段局部时间事实上的内存泄露。要及时释放内存，最好是在用完对象之后立即执行&#8220;object=null;&#8221;语句。<br />
4.对象引用类型<br />
有没有让System.gc()立即收效的办法呢？答案在Java提供的4种对象引用类型上：<br />
a. 强引用<br />
强引用是使用最普遍的引用。如果一个对象具有强引用，那垃圾回收器绝不会回收它。当内存空间不足，Java虚拟机宁愿抛出OutOfMemoryError错误，使程序异常终止，也不会靠随意回收具有强引用的对象来解决内存不足的问题。<br />
b. 软引用<br />
如果一个对象只具有软引用，则内存空间足够，垃圾回收器就不会回收它；如果内存空间不足了，就会回收这些对象的内存。只要垃圾回收器没有回收它，该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存（下文给出示例）。<br />
软引用可以和一个引用队列（ReferenceQueue）联合使用，如果软引用所引用的对象被垃圾回收器回收，Java虚拟机就会把这个软引用加入到与之关联的引用队列中。<br />
c. 弱引用<br />
弱引用与软引用的区别在于：只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中，一旦发现了只具有弱引用的对象，不管当前内存空间足够与否，都会回收它的内存。不过，由于垃圾回收器是一个优先级很低的线程，因此不一定会很快发现那些只具有弱引用的对象。<br />
弱引用可以和一个引用队列（ReferenceQueue）联合使用，如果弱引用所引用的对象被垃圾回收，Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。<br />
d. 虚引用 <br />
&#8220;虚引用&#8221;顾名思义，就是形同虚设，与其他几种引用都不同，虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用，那么它就和没有任何引用一样，在任何时候都可能被垃圾回收器回收。<br />
虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于：虚引用必须和引用队列 （ReferenceQueue）联合使用。当垃圾回收器准备回收一个对象时，如果发现它还有虚引用，就会在回收对象的内存之前，把这个虚引用加入到与之关联的引用队列中。<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/chenkkkabc/aggbug/282828.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenkkkabc/" target="_blank">chenkkkabc</a> 2009-06-17 12:48 <a href="http://www.blogjava.net/chenkkkabc/articles/memory_management.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>枚举</title><link>http://www.blogjava.net/chenkkkabc/articles/enum.html</link><dc:creator>chenkkkabc</dc:creator><author>chenkkkabc</author><pubDate>Tue, 16 Jun 2009 01:01:00 GMT</pubDate><guid>http://www.blogjava.net/chenkkkabc/articles/enum.html</guid><wfw:comment>http://www.blogjava.net/chenkkkabc/comments/282507.html</wfw:comment><comments>http://www.blogjava.net/chenkkkabc/articles/enum.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenkkkabc/comments/commentRss/282507.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenkkkabc/services/trackbacks/282507.html</trackback:ping><description><![CDATA[ <img src ="http://www.blogjava.net/chenkkkabc/aggbug/282507.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenkkkabc/" target="_blank">chenkkkabc</a> 2009-06-16 09:01 <a href="http://www.blogjava.net/chenkkkabc/articles/enum.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>脚本引擎</title><link>http://www.blogjava.net/chenkkkabc/articles/script_engine.html</link><dc:creator>chenkkkabc</dc:creator><author>chenkkkabc</author><pubDate>Mon, 15 Jun 2009 13:48:00 GMT</pubDate><guid>http://www.blogjava.net/chenkkkabc/articles/script_engine.html</guid><wfw:comment>http://www.blogjava.net/chenkkkabc/comments/282462.html</wfw:comment><comments>http://www.blogjava.net/chenkkkabc/articles/script_engine.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenkkkabc/comments/commentRss/282462.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenkkkabc/services/trackbacks/282462.html</trackback:ping><description><![CDATA[1.Java脚本API的好处<br />
Java能够对脚本语言提供支持，原理上是通过将脚本语言编译成字节码来实现的。脚本API在Java应用程序和外部脚本间提供了双向可见性。这样脚本语言也能享用Java平台的诸多优势如可移植性、安全性等；并且执行效率比解释执行高出许多。Java本身也可以间接获得动态灵活性、扩展性等。<br />
<br />
2.Java脚本API的使用步骤<br />
Java里自带支持JavaScript。要在Java里使用脚本语言非常非常的简单，只需以下三步：<br />
a. 创建一个ScriptEngineManager对象<br />
b. 通过ScriptEngineManager对象创建ScriptEngine对象<br />
c. 用ScriptEngine对象的eval()方法执行脚本 
 <img src ="http://www.blogjava.net/chenkkkabc/aggbug/282462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenkkkabc/" target="_blank">chenkkkabc</a> 2009-06-15 21:48 <a href="http://www.blogjava.net/chenkkkabc/articles/script_engine.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Annotation</title><link>http://www.blogjava.net/chenkkkabc/articles/annotation.html</link><dc:creator>chenkkkabc</dc:creator><author>chenkkkabc</author><pubDate>Sun, 14 Jun 2009 05:18:00 GMT</pubDate><guid>http://www.blogjava.net/chenkkkabc/articles/annotation.html</guid><wfw:comment>http://www.blogjava.net/chenkkkabc/comments/282145.html</wfw:comment><comments>http://www.blogjava.net/chenkkkabc/articles/annotation.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenkkkabc/comments/commentRss/282145.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenkkkabc/services/trackbacks/282145.html</trackback:ping><description><![CDATA[Java注释——采用metadata机制，对某点程序代码作解释说明，将程序的元素如：类，方法，属性，参数，本地变量，包和元数据联系起来。这样编译器可以将元数据存储在class文件中。这样虚拟机和其它对象可以根据这些元数据来决定如何使用这些程序元素或改变它们的行为。<br />
<br />
事先定义好的三种annotation类型，都位于java.lang包里：<br />
1 Override 用来指示一个方法，它覆盖了它的基类的方法<br />
2 Deprecated 指出某一个方法或是元素类型的使用时被阻止的<br />
3 SupressWarnings 会关掉class、method、field与variable初始化的编译器警告<br />
<br />
我们可以创建自定义的annotation类型，很类似于声明一个接口：<br />
public @interface TODO {<br />
&nbsp;&nbsp;&nbsp; String value();<br />
}<br />
编译器自动使用相同名称创建了一个成员变量value，使用时可以这么写：<br />
@TODO(value="Finish homework")<br />
<br />
Java提供了四种基本的meta-annotation如下，都位于java.lang.annotation包里：<br />
1 Target 指定哪个程序单元可以有其所定义的annotation<br />
参数类型是ElementType[]，其中ElementType定义为如下枚举<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">enum</span><span style="color: #000000">&nbsp;ElementType&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;TYPE,&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Class,&nbsp;interface,&nbsp;or&nbsp;enum&nbsp;(but&nbsp;not&nbsp;annotation)</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;FIELD,&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Field&nbsp;(including&nbsp;enumerated&nbsp;values)</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;METHOD,&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Method&nbsp;(does&nbsp;not&nbsp;include&nbsp;constructors)</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;PARAMETER,&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Method&nbsp;parameter</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CONSTRUCTOR,&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Constructor</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LOCAL_VARIABLE,&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Local&nbsp;variable&nbsp;or&nbsp;catch&nbsp;clause</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ANNOTATION_TYPE,&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Annotation&nbsp;Types&nbsp;(meta-annotations)</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;PACKAGE&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Java&nbsp;package</span><span style="color: #008000"><br />
</span><span style="color: #000000">}</span></div>
<p>不使用时所有程序单元都适用<br />
2 Retention 指出是否编译器要丢掉一个annotation，或者是否将一个annotation保存在class文件里<br />
参数是RetentionPolicy类型，定义如下</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">enum</span><span style="color: #000000">&nbsp;RetentionPolicy&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;SOURCE,&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Annotation&nbsp;is&nbsp;discarded&nbsp;by&nbsp;the&nbsp;compiler</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CLASS,&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Annotation&nbsp;is&nbsp;stored&nbsp;in&nbsp;the&nbsp;class&nbsp;file,&nbsp;but&nbsp;ignored&nbsp;by&nbsp;the&nbsp;VM</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;RUNTIME&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Annotation&nbsp;is&nbsp;stored&nbsp;in&nbsp;the&nbsp;class&nbsp;file&nbsp;and&nbsp;read&nbsp;by&nbsp;the&nbsp;VM</span><span style="color: #008000"><br />
</span><span style="color: #000000">}</span></div>
<p>3 Documented 指出被定义的annotation应该被视为所注释的程序单元的公开API之一<br />
4 Inherited 被应用于目标为class的annotation类型上，指出此被注释的类型是能够通过继承得到的<br />
<br />
最后，来谈一下annotation的反射。java.lang.reflect包里的AnnotatedElement接口可以直接拿来访问被annotated的方法，具体的还是看例子吧~<br />
</p>
 <img src ="http://www.blogjava.net/chenkkkabc/aggbug/282145.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenkkkabc/" target="_blank">chenkkkabc</a> 2009-06-14 13:18 <a href="http://www.blogjava.net/chenkkkabc/articles/annotation.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>事件处理机制</title><link>http://www.blogjava.net/chenkkkabc/articles/event_handling_mechanism.html</link><dc:creator>chenkkkabc</dc:creator><author>chenkkkabc</author><pubDate>Sat, 13 Jun 2009 06:22:00 GMT</pubDate><guid>http://www.blogjava.net/chenkkkabc/articles/event_handling_mechanism.html</guid><wfw:comment>http://www.blogjava.net/chenkkkabc/comments/282154.html</wfw:comment><comments>http://www.blogjava.net/chenkkkabc/articles/event_handling_mechanism.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenkkkabc/comments/commentRss/282154.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenkkkabc/services/trackbacks/282154.html</trackback:ping><description><![CDATA[   <img src ="http://www.blogjava.net/chenkkkabc/aggbug/282154.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenkkkabc/" target="_blank">chenkkkabc</a> 2009-06-13 14:22 <a href="http://www.blogjava.net/chenkkkabc/articles/event_handling_mechanism.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Derby</title><link>http://www.blogjava.net/chenkkkabc/articles/282155.html</link><dc:creator>chenkkkabc</dc:creator><author>chenkkkabc</author><pubDate>Fri, 12 Jun 2009 06:23:00 GMT</pubDate><guid>http://www.blogjava.net/chenkkkabc/articles/282155.html</guid><wfw:comment>http://www.blogjava.net/chenkkkabc/comments/282155.html</wfw:comment><comments>http://www.blogjava.net/chenkkkabc/articles/282155.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenkkkabc/comments/commentRss/282155.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenkkkabc/services/trackbacks/282155.html</trackback:ping><description><![CDATA[  <img src ="http://www.blogjava.net/chenkkkabc/aggbug/282155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenkkkabc/" target="_blank">chenkkkabc</a> 2009-06-12 14:23 <a href="http://www.blogjava.net/chenkkkabc/articles/282155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDBC</title><link>http://www.blogjava.net/chenkkkabc/articles/jdbc.html</link><dc:creator>chenkkkabc</dc:creator><author>chenkkkabc</author><pubDate>Tue, 09 Jun 2009 07:28:00 GMT</pubDate><guid>http://www.blogjava.net/chenkkkabc/articles/jdbc.html</guid><wfw:comment>http://www.blogjava.net/chenkkkabc/comments/280942.html</wfw:comment><comments>http://www.blogjava.net/chenkkkabc/articles/jdbc.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenkkkabc/comments/commentRss/280942.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenkkkabc/services/trackbacks/280942.html</trackback:ping><description><![CDATA[JDBC：Java Database Connectivity，Java数据库连接，可以方便的访问数据库接口。<br />
JDBC驱动程序有四种类型：<br />
1JDBC-ODBC桥，通过ODBC数据源连接<br />
2通过网络库连接的纯Java驱动<br />
3通过中间件服务器<br />
4直接与数据库相连的纯Java驱动，厂商提供<br />
<br />
JDBC包括java.sql和javax.sql两个包。数据库应用开发的基本步骤如下：<br />
1.建立数据源，安装相应数据库<br />
2.装载驱动程序，Class.forName("~~~")<br />
3.建立连接，DriverManager.getConnection()<br />
4.建立语句对象，createStatement()<br />
5.书写具体的SQL，executeQuery("")、executeUpdate("")<br />
6.数据处理，next()、getString<br />
7.获取元数据，getMetaData()<br />
8.关闭对象，close()，应该按照ResultSet - Statement - Connection的顺序关闭<br />
9.异常处理与警告<br />
<br />
本文采用JDBC-ODBC桥的方式连接Access数据库，将数据库文件test.mdb放到C:\Users\chen\workspace\JavaTest目录下，账户名Administrator，密码abc。数据库包括两张表，格式如下：<br />
<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/chenkkkabc/table1.jpg" width="491" height="144" /><br />
<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/chenkkkabc/table2.jpg" width="395" height="139" /><br />
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;装入驱动程序</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class.forName(</span><span style="color: #000000">"</span><span style="color: #000000">sun.jdbc.odbc.JdbcOdbcDriver</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;设置登陆超时时间</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DriverManager.setLoginTimeout(</span><span style="color: #000000">5</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;url&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">jdbc:odbc:driver={MicroSoft&nbsp;Access&nbsp;Driver&nbsp;(*.mdb)};DBQ=C:\\Users\\chen\\workspace\\JavaTest\\test.mdb</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;建立一条连接</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;DriverManager.getConnection(url,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Administrator</span><span style="color: #000000">"</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">abc</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;设置打开数据库的用户名和密码</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;s&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;conn.createStatement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s.executeQuery(</span><span style="color: #000000">"</span><span style="color: #000000">SELECT&nbsp;*&nbsp;FROM&nbsp;Store_Information</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSetMetaData&nbsp;metadata&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rs.getMetaData();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;count&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;metadata.getColumnCount();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(</span><span style="color: #000000">"</span><span style="color: #000000">columns:</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;count;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;metadata.getColumnName(i));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">\nstore_name&nbsp;in&nbsp;Store_Information:</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(rs.next())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(rs.getString(</span><span style="color: #000000">"</span><span style="color: #000000">store_name</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PreparedStatement&nbsp;ps&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;conn<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.prepareStatement(</span><span style="color: #000000">"</span><span style="color: #000000">SELECT&nbsp;*&nbsp;FROM&nbsp;Geography</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ps.executeQuery();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">store_name&nbsp;in&nbsp;Geography:</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(rs.next())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(rs.getString(</span><span style="color: #000000">"</span><span style="color: #000000">store_name</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ps.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.close();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(ClassNotFoundException&nbsp;e1)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(e1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(SQLException&nbsp;e2)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(e2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
实验结果<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 29.27%; padding-right: 5px; height: 175px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">columns:&nbsp;id&nbsp;store_name&nbsp;sales&nbsp;dates<br />
store_name&nbsp;in&nbsp;Store_Information:<br />
Los&nbsp;Angeles<br />
San&nbsp;Diego<br />
Los&nbsp;Angeles<br />
Boston<br />
store_name&nbsp;in&nbsp;Geography:<br />
Boston<br />
New&nbsp;York<br />
Los&nbsp;Angeles<br />
San&nbsp;Diego</span></div>
<br />
<a href="http://www.blogjava.net/Files/chenkkkabc/day090609.7z">源代码下载 </a>
 <img src ="http://www.blogjava.net/chenkkkabc/aggbug/280942.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenkkkabc/" target="_blank">chenkkkabc</a> 2009-06-09 15:28 <a href="http://www.blogjava.net/chenkkkabc/articles/jdbc.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式</title><link>http://www.blogjava.net/chenkkkabc/articles/regular_expression.html</link><dc:creator>chenkkkabc</dc:creator><author>chenkkkabc</author><pubDate>Mon, 08 Jun 2009 14:56:00 GMT</pubDate><guid>http://www.blogjava.net/chenkkkabc/articles/regular_expression.html</guid><wfw:comment>http://www.blogjava.net/chenkkkabc/comments/280769.html</wfw:comment><comments>http://www.blogjava.net/chenkkkabc/articles/regular_expression.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenkkkabc/comments/commentRss/280769.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenkkkabc/services/trackbacks/280769.html</trackback:ping><description><![CDATA[首先推荐一个入门教程：<a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm">http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm</a><br />
下面简要罗列一些关键内容：<br />
0.正则表达式<br />
记录文本规则的代码<br />
作用：A数据有效性验证 B查找、替换<br />
1.元字符<br />
<table cellspacing="0">
    <thead>
        <tr>
            <th scope="col">代码</th>
            <th scope="col">说明</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><span class="code">.</span></td>
            <td><span class="desc">匹配除换行符以外的任意字符</span></td>
        </tr>
        <tr>
            <td><span class="code">\w</span></td>
            <td><span class="desc">匹配字母或数字或下划线或汉字</span></td>
        </tr>
        <tr>
            <td><span class="code">\s</span></td>
            <td><span class="desc">匹配任意的空白符</span></td>
        </tr>
        <tr>
            <td><span class="code">\d</span></td>
            <td><span class="desc">匹配数字</span></td>
        </tr>
        <tr>
            <td><span class="code">\b</span></td>
            <td><span class="desc">匹配单词的开始或结束</span></td>
        </tr>
        <tr>
            <td><span class="code">^</span></td>
            <td><span class="desc">匹配字符串的开始</span></td>
        </tr>
        <tr>
            <td><span class="code">$</span></td>
            <td><span class="desc">匹配字符串的结束</span></td>
        </tr>
    </tbody>
</table>
2.字符转义<br />
\\、\.、\*<br />
3.重复<br />
<table cellspacing="0">
    <thead>
        <tr>
            <th scope="col">代码/语法</th>
            <th scope="col">说明</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><span class="code">*</span></td>
            <td><span class="desc">重复零次或更多次</span></td>
        </tr>
        <tr>
            <td><span class="code">+</span></td>
            <td><span class="desc">重复一次或更多次</span></td>
        </tr>
        <tr>
            <td><span class="code">?</span></td>
            <td><span class="desc">重复零次或一次</span></td>
        </tr>
        <tr>
            <td><span class="code">{n}</span></td>
            <td><span class="desc">重复n次</span></td>
        </tr>
        <tr>
            <td><span class="code">{n,}</span></td>
            <td><span class="desc">重复n次或更多次</span></td>
        </tr>
        <tr>
            <td><span class="code">{n,m}</span></td>
            <td><span class="desc">重复n到m次</span></td>
        </tr>
    </tbody>
</table>
4.字符类<br />
[aeiou]、[.?!]<br />
5.分枝条件<br />
a|b，自左向右测试，满足条件停止<br />
6.分组<br />
()，又叫子表达式<br />
7.反义<br />
<table cellspacing="0">
    <thead>
        <tr>
            <th scope="col">代码/语法</th>
            <th scope="col">说明</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><span class="code">\W</span></td>
            <td><span class="desc">匹配任意不是字母，数字，下划线，汉字的字符</span></td>
        </tr>
        <tr>
            <td><span class="code">\S</span></td>
            <td><span class="desc">匹配任意不是空白符的字符</span></td>
        </tr>
        <tr>
            <td><span class="code">\D</span></td>
            <td><span class="desc">匹配任意非数字的字符</span></td>
        </tr>
        <tr>
            <td><span class="code">\B</span></td>
            <td><span class="desc">匹配不是单词开头或结束的位置</span></td>
        </tr>
        <tr>
            <td><span class="code">[^x]</span></td>
            <td><span class="desc">匹配除了x以外的任意字符</span></td>
        </tr>
        <tr>
            <td><span class="code">[^aeiou]</span></td>
            <td><span class="desc">匹配除了aeiou这几个字母以外的任意字符</span></td>
        </tr>
    </tbody>
</table>
8.后向引用<br />
分组拥有组号，按照左括号出现顺序排列<br />
用于重复搜索前面某个分组匹配的文本，\1代表分组1匹配的文本<br />
9.零宽断言/负向零宽断言<br />
(?=exp)也叫零宽度正预测先行断言，它断言自身出现的位置的后面能匹配表达式exp<br />
(?&lt;=exp)也叫零宽度正回顾后发断言，它断言自身出现的位置的前面能匹配表达式exp<br />
(?!exp)也叫零宽度负预测先行断言，它断言自身出现的位置的后面不能匹配表达式exp<br />
(?&lt;!exp)也叫零宽度负回顾后发断言，它断言自身出现的位置的前面不能匹配表达式exp<br />
10.注释<br />
<span class="code">(?#comment)</span><br />
<table cellspacing="0">
    <tbody>
        <tr>
            <th scope="col">分类</th>
            <th scope="col">代码/语法</th>
            <th scope="col">说明</th>
        </tr>
        <tr>
            <th rowspan="3">捕获</th>
            <td><span class="code">(exp)</span></td>
            <td><span class="desc">匹配exp,并捕获文本到自动命名的组里</span></td>
        </tr>
        <tr>
            <td><span class="code">(?&lt;name&gt;exp)</span></td>
            <td><span class="desc">匹配exp,并捕获文本到名称为name的组里，也可以写成(?'name'exp)</span></td>
        </tr>
        <tr>
            <td><span class="code">(?:exp)</span></td>
            <td><span class="desc">匹配exp,不捕获匹配的文本，也不给此分组分配组号</span></td>
        </tr>
        <tr>
            <th rowspan="4">零宽断言</th>
            <td><span class="code">(?=exp)</span></td>
            <td><span class="desc">匹配exp前面的位置</span></td>
        </tr>
        <tr>
            <td><span class="code">(?&lt;=exp)</span></td>
            <td><span class="desc">匹配exp后面的位置</span></td>
        </tr>
        <tr>
            <td><span class="code">(?!exp)</span></td>
            <td><span class="desc">匹配后面跟的不是exp的位置</span></td>
        </tr>
        <tr>
            <td><span class="code">(?&lt;!exp)</span></td>
            <td><span class="desc">匹配前面不是exp的位置</span></td>
        </tr>
        <tr>
            <th>注释</th>
            <td><span class="code">(?#comment)</span></td>
            <td><span class="desc">这种类型的分组不对正则表达式的处理产生任何影响，用于提供注释让人阅读</span></td>
        </tr>
    </tbody>
</table>
11.贪婪与懒惰<br />
默认贪婪，加?变懒惰<br />
<table cellspacing="0">
    <thead>
        <tr>
            <th scope="col">代码/语法</th>
            <th scope="col">说明</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><span class="code">*?</span></td>
            <td><span class="desc">重复任意次，但尽可能少重复</span></td>
        </tr>
        <tr>
            <td><span class="code">+?</span></td>
            <td><span class="desc">重复1次或更多次，但尽可能少重复</span></td>
        </tr>
        <tr>
            <td><span class="code">??</span></td>
            <td><span class="desc">重复0次或1次，但尽可能少重复</span></td>
        </tr>
        <tr>
            <td><span class="code">{n,m}?</span></td>
            <td><span class="desc">重复n到m次，但尽可能少重复</span></td>
        </tr>
        <tr>
            <td><span class="code">{n,}?</span></td>
            <td><span class="desc">重复n次以上，但尽可能少重复</span></td>
        </tr>
    </tbody>
</table>
最先开始的匹配拥有最高的优先权，比贪婪/懒惰要高<br />
12.平衡组/递归匹配<br />
(?'group') 把捕获的内容命名为group,并压入堆栈(Stack) <br />
(?'-group') 从堆栈上弹出最后压入堆栈的名为group的捕获内容，如果堆栈本来为空，则本分组的匹配失败 <br />
(?(group)yes|no) 如果堆栈上存在以名为group的捕获内容的话，继续匹配yes部分的表达式，否则继续匹配no部分 <br />
(?!) 零宽负向先行断言，由于没有后缀表达式，试图匹配总是失败 <br />
13.处理选项<br />
<table cellspacing="0">
    <thead>
        <tr>
            <th scope="col">名称</th>
            <th scope="col">说明</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>IgnoreCase(忽略大小写)</td>
            <td>匹配时不区分大小写。</td>
        </tr>
        <tr>
            <td>Multiline(多行模式)</td>
            <td>更改<span class="code">^</span>和<span class="code">$</span>的含义，使它们分别在任意一行的行首和行尾匹配，而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,<span class="code">$</span>的精确含意是:匹配\n之前的位置以及字符串结束前的位置.) </td>
        </tr>
        <tr>
            <td>Singleline(单行模式)</td>
            <td>更改<span class="code">.</span>的含义，使它与每一个字符匹配（包括换行符\n）。 </td>
        </tr>
        <tr>
            <td>IgnorePatternWhitespace(忽略空白)</td>
            <td>忽略表达式中的非转义空白并启用由<span class="code">#</span>标记的注释。</td>
        </tr>
        <tr>
            <td>ExplicitCapture(显式捕获)</td>
            <td>仅捕获已被显式命名的组。</td>
        </tr>
    </tbody>
</table>
14.其他问题<br />
<table cellspacing="0">
    <thead>
        <tr>
            <th scope="col">代码/语法</th>
            <th scope="col">说明</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><span class="code">\a</span></td>
            <td><span class="desc">报警字符(打印它的效果是电脑嘀一声)</span></td>
        </tr>
        <tr>
            <td><span class="code">\b</span></td>
            <td><span class="desc">通常是单词分界位置，但如果在字符类里使用代表退格</span></td>
        </tr>
        <tr>
            <td><span class="code">\t</span></td>
            <td><span class="desc">制表符，Tab</span></td>
        </tr>
        <tr>
            <td><span class="code">\r</span></td>
            <td><span class="desc">回车</span></td>
        </tr>
        <tr>
            <td><span class="code">\v</span></td>
            <td><span class="desc">竖向制表符</span></td>
        </tr>
        <tr>
            <td><span class="code">\f</span></td>
            <td><span class="desc">换页符</span></td>
        </tr>
        <tr>
            <td><span class="code">\n</span></td>
            <td><span class="desc">换行符</span></td>
        </tr>
        <tr>
            <td><span class="code">\e</span></td>
            <td><span class="desc">Escape</span></td>
        </tr>
        <tr>
            <td><span class="code">\0nn</span></td>
            <td><span class="desc">ASCII代码中八进制代码为nn的字符</span></td>
        </tr>
        <tr>
            <td><span class="code">\xnn</span></td>
            <td><span class="desc">ASCII代码中十六进制代码为nn的字符</span></td>
        </tr>
        <tr>
            <td><span class="code">\unnnn</span></td>
            <td><span class="desc">Unicode代码中十六进制代码为nnnn的字符</span></td>
        </tr>
        <tr>
            <td><span class="code">\cN</span></td>
            <td><span class="desc">ASCII控制字符。比如\cC代表Ctrl+C</span></td>
        </tr>
        <tr>
            <td><span class="code">\A</span></td>
            <td><span class="desc">字符串开头(类似^，但不受处理多行选项的影响)</span></td>
        </tr>
        <tr>
            <td><span class="code">\Z</span></td>
            <td><span class="desc">字符串结尾或行尾(不受处理多行选项的影响)</span></td>
        </tr>
        <tr>
            <td><span class="code">\z</span></td>
            <td><span class="desc">字符串结尾(类似$，但不受处理多行选项的影响)</span></td>
        </tr>
        <tr>
            <td><span class="code">\G</span></td>
            <td><span class="desc">当前搜索的开头</span></td>
        </tr>
        <tr>
            <td><span class="code">\p{name}</span></td>
            <td><span class="desc">Unicode中命名为name的字符类，例如\p{IsGreek}</span></td>
        </tr>
        <tr>
            <td><span class="code">(?&gt;exp)</span></td>
            <td><span class="desc">贪婪子表达式</span></td>
        </tr>
        <tr>
            <td><span class="code">(?&lt;x&gt;-&lt;y&gt;exp)</span></td>
            <td><span class="desc">平衡组</span></td>
        </tr>
        <tr>
            <td><span class="code">(?im-nsx:exp)</span></td>
            <td><span class="desc">在子表达式exp中改变处理选项</span></td>
        </tr>
        <tr>
            <td><span class="code">(?im-nsx)</span></td>
            <td><span class="desc">为表达式后面的部分改变处理选项</span></td>
        </tr>
        <tr>
            <td><span class="code">(?(exp)yes|no)</span></td>
            <td><span class="desc">把exp当作零宽正向先行断言，如果在这个位置能匹配，使用yes作为此组的表达式；否则使用no</span></td>
        </tr>
        <tr>
            <td><span class="code">(?(exp)yes)</span></td>
            <td><span class="desc">同上，只是使用空表达式作为no</span></td>
        </tr>
        <tr>
            <td><span class="code">(?(name)yes|no)</span></td>
            <td><span class="desc">如果命名为name的组捕获到了内容，使用yes作为表达式；否则使用no</span></td>
        </tr>
        <tr>
            <td><span class="code">(?(name)yes)</span></td>
            <td><span class="desc">同上，只是使用空表达式作为no</span></td>
        </tr>
    </tbody>
</table>
<br />
介绍完了正则表达式，下面看看如何在Java语言中使用。java.util.regex包提供了对正则表达式的支持。<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;RegularExpressionTest&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;IP&nbsp;address&nbsp;test</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pattern&nbsp;pattern&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Pattern<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.compile(</span><span style="color: #000000">"</span><span style="color: #000000">((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Matcher&nbsp;matcher&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pattern.matcher(</span><span style="color: #000000">"</span><span style="color: #000000">192.168.018.1</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(matcher.matches());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Split&nbsp;strings</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pattern&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Pattern.compile(</span><span style="color: #000000">"</span><span style="color: #000000">/+</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;results&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pattern.split(</span><span style="color: #000000">"</span><span style="color: #000000">Test1/Test2//Test3///Test4</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(String&nbsp;str&nbsp;:&nbsp;results)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
<a href="http://www.blogjava.net/Files/chenkkkabc/day090608.7z">源代码</a> 
  <img src ="http://www.blogjava.net/chenkkkabc/aggbug/280769.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenkkkabc/" target="_blank">chenkkkabc</a> 2009-06-08 22:56 <a href="http://www.blogjava.net/chenkkkabc/articles/regular_expression.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Varargs</title><link>http://www.blogjava.net/chenkkkabc/articles/vararg.html</link><dc:creator>chenkkkabc</dc:creator><author>chenkkkabc</author><pubDate>Tue, 02 Jun 2009 08:19:00 GMT</pubDate><guid>http://www.blogjava.net/chenkkkabc/articles/vararg.html</guid><wfw:comment>http://www.blogjava.net/chenkkkabc/comments/279635.html</wfw:comment><comments>http://www.blogjava.net/chenkkkabc/articles/vararg.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenkkkabc/comments/commentRss/279635.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenkkkabc/services/trackbacks/279635.html</trackback:ping><description><![CDATA[Java Varargs可以方便方法的重载，允许你指定可以采用多个同类型参数的方法，而不需要事先确定参数的数目，由此实现可变参数。Varargs形式如同 TYPE...name，只能位于参数列表的最后，name可以看做一个TYPE数组，可以包括TYPE及其子类型，通过for/in可以方便的访问每个参数。参数传递的方式可以是单个的元素，也可以是数组，但不能是元素和数组的混合形式。<br />
<br />
本文采用Java可变参数实现了一个求最大值的函数，代码如下<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;求最大值</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;max(</span><span style="color: #0000ff">int</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;values)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IllegalArgumentException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;无参时抛出异常</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(values.length&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;IllegalArgumentException(</span><span style="color: #000000">"</span><span style="color: #000000">Argument&nbsp;number&nbsp;can't&nbsp;be&nbsp;zero</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;max&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Integer.MIN_VALUE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;:&nbsp;values)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(max&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;max;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
测试方法main<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(max(</span><span style="color: #000000">3</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">7</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(max(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">[]&nbsp;{&nbsp;</span><span style="color: #000000">9</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">&nbsp;}));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;以下无法通过编译，不能为混合形式<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;System.out.println(max(new&nbsp;int[]&nbsp;{&nbsp;1,&nbsp;7,&nbsp;4&nbsp;},&nbsp;3));</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(max(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Integer(</span><span style="color: #000000">1</span><span style="color: #000000">),&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Integer(</span><span style="color: #000000">5</span><span style="color: #000000">)));&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;自动拆箱</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(max(</span><span style="color: #000000">7</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Integer(</span><span style="color: #000000">3</span><span style="color: #000000">)));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Integer[]&nbsp;is&nbsp;=&nbsp;{3,4,5,6};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;以下无法通过编译，不能自动转换Integer[]到int[]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;System.out.println(max(is));</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(max());&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;此时有IllegalArgumentException抛出</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(IllegalArgumentException&nbsp;iae)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(iae);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
运行结果<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">7</span><span style="color: #000000"><br />
</span><span style="color: #000000">9</span><span style="color: #000000"><br />
</span><span style="color: #000000">5</span><span style="color: #000000"><br />
</span><span style="color: #000000">7</span><span style="color: #000000"><br />
java.lang.IllegalArgumentException:&nbsp;Argument&nbsp;number&nbsp;can't&nbsp;be&nbsp;zero</span></div>
<br />
可以从<a href="http://www.blogjava.net/Files/chenkkkabc/day090602.7z">此处下载</a>源代码 <br />
<br />
有些时候，我们可能要避免自动化的将Object...转化成Object[]，比如说我们要将一个Object[]类型的对象objectArray作为Object传进带Object...参数的方法，为了避免objectArray被拆散为许多单个的object，我们必须要这么写：<br />
new Object[] {objectArray}，或者强转(Object)objectArray。
 <img src ="http://www.blogjava.net/chenkkkabc/aggbug/279635.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenkkkabc/" target="_blank">chenkkkabc</a> 2009-06-02 16:19 <a href="http://www.blogjava.net/chenkkkabc/articles/vararg.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>访问控制修饰符</title><link>http://www.blogjava.net/chenkkkabc/articles/access_specifier.html</link><dc:creator>chenkkkabc</dc:creator><author>chenkkkabc</author><pubDate>Sun, 31 May 2009 14:20:00 GMT</pubDate><guid>http://www.blogjava.net/chenkkkabc/articles/access_specifier.html</guid><wfw:comment>http://www.blogjava.net/chenkkkabc/comments/279295.html</wfw:comment><comments>http://www.blogjava.net/chenkkkabc/articles/access_specifier.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenkkkabc/comments/commentRss/279295.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenkkkabc/services/trackbacks/279295.html</trackback:ping><description><![CDATA[封装将数据和处理数据的方法连接起来，同时，封装也提供另一个重要属性：访问控制。通过访问控制可以防止对象滥用，保证数据的完整性。<br />
以下是修饰范围表。<br />
<table border="1" cellspacing="2" cellpadding="2" width="500">
    <tbody>
        <tr>
            <td></td>
            <td>
            <p align="center">public</p>
            </td>
            <td>
            <p align="center">protected</p>
            </td>
            <td>
            <p align="center">默认(friendly)</p>
            </td>
            <td>
            <p align="center">private</p>
            </td>
        </tr>
        <tr>
            <td>类（非内部类）</td>
            <td>
            <p align="center">&#8730;</p>
            </td>
            <td>
            <p align="center">X</p>
            </td>
            <td>
            <p align="center">&#8730;</p>
            </td>
            <td>
            <p align="center">X</p>
            </td>
        </tr>
        <tr>
            <td>成员变量</td>
            <td>
            <p align="center">&#8730;</p>
            </td>
            <td>
            <p align="center">&#8730;</p>
            </td>
            <td>
            <p align="center">&#8730;</p>
            </td>
            <td>
            <p align="center">&#8730;</p>
            </td>
        </tr>
        <tr>
            <td>方法</td>
            <td>
            <p align="center">&#8730;</p>
            </td>
            <td>
            <p align="center">&#8730;</p>
            </td>
            <td>
            <p align="center">&#8730;</p>
            </td>
            <td>
            <p align="center">&#8730;</p>
            </td>
        </tr>
    </tbody>
</table>
<br />
public：所有类可以访问，接口访问权限<br />
protected：包内所有类以及其子类可以访问，继承访问权限<br />
default：包内所有类可以访问<br />
private：类外任何类不可访问<br />
  <img src ="http://www.blogjava.net/chenkkkabc/aggbug/279295.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenkkkabc/" target="_blank">chenkkkabc</a> 2009-05-31 22:20 <a href="http://www.blogjava.net/chenkkkabc/articles/access_specifier.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>嵌套类</title><link>http://www.blogjava.net/chenkkkabc/articles/nested_class.html</link><dc:creator>chenkkkabc</dc:creator><author>chenkkkabc</author><pubDate>Thu, 21 May 2009 09:45:00 GMT</pubDate><guid>http://www.blogjava.net/chenkkkabc/articles/nested_class.html</guid><wfw:comment>http://www.blogjava.net/chenkkkabc/comments/271873.html</wfw:comment><comments>http://www.blogjava.net/chenkkkabc/articles/nested_class.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenkkkabc/comments/commentRss/271873.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenkkkabc/services/trackbacks/271873.html</trackback:ping><description><![CDATA[<p>1 嵌套类定义<br />
在一个类的内部定义另一个类，这种类称为嵌套类。<br />
<br />
2&nbsp;嵌套类的分类<br />
嵌套类根据加不加static修饰符可分为两类：静态嵌套类和非静态嵌套类，后者又叫内部类，可再细分成三类。<br />
顶级类 top-level classes<br />
a.嵌套顶级类 nested top-level classes<br />
b.成员内部类 instance inner classes<br />
c.本地内部类 local inner classes<br />
d.匿名内部类 anonymous inner classes<br />
<br />
3&nbsp;嵌套类的好处<br />
a.令源代码更清晰。<br />
b.减少命名冲突。<br />
c.控制框架：一个&#8220;应用程序框架&#8221;是指一个或一系列类，它们专门设计用来解决特定类型的问题。为应用该框架，我们可从一个或多个类继承，并覆盖其中的部分方法。我们在覆盖方法中编写的代码用于定制由那些框架提供的常规方案，以解决实际问题。&#8220;控制框架&#8221;属于应用程序框架的一种特殊类型，受到对事件响应的需要的支配；主要用来响应事件的一个系统叫作&#8220;事件驱动的系统&#8221;。内部类可以在单独一个类里表达一个控制框架应用的全部实施细节，从而完整地封装与那个实施有关的所有东西。内部类用于表达多种不同类型的action()，以便解决实际的问题。除此以外，若使用了private内部类，实施细节会完全隐藏起来，可以安全地修改。因为能方便地访问外部类的任何成员，内部类使我们具体的实施变得更加巧妙。<br />
<br />
4 嵌套类的共性<br />
a.嵌套类是独立的类，编译后会生成相应.class文件，但之前有顶级类的类名和$。<br />
b.嵌套类是顶级类的一部分，可以自由的访问顶级类的成员，不论是否为private的，同理，顶级类也可以访问嵌套类的private成员。<br />
c.嵌套类的成员及方法可以与顶级类重名，在类内会被覆盖。<br />
d.嵌套类也可继承和被继承，但要注意作用域规则。<br />
<br />
5 嵌套顶级类<br />
从技术上讲，嵌套顶级类不属于内部类。因为内部类和外部类共享一种实例关系，而嵌套顶级类只是位于一个类的内部，并没有以上共享关系。<br />
静态的含义是，为创建一个嵌套顶级的对象，我们不需要一个顶级类对象。不能从嵌套顶级类的一个对象中访问一个顶级类对象。<br />
与静态方法相似，嵌套顶级类只能访问顶级类的static（静态）成员及方法。</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TLC1&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String&nbsp;s1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">tlc1:static&nbsp;string</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">tlc1:non-static&nbsp;string</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;嵌套顶级类</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;NTLC&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;ns1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">ntlc:string</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String&nbsp;ns2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">ntlc:static&nbsp;string</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(s1);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;可访问private<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;!&nbsp;System.out.println(s2);&nbsp;不能访问顶级类的非static成员</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;NTLC().ns1);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;可访问private</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(NTLC.ns2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<p>main里的验证代码：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TLC1.NTLC&nbsp;ntlc1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TLC1.NTLC();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TLC1.NTLC&nbsp;ntlc2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TLC1.NTLC();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(ntlc1&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;ntlc2);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;返回false</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ntlc1.f();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TLC1().f();</span></div>
<p>运行结果：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 8.7%; padding-right: 5px; height: 70px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">false<br />
tlc1:static&nbsp;string<br />
ntlc:string<br />
ntlc:static&nbsp;string</span></div>
<p>&nbsp;<br />
6 成员内部类<br />
成员内部类内不允许有任何静态声明，能够访问成员内部类的唯一方式就是通过顶级类（外部类）对象。<br />
a.从外部类的非静态方法访问<br />
实质上是通过外部类的this引用实现的。<br />
b.从外部类的静态方法访问<br />
由于静态方法没有this引用，必须先创建一个外部类对象，然后调用.new创建成员内部类对象进行访问。<br />
c.从其他类访问<br />
先创建外部类对象，再调用.new创建成员内部类对象。<br />
d.从内部类中访问外部类对象<br />
可以使用Outer.this来访问。</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TLC2&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;s&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">tlc2:string</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;成员内部类</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;IIC&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;String&nbsp;is1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">iic:static&nbsp;final&nbsp;string</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;!&nbsp;static&nbsp;String&nbsp;is2&nbsp;=&nbsp;"iic:static&nbsp;string";&nbsp;static必须同时是final的</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;is3&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">iic:string</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f1()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(TLC2.</span><span style="color: #0000ff">this</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;访问外部类对象</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;!&nbsp;static&nbsp;void&nbsp;f2(){}&nbsp;不能声明静态函数</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f1(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;IIC().f1();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f2(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TLC2&nbsp;tlc2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TLC2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tlc2.</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;IIC().f1();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<p>main代码：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TLC2&nbsp;tlc2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TLC2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tlc2.f1();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tlc2.f2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TLC2.IIC&nbsp;iic&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tlc2.</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;IIC();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iic.f1();</span></div>
<p>结果：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 13.88%; padding-right: 5px; height: 100px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">tlc2:string<br />
day090521.TLC2@1bab50a<br />
tlc2:string<br />
day090521.TLC2@c3c749<br />
tlc2:string<br />
day090521.TLC2@1bab50a</span></div>
<p>对于普通的类，可用的修饰符有final、abstract、strictfp、public和默认的包访问。<br />
但是成员内部类更像一个成员变量和方法，可用的修饰符有：final、abstract、public、protected、private、默认、strictfp和static。<br />
一旦用static修饰，它就变成静态嵌套类了囧。<br />
<br />
7 本地内部类<br />
本地内部类定义在方法中，类似于本地变量（局部变量）。所以可以用于修饰本地内部类的只有final和abstract。<br />
本地内部类只能在定义该内部类的方法或块内实例化，不可以在外部对其实例化。<br />
本地内部类对象不能使用该内部类所在方法的非final局部变量。因为方法的局部变量位于栈上，只存在于该方法的生命期内。当一个方法结束，其栈结构被删除，局部变量成为历史。但是该方法结束之后，在方法内创建的内部类对象可能仍然存在于堆中！如果对它的引用被传递到其他某些代码，并存储在一个成员变量内。正因为不能保证局部变量的存活期和方法内部类对象的一样长，所以内部类对象不能使用它们。<br />
静态方法是没有this引用的，因此在静态方法内的内部类遭受同样的待遇，即只能访问外部类的静态成员。</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TLC3&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;s&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">tlc3:string</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f(</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;b)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">tlc3:f:string</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;String&nbsp;s2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">tlc3:f:final&nbsp;string</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(b)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;本地内部类</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;LIC1&nbsp;{&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;块内可见</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;ls;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LIC1(String&nbsp;str)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.ls&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;str;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;!&nbsp;System.out.println(s1);&nbsp;只能使用final类型的外部对象</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(s2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(ls);<br />
&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;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;!&nbsp;new&nbsp;LIC();&nbsp;只能有一个构造函数</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;LIC1(</span><span style="color: #000000">"</span><span style="color: #000000">lic1:string</span><span style="color: #000000">"</span><span style="color: #000000">).ls);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;LIC2&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;LIC1&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LIC2()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">(</span><span style="color: #000000">"</span><span style="color: #000000">lic2:string</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.f();<br />
&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;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;LIC2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;!&nbsp;class&nbsp;LIC3&nbsp;extends&nbsp;LIC2{}&nbsp;final类不可继承</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;LIC1&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;!&nbsp;new&nbsp;LIC2();&nbsp;超出作用域</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<p>main代码：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TLC3().f(</span><span style="color: #0000ff">true</span><span style="color: #000000">);</span></div>
<p>结果：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 8.64%; padding-right: 5px; height: 70px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">lic1:string<br />
tlc3:string<br />
tlc3:f:final&nbsp;string<br />
lic2:string</span></div>
上面的代码会生成TLC3$1LIC1.class和TLC3$2LIC1.class，可看出命名规则：外部类名+$+数字编号+内部类名，以防内部类重名。<br />
<p><br />
8 匿名内部类<br />
a.用于实现一个接口<br />
b.用于扩展拥有非默认构造函数的一个类<br />
c.用于执行字段初始化<br />
d.通过实例初始化进行构建（匿名内部类不可拥有构造函数）</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TLC4&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;匿名内部类</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Contents&nbsp;f1()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Contents()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;get()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">tlc4:f1:anonymous:string</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f2(AC&nbsp;ac)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ac.f1();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ac.f2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;AC&nbsp;f3(</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;AC(i)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;初始化</span><span style="color: #008000"><br />
</span><span style="color: #000000">&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;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(i&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">i==1&nbsp;is&nbsp;true</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f1()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">tlc4:f3:anonymous:f1</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
</span><span style="color: #0000ff">abstract</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;AC&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;AC(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.setI(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">abstract</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f1();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f2()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">AC:f2</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setI(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getI()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;Contents&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;get();<br />
}</span></div>
<p>main代码：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TLC4&nbsp;tlc4&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TLC4();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(tlc4.f1().get());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tlc4.f2(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;AC(</span><span style="color: #000000">3</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f1()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">anonymous:f1&nbsp;i:</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.getI());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tlc4.f3(</span><span style="color: #000000">1</span><span style="color: #000000">);</span></div>
<p>执行结果：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 12.62%; padding-right: 5px; height: 70px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">tlc4:f1:anonymous:string<br />
anonymous:f1&nbsp;i:</span><span style="color: #000000">3</span><span style="color: #000000"><br />
AC:f2<br />
i</span><span style="color: #000000">==</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;is&nbsp;true</span></div>
<p><br />
9 链接到外部类<br />
创建自己的内部类时，那个类的对象同时拥有指向封装对象（这些对象封装或生成了内部类）的一个链接。内部类的一个对象只能与封装类的一个对象联合创建。<br />
<br />
10 小结<br />
java嵌套类内容很多，很纷杂。要记清其种类以及每种相应的规则，做到胸有成竹。本文完整源代码<a href="http://www.blogjava.net/Files/chenkkkabc/day090521.7z">下载</a>。</p>
   <img src ="http://www.blogjava.net/chenkkkabc/aggbug/271873.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenkkkabc/" target="_blank">chenkkkabc</a> 2009-05-21 17:45 <a href="http://www.blogjava.net/chenkkkabc/articles/nested_class.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>