﻿<?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-我的一亩三分地-文章分类-Java基础</title><link>http://www.blogjava.net/baogenfly/category/15604.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 23:17:55 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 23:17:55 GMT</pubDate><ttl>60</ttl><item><title>[转载] JNI初步</title><link>http://www.blogjava.net/baogenfly/articles/88712.html</link><dc:creator>王某某</dc:creator><author>王某某</author><pubDate>Tue, 19 Dec 2006 02:49:00 GMT</pubDate><guid>http://www.blogjava.net/baogenfly/articles/88712.html</guid><wfw:comment>http://www.blogjava.net/baogenfly/comments/88712.html</wfw:comment><comments>http://www.blogjava.net/baogenfly/articles/88712.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baogenfly/comments/commentRss/88712.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baogenfly/services/trackbacks/88712.html</trackback:ping><description><![CDATA[
		<font size="2">http://tb.blog.csdn.net/TrackBack.aspx?PostId=910492<br /><br /><p>一、去年曾经做过一个JAVA和C通信的项目，用C语言实现某个特定功能函数，然后在JAVA中调用。最近又有朋友问起，于是将做过的东西整理成学习笔记，希望对后来者有所帮助，呵呵。</p><p>二、jni例子简介</p><p>jni-java native interface是java与其他语言本地通信的接口，按照jni的约定，java程序可以调用其他语言编写的函数，其他语言也可以调用java实现的方法，本文介绍了一个最简单的java调用c方法的例子。主要由两部分组成，</p><p>一个是java主程序，另一个是被调用的dll（由C语言实现）</p><p>三、编写步骤</p><p>1、java主程序</p><p>//文件testdll.java</p><p>public class testdll <br />{ <br />        static <br />        { <br />               System.loadLibrary("goodluck");     //goodluck为调用的库名,不必加dll后缀<br />        }  </p><p>        /*下面两个函数为C语言实现的方法*/<br />        public native static int get(); <br />        public native static void set(int i); </p><p>       //主函数<br />        public static void main(String[] args) <br />        { <br />                testdll test = new testdll(); <br />                test.set(10);                                         //调用了在C中实现的方法set<br />                System.out.println(test.get());          //调用了在C中实现的方法get<br />                System.out.println("hello world!\n"); <br />        } <br />} </p><p>2、得到C所需的头文件</p><p> 执行如下命令（假设jdk的安装路径为D:\Java\jdk1.5.0\bin）</p><p>    D:\Java\jdk1.5.0\bin\javac   testdll.java                                         #生成testdll.class文件</p><p>   D:\Java\jdk1.5.0\bin\javah   testdll                                                  #根据testdll.class生成testdll.h文件</p><p> </p><p>3、用c语言生成所需的dll</p><p>(1) 打开vc6, 建立一个空的dll项目。</p><p>       菜单里选"File"-&gt;New-&gt;Projects-&gt;Win32  dynamic link library,项目名为gookluck（与java文件中的调用库名保持一致），第二步里选an empty DLL project.</p><p>(2)把前面生成的testdll.h复制到这个项目中，再新添下面的testdll.cpp文件</p><p>#include "testdll.h" </p><p>int i = 0; <br />JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass) <br />{ <br />        return i; <br />} </p><p>JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j) <br />{ <br />         i = j; <br />} </p><p>此时编译会报错，因为还缺少几个头文件，因此要把下面两个文件复制到项目目录中或者vc的头文件目录 (即Microsoft Visual Studio\VC98\Include)中,jni.h文件和jni_md.h文件，在我机器这两个文件原始目录为</p><p>D:\Java\jdk1.5.0\include\jni.h</p><p>D:\Java\jdk1.5.0\include\win32\jni_md.h</p><p>再次编译，运行通过</p><p>4、测试运行</p><p>    将3中得到的testdll.dll文件拷贝到testdll.class所在目录下，执行</p><p>    D:\Java\jdk1.5.0\bin\java testdll</p><p>    运行结果为</p><p>    10<br />    hello world!</p><p>   说明调用正确。<br /><br /></p><p>五、几个注意事项</p><p>1、System.loadLibrary("goodluck"); 一句，有时在别的情况下会报错，主要原因是程序找不到这个库文件所在的路径，此时可以检查path环境变量是否包含了合适的路径，或者把dll文件拷贝到系统的dll目录下，如C:\WINNT\system32下</p><p>2、库文件不必写后缀名，写了反而可能错，因为这时程序会去找testdll.dll.dll文件，自然是不存在了：—)</p><p>3、要调用的方法做本地声明，关键字为native。并且只需要声明，而不需要具体实现。如： <br />      public native static void set(int i); <br />      public native static int get(); </p><p>4、函数返回类型尽量用jni中的基本类型（如整型、字符等），最好不要返回自定义的类，那样在c里有可能会引起错误。</p><p>5、在c中写具体实现的时候，我们只关心两个函数原型 <br /><br />JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass); <br /><br /><br />JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint); <br /><br />这里JNIEXPORT都是JNI的关键字，表示此函数是要被java调用的，如果是其他语言调java语言，JNIEXPORT就要变成JNIIMPORT了。</p><p>JNICALL告诉C编译器参数进栈的方式，我们不必关心.</p><p>jint是以JNI为中介使JAVA的int类型与本地c语言的int沟通的一种类型，我们就当做int使用。其他类型名可以去查jni帮助文档.</p><p>函数的名称是JAVA_再加上java程序的package路径再加函数名组成的。</p><p>参数中，我们也只需要关心在JAVA程序中存在的参数，即第三个往后的参数。至于JNIEnv*和jclass我们一般没有必要去碰它。</p><p>知道这些约定后，我们没有javah程序也可以自己手工写出testdll.h文件来，不过麻烦些就是了^O^</p><p>六、jni的其他参考资料</p><p>jni属于java语言的一部分，其权威资料自然要到sun的站点上查找(<a href="http://www.sun.com/">www.sun.com</a>)</p><p>以下是我在sun公司网站上找到的一些页面</p><p><a href="http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jniexamp.html">http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jniexamp.html</a></p><p>给出了一个jni的例子，</p><p><a href="http://java.sun.com/j2se/1.4.2/docs/guide/jni/index.html">http://java.sun.com/j2se/1.4.2/docs/guide/jni/index.html</a></p><p>给出了完整的jni介绍，</p><p>另外，linux下jni的例子可以参见<a href="http://www.linuxmine.com/5629.html">http://www.linuxmine.com/5629.html</a></p><p>七、附javah生成的testdll.h文件。</p><p>/* DO NOT EDIT THIS FILE - it is machine generated */<br />#include "jni.h"<br />/* Header for class testdll */</p><p>#ifndef _Included_testdll<br />#define _Included_testdll<br />#ifdef __cplusplus<br />extern "C" {<br />#endif</p><p>/*<br /> * Class:     testdll<br /> * Method:    get<br /> * Signature: ()I<br /> */<br />JNIEXPORT jint JNICALL Java_testdll_get<br />  (JNIEnv *, jclass);</p><p>/*<br /> * Class:     testdll<br /> * Method:    set<br /> * Signature: (I)V<br /> */<br />JNIEXPORT void JNICALL Java_testdll_set<br />  (JNIEnv *, jclass, jint);</p><p>#ifdef __cplusplus<br />}<br />#endif<br />#endif</p></font>
<img src ="http://www.blogjava.net/baogenfly/aggbug/88712.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baogenfly/" target="_blank">王某某</a> 2006-12-19 10:49 <a href="http://www.blogjava.net/baogenfly/articles/88712.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于hashCode方法</title><link>http://www.blogjava.net/baogenfly/articles/85859.html</link><dc:creator>王某某</dc:creator><author>王某某</author><pubDate>Wed, 06 Dec 2006 07:28:00 GMT</pubDate><guid>http://www.blogjava.net/baogenfly/articles/85859.html</guid><wfw:comment>http://www.blogjava.net/baogenfly/comments/85859.html</wfw:comment><comments>http://www.blogjava.net/baogenfly/articles/85859.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baogenfly/comments/commentRss/85859.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baogenfly/services/trackbacks/85859.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">在java.lang.Object的规范中，对hasCode有如下的约定：<br /> 1 在一个应用程序执行期间，如果一个对象的equals方法做比较所用到的信息没有被修改的话，那么对该对象调用多次hashCode方法，它必须返回相同的整数。在同一程序的多次执行过程中，这个整数方法可以不同。<br />2 如果两个对象根据equals方法是相等的，那么调用这两个对象的hashCode方法必须产生同样的整数结果。<br />3 如果两个对象根据equals方法是不相等的，那么调用这两个对象的hashCode方法，不要求产生不同的整数结果。</font>
		</p>
<img src ="http://www.blogjava.net/baogenfly/aggbug/85859.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baogenfly/" target="_blank">王某某</a> 2006-12-06 15:28 <a href="http://www.blogjava.net/baogenfly/articles/85859.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于对象相等</title><link>http://www.blogjava.net/baogenfly/articles/85849.html</link><dc:creator>王某某</dc:creator><author>王某某</author><pubDate>Wed, 06 Dec 2006 07:15:00 GMT</pubDate><guid>http://www.blogjava.net/baogenfly/articles/85849.html</guid><wfw:comment>http://www.blogjava.net/baogenfly/comments/85849.html</wfw:comment><comments>http://www.blogjava.net/baogenfly/articles/85849.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baogenfly/comments/commentRss/85849.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baogenfly/services/trackbacks/85849.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">下面是李sir发给我的</font>
				<br />Integer j1 = 127;<br />Integer j2 = 127;<br />System.out.println( j1==j2); //True</p>
		<p>Integer k1 = 128;<br />Integer k2 = 128;<br />System.out.println( k1==k2); //False</p>
		<p>Integer w1 = -128;<br />Integer w2 = -128;<br />System.out.println( w1==w2); //True</p>
		<p>Integer m1 = -129;<br />Integer m2 = -129;<br />System.out.println( m1==m2); //False <br /><br />I've seen a lot of posts in this thread about what is happening on ==</p>
		<p>It's simple:</p>
		<p>When we do<br />        Integer i = 127;<br />autoboxing turns this into:<br />        Integer i = Integer.valueOf( 127 );</p>
		<p>Go look at the implementation of Integer.valueOf(), and you'll find:<br />    public static Integer valueOf(int i) {<br />final int offset = 128;<br />if (i &gt;= -128 &amp;&amp; i &lt;= 127) { // must cache<br />return IntegerCache.cache[i + offset];<br />}<br />        return new Integer(i);<br />    }</p>
		<p>If the int value is between -128 and 127, it will return a cached Integer value. This way we avoid creating many duplicate Integer objects for those common values. It save's on memory and improves performance.</p>
		<p>And, of course, it does mean that Integer i = 127 will always return the same Integer instance.  <br /><br /><font size="2">再联想到以前讨论的String问题，<br />                String a = new String("Hello World");<br />                String b = "Hello World";<br />                String c ="Hello World";<br />这里创建了几个对象，a==b么？b==c么？</font><br /><font size="2">这里只创建了两个新对象，一个是“Hello World”对象，另一个是与“Hello World”有相同值的对象。a b c都是对象引用。其中a==b为fasle，因为a b指向不同的对象，b==c为true，这是因为b c都指向同一个对象。因为String是一个不可变的对象，而String的直接量赋值会自动寻找以前生成了的内容相同的实例赋给引用，若以前没有内容相同的实例存在，则创建新实例。故会发生b==c。</font></p>
<img src ="http://www.blogjava.net/baogenfly/aggbug/85849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baogenfly/" target="_blank">王某某</a> 2006-12-06 15:15 <a href="http://www.blogjava.net/baogenfly/articles/85849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]Java 范型</title><link>http://www.blogjava.net/baogenfly/articles/84304.html</link><dc:creator>王某某</dc:creator><author>王某某</author><pubDate>Wed, 29 Nov 2006 03:27:00 GMT</pubDate><guid>http://www.blogjava.net/baogenfly/articles/84304.html</guid><wfw:comment>http://www.blogjava.net/baogenfly/comments/84304.html</wfw:comment><comments>http://www.blogjava.net/baogenfly/articles/84304.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baogenfly/comments/commentRss/84304.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baogenfly/services/trackbacks/84304.html</trackback:ping><description><![CDATA[
		<div class="entry-body">
				<font size="2">在已发布的Java1.4中在核心代码库中增加了许多新的API(如Loging,正则表达式，NIO)等，在最新发布的JDK1.5和即将发布的JDK1.6中也新增了许多API，其中比较有重大意义的就是Generics(范型）。<br /><br />　　一.什么是Generics?<br /><br />　　Generics可以称之为参数类型(parameterized types),由编译器来验证从客户端将一种类型传送给某一对象的机制。如Java.util.ArrayList,<br /><br />　　编译器可以用Generics来保证类型安全。<br />在我们深入了解Generics之前,我们先来看一看当前的java 集合框架（Collection)。在j2SE1.4中所有集合的Root Interface是Collection<br /><br />Collections example without genericity: Example 1<br /><br /><br /></font>
				<pre class="overflow">
						<font size="2">1 protected void collectionsExample() {<br />2  ArrayList list = new ArrayList();<br />3  list.add(new String("test string"));<br />4  list.add(new Integer(9)); // purposely placed here to create a runtime ClassCastException<br />5  inspectCollection(list);<br />6 }<br />7<br />8<br />9 protected void inspectCollection(Collection aCollection) {<br />10  Iterator i = aCollection.iterator();<br />11  while (i.hasNext()) {<br />12   String element = (String) i.next();<br />13  }<br />14 }</font>
				</pre>
				<br />
				<br />
				<font size="2">　　以上的样例程序包含的两个方法，collectionExample方法建立了一个简单的集合类型ArrayList，并在ArrayList中增加了一个String和一个Integer对象.而在inspecCollection方法中，我们迭代这个ArrayList用String进行Cast。我们看第二个方法，就出现了一个问题,Collection在内部用的是Object，而我们要取出Collection中的对象时,需要进行Cast，那么开发者必需用实际的类型进行Cast,像这种向下造型，编译器无<br /><br />　　法进行检查,如此一来我们就要冒在代码在运行抛出ClassCastException的危险。我们看inspecCollection方法，编译时没有问题，但在运行时就会抛出ClassCastException异常。所以我们一定要远离这个重大的运行时错误<br /><br /><br />　　二.使用Generics<br />　　从上一章节中的CassCastException这种异常，我们期望在代码编译时就能够捕捉到,下面我们使用范型修改上一章的样例程序。<br />//Example 2<br /></font>
				<pre class="overflow">
						<font size="2">1 protected void collectionsExample() {<br />2  ArrayList&lt;String&gt; list = new ArrayList&lt;String&gt;();<br />3  list.add(new String("test string"));<br />4  // list.add(new Integer(9)); this no longer compiles<br />5  inspectCollection(list);<br />6 }<br />7 <br />8 <br />9 protected void inspectCollection(Collection&lt;String&gt; aCollection) {<br />10  Iterator&lt;String&gt; i = aCollection.iterator();<br />11  while(i.hasNext()) {<br />12   String element = i.next();<br />13  }<br />14 }</font>
				</pre>
				<br />
				<br />
				<font size="2">　　从上面第2行我们在创建ArrayList时使用了新语法，在JDK1.5中所有的Collection都加入了Generics的声明。例:<br />//Example 3<br /></font>
				<pre class="overflow">
						<font size="2">1 public class ArrayList&lt;E&gt; extends AbstractList&lt;E&gt; {<br />2  // details omitted...<br />3  public void add(E element) {<br />4   // details omitted<br />5  }<br />6  public Iterator&lt;E&gt; iterator() {<br />7   // details omitted<br />8  }<br />9 }</font>
				</pre>
				<br />
				<br />
				<font size="2">　　这个E是一个类型变量，并没有对它进行具体类型的定义,它只是在定义ArrayList时的类型占位符,在Example 2中的我们在定义ArrayList的实<br /><br />　　例时用String绑定在E上,当我们用add(E element)方法向ArrayList中增加对象时, 那么就像下面的写法一样： public void add(String element)；因为在ArrayList所有方法都会用String来替代E,无论是方法的参数还是返回值。这时我们在看Example 2中的第四行，编译就会反映出编译错误。<br />所以在java中增加Generics主要的目的是为了增加类型安全。<br /><br />　　通过上面的简单的例子我们看到使用Generics的好处有：<br />　　1.在类型没有变化时，Collection是类型安全的。<br />　　2.内在的类型转换优于在外部的人工造型。<br />　　3.使Java 接口更加强壮,因为它增加了类型。<br />　　4.类型的匹配错误在编译阶段就可以捕捉到，而不是在代码运行时。<br /><br />　　受约束类型变量<br />虽然许多Class被设计成Generics，但类型变量可以是受限的<br />public class C1&lt;T extends Number&gt; { }<br />public class C2&lt;T extends Person &amp; Comparable&gt; { } <br />第一个T变量必须继承Number，第二个T必须继承Person和实现Comparable<br /><br />　　三.Generics 方法<br /><br />　　像Generics类一样，方法和构造函数也可以有类型参数。方法的参数的返回值都可以有类型参数，进行Generics。<br />//Example 4<br /></font>
				<pre class="overflow">
						<font size="2">1 public &lt;T extends Comparable&gt; T max(T t1, T t2) {<br />2  if (t1.compareTo(t2) &gt; 0)<br />3   return t1;<br />4  else return t2;<br />5 }</font>
				</pre>
				<br />
				<br />
				<font size="2">　　这里，max方法的参数类型为单一的T类型，而T类型继承了Comparable，max的参数和返回值都有相同的超类。下面的Example 5显示了max方法的几个约束。<br />//Example 5　<br /></font>
				<pre class="overflow">
						<font size="2">1 Integer iresult = max(new Integer(100), new Integer(200));<br />2 String sresult = max("AA", "BB");<br />3 Number nresult = max(new Integer(100), "AAA"); // does not compile</font>
				</pre>
				<br />
				<br />
				<font size="2">在Example 5第1行参数都为Integer，所以返回值也是Integer，注意返回值没有进行造型。<br />在Example 5第2行参数都为String，所以返回值也是String，注意返回值没有进行造型。以上都调用了同一个方法。<br />在Example 5第3行产生以下编译错误：<br /></font>
				<font size="2">
						<span style="COLOR: blue" twffan="done">Example.java:10: incompatible types<br />found  : java.lang.Object&amp;java.io.Serializable&amp;java.lang.Comparable&lt;?&gt;<br />required: java.lang.Number<br />    Number nresult = max(new Integer(100), "AAA");</span>
						<br />
						<br />　　这个错误发生是因为编译器无法确定返回值类型，因为String和Integer都有相同的超类Object,注意就算我们修正了第三行，这行代码在运行仍然会报错，因为比较了不同的对象。<br /><br />　　四.向下兼容<br />　　任何一个新的特色在新的JDK版本中出来后，我们首先关心的是如何于以前编写的代码兼容。也就是说我们编写的Example 1程序不需要任何的改变就可以运行,但是编译器会给出一个"ROW TYPE"的警告。在JDK1.4中编写的代码如何在JVM1.5中完全兼容运行,我们要人工进行一个:Type erasure处理过程<br /><br />　　五.通配符<br /><br />//Example 6<br /></font>
				<pre class="overflow">
						<font size="2">List&lt;String&gt; stringList = new ArrayList&lt;String&gt;(); //1<br />List&lt;Object&gt; objectList = stringList ;//2<br />objectList .add(new Object()); // 3<br />String s = stringList .get(0);//4</font>
				</pre>
				<br />
				<br />
				<font size="2">　　乍一看，Example <br /><br />　　6是正确的。但stringList本意是存放String类型的ArrayList,而objectList中可以存入任何对象，当在第3行进行处理时，stringList也就无法保证是String类型的ArrayList,此时编译器不允许这样的事出现，所以第3行将无法编译。<br /><br />//Example 7<br /></font>
				<pre class="overflow">
						<font size="2">void printCollection(Collection&lt;Object&gt; c) <br />{ for (Object e : c) { <br />System.out.println(e);<br />}}</font>
				</pre>
				<br />
				<br />
				<font size="2">　　Example 7的本意是打印所有Collection的对象,但是正如Example 6所说的，编译会报错，此时就可以用通配符“？”来修改Example 7<br /><br />//Example 8<br /></font>
				<pre class="overflow">
						<font size="2">void printCollection(Collection&lt;?&gt; c) <br />{ for (Object e : c) { <br />System.out.println(e);<br />}}</font>
				</pre>
				<br />
				<br />
				<font size="2">Example 8中所有Collection类型就可以方便的打印了<br /><br />　　有界通配符 &lt;T extends Number&gt;(上界) &lt;T super Number&gt;(下界) <br /><br />　　六.创建自己的范型<br />以下代码来自http://www.java2s.com/ExampleCode/Language-Basics<br />1.一个参数的Generics<br />//Example 9(没有使用范型)<br /></font>
				<pre class="overflow">
						<font size="2">class NonGen {  <br />  Object ob; // ob is now of type Object <br />  // Pass the constructor a reference to   <br />  // an object of type Object <br />  NonGen(Object o) {  <br />    ob = o;  <br />  }  <br />  // Return type Object. <br />  Object getob() {  <br />    return ob;  <br />  }  <br />  // Show type of ob.  <br />  void showType() {  <br />    System.out.println("Type of ob is " +  <br />                       ob.getClass().getName());  <br />  }  <br />}  <br />// Demonstrate the non-generic class.  <br />public class NonGenDemo {  <br />  public static void main(String args[]) {  <br />    NonGen iOb;   <br />    // Create NonGen Object and store <br />    // an Integer in it. Autoboxing still occurs. <br />    iOb = new NonGen(88);  <br />    // Show the type of data used by iOb. <br />    iOb.showType(); <br />    // Get the value of iOb. <br />    // This time, a cast is necessary. <br />    int v = (Integer) iOb.getob();  <br />    System.out.println("value: " + v);  <br />    System.out.println();  <br />    // Create another NonGen object and  <br />    // store a String in it. <br />    NonGen strOb = new NonGen("Non-Generics Test");  <br />    // Show the type of data used by strOb. <br />    strOb.showType(); <br />    // Get the value of strOb. <br />    // Again, notice that a cast is necessary.  <br />    String str = (String) strOb.getob();  <br />    System.out.println("value: " + str);  <br />    // This compiles, but is conceptually wrong! <br />    iOb = strOb; <br />    v = (Integer) iOb.getob(); // runtime error! <br />  }  <br />}</font>
				</pre>
				<font size="2">  <br /><br />//Example 10(使用范型)<br /></font>
				<pre class="overflow">
						<font size="2">class Example1&lt;T&gt;{<br /> private T t;<br /> Example1(T o){<br />  this.t=o;<br />  }<br /> T getOb(){<br />  return t;<br /> }<br /> void ShowObject(){<br />  System.out.println("对象的类型是："+t.getClass().getName());<br /> }<br />}<br />public class GenericsExample1 {<br /><br /> /**<br />  * @param args<br />  */<br /> public static void main(String[] args) {<br />  // TODO Auto-generated method stub<br />  Example1&lt;Integer&gt; examplei=new Example1&lt;Integer&gt;(100);<br />  examplei.ShowObject();<br />  System.out.println("对象是："+examplei.getOb());<br />  Example1&lt;String&gt; examples=new Example1&lt;String&gt;("Bill");<br />  examples.ShowObject();<br />  System.out.println("对象是："+examples.getOb());<br /> }<br /><br />}</font>
				</pre>
				<br />
				<br />
				<font size="2">　　我们来看Example 9没有使用范型，所以我们需要进行造型，而Example 10我们不需要任何的造型<br /><br />2.二个参数的Generics<br /><br />//Example 11<br /></font>
				<pre class="overflow">
						<font size="2">class TwoGen&lt;T, V&gt; { <br />   T ob1; <br />   V ob2; <br />   // Pass the constructor a reference to  <br />   // an object of type T. <br />   TwoGen(T o1, V o2) { <br />     ob1 = o1; <br />     ob2 = o2; <br />   } <br />   // Show types of T and V. <br />   void showTypes() { <br />     System.out.println("Type of T is " + <br />                        ob1.getClass().getName()); <br />     System.out.println("Type of V is " + <br />                        ob2.getClass().getName()); <br />   } <br />   T getob1() { <br />     return ob1; <br />   } <br />   V getob2() { <br />     return ob2; <br />   } <br /> } <br /><br />public class GenericsExampleByTwoParam {<br /><br /> /**<br />  * @param args<br />  */<br /> public static void main(String[] args) {<br />  // TODO Auto-generated method stub<br />  TwoGen&lt;Integer, String&gt; tgObj = <br />       new TwoGen&lt;Integer, String&gt;(88, "Generics"); <br />     // Show the types. <br />     tgObj.showTypes(); <br />     // Obtain and show values. <br />     int v = tgObj.getob1(); <br />     System.out.println("value: " + v); <br />     String str = tgObj.getob2(); <br />     System.out.println("value: " + str); <br />   } <br /><br /> }</font>
				</pre>
				<br />
				<br />
				<font size="2">3.Generics的Hierarchy<br /><br />//Example 12<br /></font>
				<pre class="overflow">
						<font size="2">class Stats&lt;T extends Number&gt; {  <br />   T[] nums; // array of Number or subclass <br />   // Pass the constructor a reference to   <br />   // an array of type Number or subclass. <br />   Stats(T[] o) {  <br />     nums = o;  <br />   }  <br />   // Return type double in all cases. <br />   double average() {  <br />     double sum = 0.0; <br />     for(int i=0; i &lt; nums.length; i++)  <br />       sum += nums[i].doubleValue(); <br />     return sum / nums.length; <br />   }  <br /> }  <br />public class GenericsExampleByHierarchy {<br /><br /><br /> /**<br />  * @param args<br />  */<br /> public static void main(String[] args) {<br />  // TODO Auto-generated method stub<br /><br />   Integer inums[] = { 1, 2, 3, 4, 5 }; <br />     Stats&lt;Integer&gt; iob = new Stats&lt;Integer&gt;(inums);   <br />     double v = iob.average(); <br />     System.out.println("iob average is " + v); <br />     Double dnums[] = { 1.1, 2.2, 3.3, 4.4, 5.5 }; <br />     Stats&lt;Double&gt; dob = new Stats&lt;Double&gt;(dnums);   <br />     double w = dob.average(); <br />     System.out.println("dob average is " + w); <br />     // This won't compile because String is not a <br />     // subclass of Number. <br />//     String strs[] = { "1", "2", "3", "4", "5" }; <br />//     Stats&lt;String&gt; strob = new Stats&lt;String&gt;(strs);   <br />//     double x = strob.average(); <br />//     System.out.println("strob average is " + v); <br />   }  <br /> }</font>
				</pre>
				<font size="2">  <br /><br />　　4.使用通配符<br />//Example 14<br /></font>
				<pre class="overflow">
						<font size="2">class StatsWildCard&lt;T extends Number&gt; {<br /> T[] nums; // array of Number or subclass<br /> // Pass the constructor a reference to<br /> // an array of type Number or subclass.<br /> StatsWildCard(T[] o) {<br />  nums = o;<br /> }<br /> // Return type double in all cases.<br /> double average() {<br />  double sum = 0.0;<br />  for (int i = 0; i &lt; nums.length; i++)<br />   sum += nums[i].doubleValue();<br />  return sum / nums.length;<br /> }<br /> // Determine if two averages are the same.<br /> // Notice the use of the wildcard.<br /> boolean sameAvg(StatsWildCard&lt;?&gt; ob) {<br />  if (average() == ob.average())<br />   return true;<br />  return false;<br /> }<br />}<br /><br />public class GenericsExampleByWildcard {<br /><br /> /**<br />  * @param args<br />  */<br /> public static void main(String[] args) {<br />  // TODO Auto-generated method stub<br />  Integer inums[] = { 1, 2, 3, 4, 5 };<br />  StatsWildCard&lt;Integer&gt; iob = new StatsWildCard&lt;Integer&gt;(inums);<br />  double v = iob.average();<br />  System.out.println("iob average is " + v);<br />  Double dnums[] = { 1.1, 2.2, 3.3, 4.4, 5.5 };<br />  StatsWildCard&lt;Double&gt; dob = new StatsWildCard&lt;Double&gt;(dnums);<br />  double w = dob.average();<br />  System.out.println("dob average is " + w);<br />  Float fnums[] = { 1.0F, 2.0F, 3.0F, 4.0F, 5.0F };<br />  StatsWildCard&lt;Float&gt; fob = new StatsWildCard&lt;Float&gt;(fnums);<br />  double x = fob.average();<br />  System.out.println("fob average is " + x);<br />  // See which arrays have same average.<br />  System.out.print("Averages of iob and dob ");<br />  if (iob.sameAvg(dob))<br />   System.out.println("are the same.");<br />  else<br />   System.out.println("differ.");<br />  System.out.print("Averages of iob and fob ");<br />  if (iob.sameAvg(fob))<br />   System.out.println("are the same.");<br />  else<br />   System.out.println("differ.");<br /><br /> }<br /><br />}</font>
				</pre>
				<br />
				<br />
				<font size="2">　　5.使用边界通配符<br />//Example 15<br /></font>
				<pre class="overflow">
						<font size="2">class TwoD { <br />  int x, y; <br />  TwoD(int a, int b) { <br />    x = a; <br />    y = b; <br />  } <br />} <br />// Three-dimensional coordinates. <br />class ThreeD extends TwoD { <br />  int z; <br />  ThreeD(int a, int b, int c) { <br />    super(a, b); <br />    z = c; <br />  } <br />} <br />// Four-dimensional coordinates. <br />class FourD extends ThreeD { <br />  int t; <br />  FourD(int a, int b, int c, int d) { <br />    super(a, b, c); <br />    t = d;  <br />  } <br />} <br />// This class holds an array of coordinate objects. <br />class Coords&lt;T extends TwoD&gt; { <br />  T[] coords; <br />  Coords(T[] o) { coords = o; } <br />} <br />// Demonstrate a bounded wildcard. <br />public class BoundedWildcard { <br />  static void showXY(Coords&lt;?&gt; c) { <br />    System.out.println("X Y Coordinates:"); <br />    for(int i=0; i &lt; c.coords.length; i++) <br />      System.out.println(c.coords[i].x + " " + <br />                         c.coords[i].y); <br />    System.out.println(); <br />  } <br />  static void showXYZ(Coords&lt;? extends ThreeD&gt; c) { <br />    System.out.println("X Y Z Coordinates:"); <br />    for(int i=0; i &lt; c.coords.length; i++) <br />      System.out.println(c.coords[i].x + " " + <br />                         c.coords[i].y + " " + <br />                         c.coords[i].z); <br />    System.out.println(); <br />  } <br />  static void showAll(Coords&lt;? extends FourD&gt; c) { <br />    System.out.println("X Y Z T Coordinates:"); <br />    for(int i=0; i &lt; c.coords.length; i++) <br />      System.out.println(c.coords[i].x + " " + <br />                         c.coords[i].y + " " + <br />                         c.coords[i].z + " " + <br />                         c.coords[i].t); <br />    System.out.println(); <br />  } <br />  public static void main(String args[]) { <br />    TwoD td[] = { <br />      new TwoD(0, 0), <br />      new TwoD(7, 9), <br />      new TwoD(18, 4), <br />      new TwoD(-1, -23) <br />    }; <br />    Coords&lt;TwoD&gt; tdlocs = new Coords&lt;TwoD&gt;(td);     <br />    System.out.println("Contents of tdlocs."); <br />    showXY(tdlocs); // OK, is a TwoD <br />//  showXYZ(tdlocs); // Error, not a ThreeD <br />//  showAll(tdlocs); // Erorr, not a FourD <br />    // Now, create some FourD objects. <br />    FourD fd[] = { <br />      new FourD(1, 2, 3, 4), <br />      new FourD(6, 8, 14, 8), <br />      new FourD(22, 9, 4, 9), <br />      new FourD(3, -2, -23, 17) <br />    }; <br />    Coords&lt;FourD&gt; fdlocs = new Coords&lt;FourD&gt;(fd);     <br />    System.out.println("Contents of fdlocs."); <br />    // These are all OK. <br />    showXY(fdlocs);  <br />    showXYZ(fdlocs); <br />    showAll(fdlocs); <br />  } <br />} </font>
				</pre>
				<br />
				<br />
				<br />
				<font size="2">6.ArrayList的Generics<br />//Example 16<br /></font>
				<pre class="overflow">
						<font size="2">public class ArrayListGenericDemo {<br />  public static void main(String[] args) {<br />    ArrayList&lt;String&gt; data = new ArrayList&lt;String&gt;();<br />    data.add("hello");<br />    data.add("goodbye");<br /><br />    // data.add(new Date()); This won't compile!<br /><br />    Iterator&lt;String&gt; it = data.iterator();<br />    while (it.hasNext()) {<br />      String s = it.next();<br />      System.out.println(s);<br />    }<br />  }<br />} </font>
				</pre>
				<br />
				<br />
				<font size="2">7.HashMap的Generics<br />//Example 17<br /></font>
				<pre class="overflow">
						<font size="2">public class HashDemoGeneric {<br />  public static void main(String[] args) {<br />    HashMap&lt;Integer,String&gt; map = new HashMap&lt;Integer,String&gt;();<br /><br />    map.put(1, "Ian");<br />    map.put(42, "Scott");<br />    map.put(123, "Somebody else");<br /><br />    String name = map.get(42);<br />    System.out.println(name);<br />  }<br />} </font>
				</pre>
				<br />
				<br />
				<font size="2">8.接口的Generics<br />//Example 18<br /></font>
				<pre class="overflow">
						<font size="2">interface MinMax&lt;T extends Comparable&lt;T&gt;&gt; { <br />  T min(); <br />  T max(); <br />} <br />// Now, implement MinMax <br />class MyClass&lt;T extends Comparable&lt;T&gt;&gt; implements MinMax&lt;T&gt; { <br />  T[] vals; <br />  MyClass(T[] o) { vals = o; } <br />  // Return the minimum value in vals. <br />  public T min() { <br />    T v = vals[0]; <br />    for(int i=1; i &lt; vals.length; i++) <br />      if(vals[i].compareTo(v) &lt; 0) v = vals[i]; <br />    return v; <br />  } <br />  // Return the maximum value in vals. <br />  public T max() { <br />    T v = vals[0]; <br />    for(int i=1; i &lt; vals.length; i++) <br />      if(vals[i].compareTo(v) &gt; 0) v = vals[i]; <br />    return v; <br />  } <br />} <br />public class GenIFDemo { <br />  public static void main(String args[]) { <br />    Integer inums[] = {3, 6, 2, 8, 6 }; <br />    Character chs[] = {'b', 'r', 'p', 'w' }; <br />    MyClass&lt;Integer&gt; iob = new MyClass&lt;Integer&gt;(inums); <br />    MyClass&lt;Character&gt; cob = new MyClass&lt;Character&gt;(chs); <br />    System.out.println("Max value in inums: " + iob.max()); <br />    System.out.println("Min value in inums: " + iob.min()); <br />    System.out.println("Max value in chs: " + cob.max()); <br />    System.out.println("Min value in chs: " + cob.min()); <br />  } <br />}</font>
				</pre>
				<br />
				<br />
				<font size="2">9.Exception的Generics<br />//Example 20<br /></font>
				<pre class="overflow">
						<font size="2">interface Executor&lt;E extends Exception&gt; {<br />    void execute() throws E;<br />}<br /><br />public class GenericExceptionTest {<br />    public static void main(String args[]) {<br />        try {<br />            Executor&lt;IOException&gt; e =<br />                new Executor&lt;IOException&gt;() {<br />                public void execute() throws IOException<br />                {<br />                    // code here that may throw an<br />                    // IOException or a subtype of<br />                    // IOException<br />                }<br />            };<br /><br />            e.execute();<br />        } catch(IOException ioe) {<br />            System.out.println("IOException: " + ioe);<br />            ioe.printStackTrace();<br />        }<br />    }<br />}  </font>
				</pre>
		</div>
<img src ="http://www.blogjava.net/baogenfly/aggbug/84304.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baogenfly/" target="_blank">王某某</a> 2006-11-29 11:27 <a href="http://www.blogjava.net/baogenfly/articles/84304.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于boolean</title><link>http://www.blogjava.net/baogenfly/articles/76572.html</link><dc:creator>王某某</dc:creator><author>王某某</author><pubDate>Sat, 21 Oct 2006 12:40:00 GMT</pubDate><guid>http://www.blogjava.net/baogenfly/articles/76572.html</guid><wfw:comment>http://www.blogjava.net/baogenfly/comments/76572.html</wfw:comment><comments>http://www.blogjava.net/baogenfly/articles/76572.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baogenfly/comments/commentRss/76572.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baogenfly/services/trackbacks/76572.html</trackback:ping><description><![CDATA[
		<font size="2">        当编译器把Java源码编译成字节码时，他会用int或者byte来表示boolean。在Java虚拟机种，false是由整数0来表示的，所有非零整数都表示true。涉及boolean值得操作则会使用int。另外，boolean数组是当作byte数组来访问的。但是在“堆”区，他也可以表示为位域。</font>
<img src ="http://www.blogjava.net/baogenfly/aggbug/76572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baogenfly/" target="_blank">王某某</a> 2006-10-21 20:40 <a href="http://www.blogjava.net/baogenfly/articles/76572.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于重载</title><link>http://www.blogjava.net/baogenfly/articles/74175.html</link><dc:creator>王某某</dc:creator><author>王某某</author><pubDate>Mon, 09 Oct 2006 13:09:00 GMT</pubDate><guid>http://www.blogjava.net/baogenfly/articles/74175.html</guid><wfw:comment>http://www.blogjava.net/baogenfly/comments/74175.html</wfw:comment><comments>http://www.blogjava.net/baogenfly/articles/74175.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baogenfly/comments/commentRss/74175.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baogenfly/services/trackbacks/74175.html</trackback:ping><description><![CDATA[      <font size="2">  <font color="#ff0000">对于重载方法（overloaded method）的选择是静态的，而对于被改写的（overwritten method）方法的选择是动态的。------摘自《effective java》<br /></font><font color="#000000">         这个该怎么来理解呢？其实就是说当出现继承关系时，到底是调用被改写的方法还是调用没有被改写的方法，是动态的决定的。是父类对象就调用父类方法，是子类对象就调用子类方法。而不管编译时的类型。如A的子类有B、C，A[ ] test = new A[ ]{ new A（），new B（），new C（）}，那么在以后通过test[i]来访问每个对象，则test[2]调用的是C对象改写的方法。对于重载方法来说，如果编译时类型就已经确定，在运行时虽然类型不同，但是不影响重载方法的选择。See 《Effective java》P109。 </font></font><img src ="http://www.blogjava.net/baogenfly/aggbug/74175.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baogenfly/" target="_blank">王某某</a> 2006-10-09 21:09 <a href="http://www.blogjava.net/baogenfly/articles/74175.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java assert的用法[转载]</title><link>http://www.blogjava.net/baogenfly/articles/72222.html</link><dc:creator>王某某</dc:creator><author>王某某</author><pubDate>Wed, 27 Sep 2006 02:48:00 GMT</pubDate><guid>http://www.blogjava.net/baogenfly/articles/72222.html</guid><wfw:comment>http://www.blogjava.net/baogenfly/comments/72222.html</wfw:comment><comments>http://www.blogjava.net/baogenfly/articles/72222.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/baogenfly/comments/commentRss/72222.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baogenfly/services/trackbacks/72222.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<font size="2">
						<span lang="EN-US">assert</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是在</span>
						<span lang="EN-US">J2SE1.4</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中引入的新特性，</span>
						<span lang="EN-US">assertion</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就是在代码中包括的布尔型状态，程序员认为这个状态是</span>
						<span lang="EN-US">true</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。一般来说</span>
						<span lang="EN-US">assert</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在开发的时候是检查程序的安全性的，在发布的时候通常都不使用</span>
						<span lang="EN-US">assert</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。在</span>
						<span lang="EN-US">1.4</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中添加了</span>
						<span lang="EN-US">assert</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关键字和</span>
						<span lang="EN-US">java.lang.AssertError</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类的支持。</span>
						<span lang="EN-US">
								<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US">
								<span style="mso-spacerun: yes">      </span>
						</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先，我们有必要从一个例子说起</span>
						<span lang="EN-US">assert<o:p></o:p></span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">public class AssertTest<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">{<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes"> </span>public static void main(String[] args)<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes"> </span>{<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">  </span>AssertTest at = new AssertTest();<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">  </span>at.assertMe(true);<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">  </span>at.assertMe(false);<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">   </span>
								<o:p>
								</o:p>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes"> </span>} <o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes"> </span>
								<o:p>
								</o:p>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes"> </span>private<span style="mso-spacerun: yes">  </span>void assertMe(boolean boo)<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes"> </span>{<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">  </span>assert boo?true:false; <o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">  </span>System.out.println(true condition);<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes"> </span>}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes"> </span>
								<o:p>
								</o:p>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<font size="2">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序中包含了</span>
						<span lang="EN-US">assert</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的话，你要用</span>
						<span lang="EN-US">javac -source 1.4 xxx.java</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来编译，否则编译器会报错的。要想让</span>
						<span lang="EN-US">assert</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">得部分运行的话，要使用</span>
						<span lang="EN-US">java -ea xxx</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来运行，否则包含</span>
						<span lang="EN-US">assert</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">得行会被忽略。下面我们运行</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="BACKGROUND: yellow; COLOR: red; mso-highlight: yellow">
						<font size="2">javac -source 1.4 AssertTest.java <o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="BACKGROUND: yellow; COLOR: red; mso-highlight: yellow">java -ea AssertTest</span>
						<span lang="EN-US" style="COLOR: red">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">看看结果的输出是：</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="BACKGROUND: yellow; COLOR: red; mso-highlight: yellow">
						<font size="2">true condition<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="BACKGROUND: yellow; COLOR: red; mso-highlight: yellow">
						<font size="2">Exception in thread main java.lang.AssertionError<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="BACKGROUND: yellow; COLOR: red; mso-highlight: yellow">
						<font size="2">
								<span style="mso-spacerun: yes">        </span>at AssertTest.assertMe(AssertTest.java:13)<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US" style="BACKGROUND: yellow; COLOR: red; mso-highlight: yellow">
								<span style="mso-spacerun: yes">        </span>at AssertTest.main(AssertTest.java:7)</span>
						<span lang="EN-US" style="COLOR: red">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当我们运行</span>
						<span lang="EN-US">at.assertMe(true)</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">得时候，由于</span>
						<span lang="EN-US">assert boo?true:false</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">相当于</span>
						<span lang="EN-US">assert true;</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">因此没有任何问题，程序往下执行打印出</span>
						<span lang="EN-US">true condition</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，但是执行</span>
						<span lang="EN-US">at.assertMe(false)</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的时候相当于</span>
						<span lang="EN-US">assert false</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，这个时候解释器就会抛出</span>
						<span lang="EN-US">AssertionError</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">了，程序就终止了。大家必须清楚</span>
						<span lang="EN-US">AssertionError</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是继承自</span>
						<span lang="EN-US">Error</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">得，因此你可以不再程序中</span>
						<span lang="EN-US">catch</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">它的，当然你也可以在程序中</span>
						<span lang="EN-US">catch</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">它然后程序可以继续执行。例如：</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">public class AssertTest<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">{<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes"> </span>public static void main(String[] args)<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes"> </span>{<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">  </span>AssertTest at = new AssertTest();<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">  </span>try<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">  </span>{<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">   </span>at.assertMe(true);<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">   </span>at.assertMe(false);<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">  </span>}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">  </span>catch(AssertionError ae)<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">  </span>{<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">   </span>System.out.println(AsseriontError catched); <o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">  </span>}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">  </span>System.out.println(go on);<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">   </span>
								<o:p>
								</o:p>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes"> </span>} <o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes"> </span>
								<o:p>
								</o:p>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes"> </span>private<span style="mso-spacerun: yes">  </span>void assertMe(boolean boo)<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes"> </span>{<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">  </span>assert boo?true:false; <o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">  </span>System.out.println(true condition);<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes"> </span>}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes"> </span>
								<o:p>
								</o:p>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p>
								<font size="2"> </font>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US">
								<span style="mso-spacerun: yes">    </span>assert</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还有另外一种表达的方式，就是</span>
						<span lang="EN-US">assert exp1:exp2;</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其中</span>
						<span lang="EN-US">exp1</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是个</span>
						<span lang="EN-US">boolean</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回值得表达式，而</span>
						<span lang="EN-US">exp2</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以是原始的数据类型或者对象都可以例如：</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">   </span>boolean boo = true;<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">   </span>String str = null;<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US">
								<span style="mso-spacerun: yes">    </span>assert boo = false</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span>
						<span lang="EN-US">str=error;<o:p></o:p></span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们刚开始讲得</span>
						<span lang="EN-US">assert exp1</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">得形式，当</span>
						<span lang="EN-US">exp1</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</span>
						<span lang="EN-US">false</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">得时候，</span>
						<span lang="EN-US">AssertionError</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">得默认构造器会被调用，但是</span>
						<span lang="EN-US">assert exp1:exp2</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样的形式，当</span>
						<span lang="EN-US">exp1</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为</span>
						<span lang="EN-US">true</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的时候后面</span>
						<span lang="EN-US">exp2</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">被或略，如果</span>
						<span lang="EN-US">false</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的话，后面的表达式的结果会被计算出来并作为</span>
						<span lang="EN-US">AssertionError</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">得构造器参数。看下面的例子：</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">public class AssertTest<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">{<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes"> </span>public static void main(String[] args)<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes"> </span>{<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">  </span>AssertTest at = new AssertTest();<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">  </span>at.assertMe(true);<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">  </span>at.assertMe(false);<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">   </span>
								<o:p>
								</o:p>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes"> </span>} <o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes"> </span>
								<o:p>
								</o:p>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes"> </span>private<span style="mso-spacerun: yes">  </span>void assertMe(boolean boo)<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes"> </span>{<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">  </span>String s = null;<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">  </span>assert boo?true:false:s = hello world; <o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">  </span>System.out.println(true condition);<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes"> </span>}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes"> </span>
								<o:p>
								</o:p>
						</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US">}</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行的时候会得到这样的结果</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">true condition<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">Exception in thread main java.lang.AssertionError: hello world<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">        </span>at AssertTest.assertMe(AssertTest.java:14)<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">        </span>at AssertTest.main(AssertTest.java:7)<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US">Assert</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最好不要滥用，原因是</span>
						<span lang="EN-US">assert</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">并不一定都是</span>
						<span lang="EN-US">enable</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的，下面两种情况就不应该用</span>
						<span lang="EN-US">assert<o:p></o:p></span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<font size="2">
						<font style="BACKGROUND-COLOR: #ffff33">
								<span lang="EN-US">1</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不要再</span>
								<span lang="EN-US">public</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的方法里面检查参数是不是为</span>
								<span lang="EN-US">null</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">之类的操作</span>
								<span lang="EN-US">
										<o:p>
										</o:p>
								</span>
						</font>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如</span>
						<span lang="EN-US">public int get(String s)<o:p></o:p></span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">   </span>{<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">       </span>assert s != null;<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<span style="mso-spacerun: yes">   </span>}<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果需要检查也最好通过</span>
						<span lang="EN-US">if s = null </span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">抛出</span>
						<span lang="EN-US">NullPointerException</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来检查</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<font size="2">
						<font style="BACKGROUND-COLOR: #ffff33">
								<span lang="EN-US">2</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不要用</span>
								<span lang="EN-US">assert</span>
								<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来检查方法操作的返回值来判断方法操作的结果</span>
						</font>
						<span lang="EN-US">
								<span style="mso-spacerun: yes">   </span>
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<font size="2">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如</span>
						<span lang="EN-US">assert list.removeAll();</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样看起来好像没有问题</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">但是想想如果</span>
						<span lang="EN-US">assert </span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">被</span>
						<span lang="EN-US">disable</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">呢，那样他就不会被执行了</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所以</span>
						<span lang="EN-US">removeAll()</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作就没有被执行</span>
						<span lang="EN-US">
								<span style="mso-spacerun: yes">  </span>
						</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以这样代替<br /></span>
				</font>
				<span lang="EN-US">
						<font size="2">boolean boo = list.removeAl();<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">assert boo;</font>
				</span>
		</p>
<img src ="http://www.blogjava.net/baogenfly/aggbug/72222.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baogenfly/" target="_blank">王某某</a> 2006-09-27 10:48 <a href="http://www.blogjava.net/baogenfly/articles/72222.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java里的内部类</title><link>http://www.blogjava.net/baogenfly/articles/71529.html</link><dc:creator>王某某</dc:creator><author>王某某</author><pubDate>Sun, 24 Sep 2006 02:15:00 GMT</pubDate><guid>http://www.blogjava.net/baogenfly/articles/71529.html</guid><wfw:comment>http://www.blogjava.net/baogenfly/comments/71529.html</wfw:comment><comments>http://www.blogjava.net/baogenfly/articles/71529.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baogenfly/comments/commentRss/71529.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baogenfly/services/trackbacks/71529.html</trackback:ping><description><![CDATA[
		<font size="2">         java里的嵌套类有四种：静态成员类（static member class）、非静态成员类（nonstatic member class）、匿名类（anonymous class）和局部类（local class）。 <br /><br />         静态成员类和非静态成员类的区别是：非静态成员类的每一个实例都隐含着与外围类的一个外围实例（enlosing instance）紧密关联在一起。在非静态成员类的实例方法内部，调用外围实例上的方法是有可能的，或者使用经过修饰的this指针可以得到一个指向外围实例的引用。<strong>如果声明的成员类不访问外围实例，则声明为静态成员类。如果使用了非静态成员类，那么它的每一个实例都将包含一个额外的指向外围对象的引用。</strong></font>
		<p>
				<strong>
						<font size="2">以上是《effective java》中的论述。下面是在网上找到的关于匿名类的叙述。</font>
				</strong>
		</p>
		<p>
				<font size="2">匿名类<br />       匿名类是不能有名称的类，所以没办法引用它们。必须在创建时，作为new语句的一部分来声明它们。这就要采用另一种形式的new语句，如下所示： <br />new &lt;类或接口&gt; &lt;类的主体&gt;<br />       这种形式的new语句声明一个新的匿名类，它对一个给定的类进行扩展，或者实现一个给定的接口。它还创建那个类的一个新实例，并把它作为语句的结果而返回。要扩展的类和要实现的接口是new语句的操作数，后跟匿名类的主体。<br />       如果匿名类对另一个类进行扩展，它的主体可以访问类的成员、覆盖它的方法等等，这和其他任何标准的类都是一样的。如果匿名类实现了一个接口，它的主体必须实现接口的方法。<br />        注意匿名类的声明是在编译时进行的，实例化在运行时进行。这意味着for循环中的一个new语句会创建相同匿名类的几个实例，而不是创建几个不同匿名类的一个实例。<br />        从技术上说，匿名类可被视为非静态的内部类，所以它们具有和方法内部声明的非静态内部类一样的权限和限制。<br />        如果要执行的任务需要一个对象，但却不值得创建全新的对象（原因可能是所需的类过于简单，或者是由于它只在一个方法内部使用），匿名类就显得非常有用。匿名类尤其适合在Swing应用程序中快速创建事件处理程序。</font>
		</p>
<img src ="http://www.blogjava.net/baogenfly/aggbug/71529.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baogenfly/" target="_blank">王某某</a> 2006-09-24 10:15 <a href="http://www.blogjava.net/baogenfly/articles/71529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java的模拟多重继承</title><link>http://www.blogjava.net/baogenfly/articles/71503.html</link><dc:creator>王某某</dc:creator><author>王某某</author><pubDate>Sat, 23 Sep 2006 15:48:00 GMT</pubDate><guid>http://www.blogjava.net/baogenfly/articles/71503.html</guid><wfw:comment>http://www.blogjava.net/baogenfly/comments/71503.html</wfw:comment><comments>http://www.blogjava.net/baogenfly/articles/71503.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baogenfly/comments/commentRss/71503.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baogenfly/services/trackbacks/71503.html</trackback:ping><description><![CDATA[
		<p>        实现了这个接口的类可以把对于接口方法的调用，转发到一个内部私有类的实例上，而这个内部私有类扩展了骨架实现类。这项技术被称为模拟多重继承（simulated mutiple inheritance）。 （以上摘至《effective java》）。这点不是很明白。这怎么就跟多继承扯上关系了。是不是这么看，就是内部私有类接受了接口实现类提供的方法，同时它又extends了接口的骨架实现类，而骨架实现类也是对接口的一种实现，所以从这个层面上看，内部私有类相当于既继承了骨架实现类，又继承了接口实现类。<img alt="" src="http://blog.csdn.net/fckeditor/editor/images/smiley/msn/confused_smile.gif" />，自己都有些糊涂了，望高人指点下。</p>
<img src ="http://www.blogjava.net/baogenfly/aggbug/71503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baogenfly/" target="_blank">王某某</a> 2006-09-23 23:48 <a href="http://www.blogjava.net/baogenfly/articles/71503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java里的继承</title><link>http://www.blogjava.net/baogenfly/articles/71502.html</link><dc:creator>王某某</dc:creator><author>王某某</author><pubDate>Sat, 23 Sep 2006 15:46:00 GMT</pubDate><guid>http://www.blogjava.net/baogenfly/articles/71502.html</guid><wfw:comment>http://www.blogjava.net/baogenfly/comments/71502.html</wfw:comment><comments>http://www.blogjava.net/baogenfly/articles/71502.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baogenfly/comments/commentRss/71502.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baogenfly/services/trackbacks/71502.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#000000">java里的实体类是不支持多继承的，也就是Class A 只能使用一次extends ，但是接口就不同，一个接口可以继承多个接口。例如：</font>
		</p>
		<p>
				<font color="#000000">public interface Singer{</font>
		</p>
		<p>
				<font color="#000000"> AudioClip Sing(Song s);</font>
		</p>
		<p>
				<font color="#000000">}</font>
		</p>
		<p>
				<font color="#000000">public interface Songwriter{</font>
		</p>
		<p>
				<font color="#000000"> Song compose(boolean hit);</font>
		</p>
		<p>
				<font color="#000000">}</font>
		</p>
		<p>
				<font color="#000000">public interface SingerSongwriter extends Singer,Songwriter{</font>
		</p>
		<p>
				<font color="#000000"> AudioClip strum();</font>
		</p>
		<p>
				<font color="#000000"> void actSensitive();</font>
		</p>
		<p>
				<font color="#000000">}</font>
		</p>
<img src ="http://www.blogjava.net/baogenfly/aggbug/71502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baogenfly/" target="_blank">王某某</a> 2006-09-23 23:46 <a href="http://www.blogjava.net/baogenfly/articles/71502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>