<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>微笑</title>
    <description>享受学习，享受床上生活。
</description>
    <link>http://loving.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>内部类的一些知识</title>
        <author>sunnylovewindy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://loving.javaeye.com">sunnylovewindy</a>&nbsp;
          链接：<a href="http://loving.javaeye.com/blog/190775" style="color:red;">http://loving.javaeye.com/blog/190775</a>&nbsp;
          发表时间: 2008年05月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          小弟最近学习内部类总结了下面一些内容，参考了一些资料，不足之处请指出，谢谢！<br />成员内部类：<br />相当于类的非静态成员，可以用权限修饰符来修饰，包括private、protected、public.<br />1、定义成员内部类<br />class Outter {<br />	//非静态内部类<br />	class Inner {<br />		//内部类成员<br />		int i = 12;<br />	}<br />	//外部类的普通成员<br />	int j = 0;<br />}<br />2、外部类之内创建成员内部类对象<br />语法和普通的创建对象相同，用new操作符调用相应的构造方法即可。注意的是，非静态内部类属于外部类的非静态成员，不能在静态上下文使用。<br />例子：<br />class Outter {<br />	//非静态内部类<br />	class Inner {<br />		//内部类成员<br />		int i = 12;<br />		public void innerTest() {<br />			System.out.println(“Inner Class Method”);<br />		}<br />	}<br />	//外部类的普通成员<br />	int j = 0;<br />	public void test() {<br />		Inner inner = new Inner();<br />		inner.innerTest();<br />	}<br />}<br />3、外部类之外创建成员内部类对象<br />既然是外部类的非静态成员，就必须在外部类对象存在的情况下使用。<br />基本语法是<br />&lt;外部类类名>.&lt;内部类类名> 引用变量名称 = &lt;外部类对象的引用>.new &lt;内部类构造器>;<br />&lt;外部类类名>.&lt;内部类类名> 引用变量名称 = new &lt;外部类构造器>.new &lt;内部类构造器>;<br />(1)、创建内部类对象时对象引用必须是&lt;外部类类名>.&lt;内部类类名><br />(2)、调用内部类的构造方法不能直接用new 而是要用&lt;外部类对象的引用>.new调用<br />例子：<br />class Outter {<br />	//非静态内部类<br />	class Inner {<br />		//内部类成员<br />		int i = 12;<br />		public void innerTest() {<br />			System.out.println(“Inner Class Method”);<br />		}<br />	}<br />	//外部类的普通成员<br />	int j = 0;<br />}<br />class MainTest {<br />	public static void main(String[] args) {<br />		Outter outter = new Outter();<br />		Outter.Inner inner = outter.new Inner();<br />		inner.innerTest();<br />	}<br />}<br />在外部类之外访问内部类时需要注意权限修饰符的限制，这点和类成员一样。<br />3、内部类编译后生成的.class文件名称格式是&lt;外部类类名>$&lt;内部类类名>。<br /><br />4、内部类与外部类之间的成员互相访问<br />内部类可以访问外部类的任何成员，包括private成员。<br />外部类访问内部类的成员需要创建内部类的对象，之后可以访问内部类的任何成员，包括private成员，需要注意的是成员内部类不可以有静态成员。<br />当外部类的成员和内部类的成员重名时单单用this是区分不了的。在内部类中访问外部类的成员时可以用如下语法区分<br />&lt;外部类类名>.this.&lt;外部类中需要被访问的成员名>;<br /><br />局部内部类<br />内部类定义在方法中成为局部内部类，只在局部有效。该类只为所在的方法块服务。<br />局部内部类和成员内部类一样可以访问外围类的所有成员，但是不可以访问同在一个局部块的普通局部变量。如果要访问，此局部变量要被声明称final的。<br />代码块结束后普通的局部变量会消亡，而创建的局部内部类对象并不会随着语句块的结束而消亡。final的局部变量的存储方式和普通的局部变量不同，其不会因为语句块的结束而消失，还会长期存在，因此可以被局部内部类访问。<br />例子：<br />public class InnerClassTest1 {<br />	public static void main(String[] args) {<br />		Outter outter = new Outter();<br />		ForInner forInner = outter.getInner();<br />		forInner.sayHello();<br />		<br />	}<br />}<br />class Outter {<br />	ForInner forInner;<br />	public ForInner getInner() {<br />		class Inner implements ForInner {<br />			public void sayHello() {<br />				System.out.println("你好，我是局部内部类对象，我还存在！");<br />			}<br />		}<br />		forInner = new Inner();<br />		return forInner;<br />		<br />	}	<br />}<br />interface ForInner {<br />	void sayHello();<br />}<br />由于局部内部类只在局部有效，所以不能在外面用局部内部类的引用指向局部内部类的对象，只能用局部内部类实现接口并创建局部内部类对象，在外面用接口引用指向局部内部类对象。<br />静态方法中的局部内部类只能访问外围类的静态成员，访问不了非静态成员。<br />局部内部类生成的.class文件名称是&lt;外部类类名>$&lt;n>&lt;内部类类名>其中n是该局部的第几个内部类<br /><br />静态内部类<br />静态内部类的定义<br />class Outter {<br />	static class Inner {<br />	/****/<br />	}<br />}<br />由于静态内部类是外部类的静态成员，所以静态内部类只能访问外部类的静态成员。并且创建静态内部类的对象不依赖外部类的对象。在外部类之外创建静态内部类对象的语法如下<br />&lt;外部类类名>.&lt;内部类类名> 引用变量名 = new &lt;外部类类名>.&lt;内部类构造器>;<br />例子：<br />class Outter {<br />	static class Inner {<br />		public void sayHello() {<br />			System.out.println(“成功创建静态内部类对象！”);<br />		}<br />	}<br />	public void getInner() {<br />		//在外部类中创建静态内部类的对象<br />		Inner ii = new Inner();<br />		ii.sayHello();<br />	}<br />}<br />public class MainTest {<br />	public static void main(String[] args) {<br />		//在外部类外创建静态内部类的对象<br />		Outter.Inner i = new Outter.Inner();<br />		i.sayHello();<br />		//在外部类中使用静态内部类的对象<br />		new Outter().getInner();<br />	}<br />}<br />静态内部类实际上已经脱离了外部类的控制，创建对象时也不再需要外部类对象的存在，实质上只是一个放置在别的类中的普通类而已。<br /><br />匿名内部类<br />基于继承的匿名内部类，语法如下：<br />new &lt;匿名内部类要继承父类的对应构造器> {<br />	//匿名内部类类体<br />};<br />基于实现接口的匿名内部类，语法如下：<br />new &lt;接口名> {<br />	//匿名内部类类体，实现接口中的所有方法<br />}<br />匿名内部类中使用外面的变量要被声明成final的。<br />匿名内部类对象初始化的代码可以写在其非静态块中<br />匿名内部类生成的.class文件是&lt;外部类类名>$&lt;n>.class n是该类的第几个匿名内部类。<br /><br />各种内部类可用的修饰符<br />成员内部类<br />final、abstract、public、private、protected、static <br />静态内部类<br />final、abstract、public、private、protected<br />局部内部类<br />final、abstract<br />匿名内部类<br />不能对匿名内部类使用修饰符<br /><br />内部接口<br />定义在类中的内部接口无论是否被static修饰都是静态成员。<br />内部接口声明成private的意味着只能被外部类中的某个内部类来实现。<br />内部接口不能扮演局部的角色，否则编译报错。因为接口的设计初衷是对外公布，让很多类实现，而局部的角色违背了接口的设计初衷。<br />接口中的内部接口属于接口的成员，具有接口成员的所有属性，不能用private进行修饰。<br />外部接口外实现内部接口的语法如下：<br />class &lt;类名> implements &lt;外部接口名>.&lt;内部接口名> {<br />	//类体<br />}
          <br/>
          <span style="color:red;">
            <a href="http://loving.javaeye.com/blog/190775#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 07 May 2008 23:35:52 +0800</pubDate>
        <link>http://loving.javaeye.com/blog/190775</link>
        <guid>http://loving.javaeye.com/blog/190775</guid>
      </item>
      <item>
        <title>List的一些知识</title>
        <author>sunnylovewindy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://loving.javaeye.com">sunnylovewindy</a>&nbsp;
          链接：<a href="http://loving.javaeye.com/blog/188188" style="color:red;">http://loving.javaeye.com/blog/188188</a>&nbsp;
          发表时间: 2008年04月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Collection继承了Iterable接口，此接口只有一个方法Iterator.实现这个接口允许对象成为“foreach”语句的目标。<br />Collection中定义了一些集合中需要用到的基本方法，AbstractCollection提供了Collection的骨干实现。<br />List实现Collection接口<br />AbstractList是一个抽象类，实现了List接口，继承了AbstractCollection类<br />AbstractList类有三个子类：AbstractSequentialList，ArrayList，Vector<br />ArrayList还实现了List，Cloneable等几个接口<br />LinkedList继承自AbstractSequentialList类，实现了List，Cloneable，Queue等几个接口<br />ArrayList是List接口的可变数组的实现和Vector类一样，其区别在于Vector支持线程同步，ArrayList不是同步的，你可以用两个线程同时访问一个Vector对象，当一个线程访问Vector时代码将会在同步操作上浪费相当多的时间，所以在不需要同步时使用ArrayList效率会更高。<br />由于ArrayList是使用循环数组实现的队列，所以按索引检索速度非常快，但在数组中间插入或删除元素效率就不高了。ArrayList多用于多获取少插入的应用。<br />API：<br />void enSureCapacity(int minCapacity)<br />设置该集合的初始容量。如果列表大小超过了该容量容器会自动增加。<br />protected void removeRange(int fromIndex, int toIndex)<br />移除列表中索引在fromIndex(包括)和toIndex(不包括)之间的所有元素，但此方法是protected的<br />E set(int index, E element)<br />用指定的元素替代此列表中指定位置上的元素。<br />Object[] toArray()<br />返回一个按照正确的顺序包含此列表中所有元素的数组。<br />&lt;T>T[] toArray(T[] a)<br />返回数组的运行时类型就是指定数组的运行时类型<br />void trimToSize()<br />将此ArrayList实力的容量调整为列表的当前大小。<br />List的iterator和listIterator方法返回的迭代器是快速失败的。<br />操作需要给lise附加一个或多个Iterator,他们会维护一个独立的计数值，记录着自身修改list的次数，<br />如果发现计数值和该list被修改的次数不同就会抛出ConcurrentModificationException<br />example:<br />List&lt;String> list = new ArrayList&lt;String>();<br />list.add("a");<br />list.add("b");<br />Iterator iterator = list.iterator();<br />此时给list附加了一个遍历器<br />并且之后对list进行构造上的改变(增加或删除元素，修改不算在内)<br />list.remove("a");<br />应用iterator<br />*iterator.next();<br />这是就会抛出ConcurrentModificationException<br />需要注意的是：通过Arrays.asList(T...t)返回的集合不可以进行结构上的修改(增加或删除)这样会导致发生UnsupportedOperationException<br />如：<br />List list = Arrays.asList(“a”,”b”,”c”,”d”);<br />list.add(“e”);或者list.remove(“a”);<br />这样会抛出上述异常，调用list.set(1,”f”);将正常通过，只有改变集合结构才会抛出。<br />可以用下述方法进行改善，避免异常的抛出：<br />List list = Arrays.asList(“a”,”b”,”c”,”d”);<br />List list1 = new ArrayList(list);<br />list1.add(“e”);或者list.remove(“a”);<br />就可以正常通过。<br />这只是本人使用过程中得出的结果，具体原因没有查明。<br />LinkedList<br />是list接口的链接列表实现。链表由节点组成，java中每一个节点含有三个引用，一个是其中元素的引用，一个是前一个节点的引用，一个是后一个节点的引用，链表的第一个是头部迭代器工作时指向的都是两个节点中的间隙，返回的对象都是其包含的最近的节点中元素的引用。链表结构的特点是向其中插入或删除元素非常方便，只需要把链打开插入或删除元素即可，但检索效率非常低，每一次检索一个元素都要重新从链表的头部进行检索，所以LinkedList多用于进行中间插入删除等操作而很少进行检索的应用中。<br />API：<br />void addFirst(E o)<br />将指定的元素插入此列表的开头。<br />void addLast(E o)<br />将指定的元素追加此列表的结尾，与add的区别只在于返回值类型不同<br />E getFirst()<br />返回此列表的第一个元素<br />E getLast() <br />返回此列表的最后一个元素<br />E removeFirst()<br />移除并返回此列表的第一个元素<br />E removeLast()<br />移除并返回此列表的最后一个元素<br />E element()<br />找到但不移除此列表的第一个元素，如果找不到则抛出NoSuchElementException<br />E peek()<br />找到但不移除此列表的第一个元素，如果找不到则返回null.<br />E remove()<br />找到并移除此列表的第一个元素，如果找不到则抛出NoSuchElementException<br />E poll()<br />找到并移除此列表的第一个元素，如果找不到则返回null<br />boolean offer(E o)<br />将指定的元素添加到此列表的末尾。
          <br/>
          <span style="color:red;">
            <a href="http://loving.javaeye.com/blog/188188#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 29 Apr 2008 22:02:07 +0800</pubDate>
        <link>http://loving.javaeye.com/blog/188188</link>
        <guid>http://loving.javaeye.com/blog/188188</guid>
      </item>
      <item>
        <title>死磕Struts源码.(ActionServlet的初始化一)</title>
        <author>sunnylovewindy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://loving.javaeye.com">sunnylovewindy</a>&nbsp;
          链接：<a href="http://loving.javaeye.com/blog/164433" style="color:red;">http://loving.javaeye.com/blog/164433</a>&nbsp;
          发表时间: 2008年02月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          小弟最近研究了部分Struts源码，只把初始化部分看了几遍来和大家分享，理解有误之出请大家多多指出，谢谢！<br /><br />ActioinServlet的初始化 <br /><br />每个web工程的核心配置文件是web.xml，在每次启动服务器的时候（如：Tomcat）都会自动加载web.xml，会自动运行里面配置的ActionServlet。（不了解的朋友可以看下Servlet的工作原理） <br /><br />&lt;servlet> <br /><br />    &lt;servlet-name>action&lt;/servlet-name> <br /><br />    &lt;servlet-class>org.apache.struts.action.ActionServlet&lt;/servlet-class> <br /><br />&lt;/servlet> <br /><br />ActionServlet就是一个正常的Servlet初始化一样是通过init方法（可参考Servlet的初始化） <br /><br />在ActionServlet的init方法中按顺序调用了几个方法，分别初始化了不同的信息。 <br /><br />1、initInternal() <br /><br />这里用到了几个类 <br /><br />抽象类MessageResources，MessageResourcesFactory <br /><br />普通类PropertyMessageResources,PropertyMessageResourcesFactory <br /><br />  <br /><br /> 这个方法的作用是：初始化Struts内部资源包。就是初始化Struts自身需要的资源文件。 <br /><br /> 这个资源文件的全路径是org.apache.struts.action.ActionResources.properties <br /><br /> initInternal方法中通过MessageResources.getMessageResources(internalName)获得一个 <br /><br /> MessageResources对象，其中的参数internalName是资源文件ActionResources.properties的全路径 <br /><br /> 那么，getMessageResources方法的内部是如何实现的呢？它的内部首先获得一个MessageResources <br /><br /> 的工厂MessageResourcesFactory的实例defaultFactory，这是通过 MessageResourcesFactory.createFactory()实现的之后用defaultFactory.createResources(config)返回一个MessageResources实例，这里的config就是前面的internalName.这个方法实际上是一个抽象方法，等待继承他的类去实现。当然这个工厂也可以自己定义。 <br /><br />这是createFactory方法的源码用到java的反射机制获取工厂的实例 <br /><br />public static MessageResourcesFactory createFactory() { <br /><br />    try { <br /><br />        if (clazz == null){ <br /><br />            clazz = RequestUtils.applicationClass(factoryClass); <br /><br />            MessageResourcesFactory factory = (MessageResourcesFactory) clazz.newInstance(); <br /><br />            return (factory); <br /><br />        } catch (Throwable t) { <br /><br />           log.error("MessageResourcesFactory.createFactory", t); <br /><br />           return (null); <br /><br />         } <br /><br />} <br /><br />  <br /><br />前面提到的类还有两个没有说，PropertyMessageResourcesFactory类继承了MessageResourcesFactory重写了createResources方法返回PropertyMessageResources实例。 <br /><br />而PropertyMessageResources继承了MessageResources类 这是非常好的封装过程。 <br /><br />  <br /><br />2、initOther()初始化servlet的其他全局特性 <br /><br />这个方法从web.xml中获得'config'参数和'converNull'参数的值，我没见到有'converNull'属性，网上说现在已经变成debug这地方我还没弄明白。 <br /><br />&lt;init-param> <br /><br />&lt;param-name>config&lt;/param-name> <br /><br />&lt;param-value>/WEB-INF/struts-config.xml&lt;/param-value> <br /><br />&lt;/init-param> <br /><br />&lt;init-param> <br /><br />&lt;param-name>debug&lt;/param-name> <br /><br />&lt;param-value>3&lt;/param-value> <br /><br />&lt;/init-param> <br /><br />白初始化了一个ConvertUtils对象，ConvertUtils对象的使用我也没弄明白。 <br /><br />  <br /><br />3、initServlet()在ActionServlet被访问之内初始化servletMapping <br /><br />利用Digester类取得文件标识解读web.xml,对servletMapping进行初始化。这里的Digester类是common包中的，没有弄明白如何使用和其作用。 <br /><br />  <br /><br />4、initChain()初始化chainConfig.‘chainConfig’是在web.xml中配置的init-param参数 <br /><br />  <br /><br />先说这些，初始化中还有一个关键的ModuleConfig初始化非常重要，下次再说。
          <br/>
          <span style="color:red;">
            <a href="http://loving.javaeye.com/blog/164433#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 23 Feb 2008 15:03:17 +0800</pubDate>
        <link>http://loving.javaeye.com/blog/164433</link>
        <guid>http://loving.javaeye.com/blog/164433</guid>
      </item>
  </channel>
</rss>