﻿<?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-thinking-随笔分类-J2SE</title><link>http://www.blogjava.net/alinglau36/category/38703.html</link><description>one platform thousands thinking</description><language>zh-cn</language><lastBuildDate>Fri, 27 Oct 2017 22:21:12 GMT</lastBuildDate><pubDate>Fri, 27 Oct 2017 22:21:12 GMT</pubDate><ttl>60</ttl><item><title>newInstance() 和 new 有什么区别？(转)</title><link>http://www.blogjava.net/alinglau36/archive/2011/04/14/348306.html</link><dc:creator>lau</dc:creator><author>lau</author><pubDate>Thu, 14 Apr 2011 09:37:00 GMT</pubDate><guid>http://www.blogjava.net/alinglau36/archive/2011/04/14/348306.html</guid><wfw:comment>http://www.blogjava.net/alinglau36/comments/348306.html</wfw:comment><comments>http://www.blogjava.net/alinglau36/archive/2011/04/14/348306.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alinglau36/comments/commentRss/348306.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alinglau36/services/trackbacks/348306.html</trackback:ping><description><![CDATA[在初始化一个类，生成一个实例的时候；newInstance() 和 new 有什么区别？
<br />
用newInstance与用new是区别的，区别在于创建对象的方式不一样，前者是使用类加载机制，那么为什么会有两种创建对象方式？这个就要从可伸缩、可扩展，可重用等软件思想上解释了。
<br />
Java中工厂模式经常使用newInstance来创建对象，因此从为什么要使用工厂模式上也可以找到具体答案。
<br />
例如：
<br />
Class c = Class.forName(&#8220;A&#8221;);factory = (AInterface)c.newInstance();
<br />
其中AInterface是A的接口，如果下面这样写，你可能会理解：
<br />
String className = "A";Class c = Class.forName(className);factory = (AInterface)c.newInstance();
<br />
进一步，如果下面写，你可能会理解：
<br />
String className = readfromXMlConfig;//从xml 配置文件中获得字符串Class c =
Class.forName(className);factory = (AInterface)c.newInstance();
<br />
上面代码就消灭了A类名称，优点：无论A类怎么变化，上述代码不变，甚至可以更换A的兄弟类B , C , D....等，只要他们继承Ainterface就可以。
<br />
从jvm的角度看，我们使用new的时候，这个要new的类可以没有加载；
<br />
<span style="color: red;">但是使用newInstance时候，就必须保证：1、这个类已经加载；2、这个类已经连接了。而完成上面两个步骤的正是class的静态方法forName（）方法，这个静态方法调用了启动类加载器（就是加载java API的那个加载器）</span>。
<br />
有了上面jvm上的理解，那么我们可以这样说，newInstance实际上是把new这个方式分解为两步,即，首先调用class的加载方法加载某个类，然后实例化。
<br />
这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性，提供给了我们降耦的手段。
<br />
<br />
[补充:]
<br />
newInstance: 弱类型。低效率。只能调用无参构造。
<br />
new: 强类型。相对高效。能调用任何public构造。
<br />
newInstance()是实现IOC、反射、面对接口编程 和 依赖倒置 等技术方法的必然选择，new 只能实现具体类的实例化，不适合于接口编程。
<br />
里面就是通过这个类的默认构造函数构建了一个对象，如果没有默认构造函数就抛出InstantiationException, 如果没有访问默认构造函数的权限就抛出IllegalAccessException
<img src ="http://www.blogjava.net/alinglau36/aggbug/348306.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alinglau36/" target="_blank">lau</a> 2011-04-14 17:37 <a href="http://www.blogjava.net/alinglau36/archive/2011/04/14/348306.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java正则表达式</title><link>http://www.blogjava.net/alinglau36/archive/2010/10/11/334448.html</link><dc:creator>lau</dc:creator><author>lau</author><pubDate>Mon, 11 Oct 2010 08:41:00 GMT</pubDate><guid>http://www.blogjava.net/alinglau36/archive/2010/10/11/334448.html</guid><wfw:comment>http://www.blogjava.net/alinglau36/comments/334448.html</wfw:comment><comments>http://www.blogjava.net/alinglau36/archive/2010/10/11/334448.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alinglau36/comments/commentRss/334448.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alinglau36/services/trackbacks/334448.html</trackback:ping><description><![CDATA[<p>小知识：{}　定义了一个范围　 [] 定义了一个字符类　() 定义了一个组 <br />
*前面出现0次以上&nbsp;&nbsp; +　前面匹配一次以上　?前面出现0次或一次</p>
<p><br />
<span style="font-size: medium; color: #0000ff;">1).字符：</span> <br />
x------字符x <br />
""-----反斜杠 <br />
"0n----十进制数 (0 &lt;= n &lt;= 7) <br />
"0nn---十进制数0nn (0 &lt;= n &lt;= 7) <br />
"0mnn--十进制数0mnn (0 &lt;= m &lt;= 3,0 &lt;= n &lt;= 7) <br />
"xhh---十六进制数 0xhh <br />
""uhhh-十六进制数 0uhhh <br />
"t-----制表符 ('"u0009') 2) <br />
"n-----换行符 ('"u000A') <br />
"r----- 回车符 ('"u000D') <br />
"e----- esc符号 ('"u001B') <br />
"cx---- x 对应的控制符 <br />
<span style="font-size: medium; color: #0000ff;">2).字符类： </span><br />
[abc] a, b, 或 c (简单字符串) <br />
[^abc] 除了 a, b, 或 c 之外的任意字符(否定) <br />
[a-zA-Z] 从a 到 z 或 从A 到 Z（包括a,z,A,Z）(范围) <br />
[a-d[m-p]] 从a 到 d, 或 从m 到 p: [a-dm-p] (并集) <br />
[a-z&amp;&amp;[def]] d, e, 或 f (交集) <br />
[a-z&amp;&amp;[^bc]] 从a 到 z, 但 b 和 c 除外: [ad-z] (子集) <br />
[a-z&amp;&amp;[^m-p]] 从a 到 z, 不包括从 m 到 p: [a-lq-z](子集) <br />
<span style="font-size: medium; color: #0000ff;">3).预定义字符序列 :</span> <br />
. 任意字符 (也可能不包括行结束符) <br />
"d 数字: [0-9] <br />
"D 非数字: [^0-9] <br />
"s 空字符: [ "t"n"x0B"f"r](A whitespace character) <br />
"S 非空字符: [^"s] <br />
"w 单字字符: [a-zA-Z_0-9] <br />
"W 非单字字符: [^"w] <br />
<span style="font-size: medium; color: #0000ff;">4).POSIX 字符类 (US-ASCII only) :</span> <br />
"p{Lower} 小写字母字符: [a-z] <br />
"p{Upper} 大写字母字符:[A-Z] <br />
"p{ASCII} 所有 ASCII:["x00-"x7F] <br />
"p{Alpha} 单个字母字符:["p{Lower}"p{Upper}] <br />
"p{Digit} 十进制数: [0-9] <br />
"p{Alnum} 单个字符:["p{Alpha}"p{Digit}] <br />
"p{Punct} 标点符号: 包括 !"#$%&amp;'()*+,-./:;&lt;=&gt;?@["]^_`{|}~ <br />
"p{Graph} 可视字符: ["p{Alnum}"p{Punct}] <br />
"p{Print} 可打印字符: ["p{Graph}] <br />
"p{Blank} 空格或制表符: [ "t] <br />
"p{Cntrl} 控制字符: ["x00-"x1F"x7F] <br />
"p{XDigit} 十六进制数: [0-9a-fA-F] <br />
"p{Space} 空字符: [ "t"n"x0B"f"r] <br />
<span style="font-size: medium; color: #0000ff;">5). Unicode 字符类:</span> <br />
"p{InGreek} 希腊语种的字符 (simple block) <br />
"p{Lu} 大写字母 (simple category) <br />
"p{Sc} 货币符号 <br />
"P{InGreek} 除希腊语种字符外的任意字符 (negation) <br />
["p{L}&amp;&amp;[^"p{Lu}]] 除大写字母外的任意字符 (subtraction) <br />
<span style="font-size: medium; color: #0000ff;">6). 边界匹配器:</span> <br />
^ 一行的开始 <br />
$ 一行的结束 <br />
"b 单词边界 <br />
"B 非单词边界 <br />
"A 输入的开始 <br />
"G 当前匹配的结束 <br />
"Z The end of the input but for the final terminator, if any <br />
"z 输入的结束 <br />
<span style="font-size: medium; color: #0000ff;">6).Greedy quantifiers 贪婪匹配量词:</span> <br />
X? X不出现或出现一次 (特殊字符"?"与{0,1}是相等的) <br />
X* X不出现或出现多次 (特殊字符"*"与{0,}是相等的) <br />
X+ X至少出现一次 (特殊字符"+"与 {1,}是相等的) <br />
X{n} X出现n次 <br />
X{n,} X至少出现n次 <br />
X{n,m} X至少出现n次，但不会超过m次 <br />
<span style="font-size: medium; color: #0000ff;">7).Reluctant quantifiers:</span> <br />
X?? X, 不出现或出现一次 <br />
X*? X, 不出现或出现多次 <br />
X+? X, 至少出现一次 <br />
X{n}? X, 出现n次 <br />
X{n,}? X, 至少出现n次 <br />
X{n,m}? X, 至少出现n次，但不会超过m次 <br />
<span style="font-size: medium; color: #0000ff;">8).Possessive quantifiers:</span> <br />
X?+ X, 不出现或出现一次 <br />
X*+ X, 不出现或出现多次 <br />
X++ X, 至少出现一次 <br />
X{n}+ X, 出现n次 <br />
X{n,}+ X, 至少出现n次 <br />
X{n,m}+ X, 至少出现n次，但不会超过m次 <br />
<span style="font-size: medium; color: #0000ff;">9).逻辑运算符:</span> <br />
XY Y跟在X后面 <br />
X|Y X 或 Y <br />
(X) X, as a capturing group <br />
<span style="font-size: medium; color: #0000ff;">10).反向引用:</span> <br />
"n Whatever the nth capturing group matched <br />
<span style="font-size: medium; color: #0000ff;">11).Quotation:</span> <br />
" 引用后面的字符 <br />
"Q 引用所有的字符直到 "E 出现 <br />
"E 结束以 "Q 开始的引用 <br />
<span style="font-size: medium; color: #0000ff;">12).Special constructs (non-capturing):</span> <br />
(?:X) X, as a non-capturing group <br />
(?idmsux-idmsux) 匹配标志开关 <br />
(?idmsux-idmsux:X) X, as a non-capturing group with the given flags on <br />
(?=X) X, via zero-width positive lookahead - off <br />
(?!X) X, via zero-width negative lookahead <br />
(? &lt;=X) X, via zero-width positive lookbehind <br />
(?(? &gt; X) X, as an independent, non-capturing group </p>
<hr />
<p><br />
<span style="font-size: medium; color: #0000ff;">1).Backslashes, escapes, and quoting</span> <br />
反
斜杠字符('"')用来转义，就像上面的表中定义的那样，如果不这样做的话可能会产生 歧义。因此，表达式""匹配
单个反斜杠，表达式"{匹配单个左花括号。 如果把反斜杠放在没有定义转移构造的任何字母符号前面都会发生错误，这些将被保留
到以后的正则表达式中扩展。反斜杠可以放在任何 非字母符号前面，即使它没有定义转义构造也不会发生错误。
在java语言规范中指出，在java代码中自符串中的反斜杠是必要的，不管用于Unicode转 义，还是用于普通的字符转义。因此，
为了保持正则表达式的完整性，在java字符串中要写两个反斜杠。例如，在正则表达式
中字符'"b'代表退格，'""b'则代表单词边界。'"(hello")'是无效的，并且会产生编译 时错误，你必须用
'""(hello"")'来匹配(hello)。 <br />
<span style="font-size: medium; color: #0000ff;">2).Character Classes</span> <br />
字符类可以出现在其他字符类内部，并且可以由并操作符和与操作符(&amp;&amp;)组成。并集操 作结果是，其中的任意字符，肯定在至少其中操作数中至少出现过一次。 交集的结果包括各个操作数中同时出现的任意字符。 <br />
字符类操作符的优先级如下：（从高到低） <br />
1 文字转义 "x <br />
2 集合 [...] <br />
3 范围 a-z <br />
4 并集 [a-e][i-u] <br />
5 交集 [a-z&amp;&amp;[aeiou]] <br />
请注意各个字符类的有效字符集。例如，在字符类中，正则表达式.失去了它的特别含义 ，而-变成了元字符的范围指示。 <br />
<span style="font-size: medium; color: #0000ff;">3).Line terminators</span> <br />
行结束符是一个或两个字符序列，用来标识输入字符序列的一行的结束。下列都被认为 是行结束符： <br />
换行符 ('"n'), <br />
回车换行符 (""r"n"), <br />
回车符 ('"r'), <br />
下一行 ('"u0085'), <br />
行分隔符 ('"u2028'), 或段分隔符 ('"u2029). <br />
如果激活了 UNIX_LINES 模式，唯一的行结束符就是换行符。 <br />
除非你指定了 DOTALL 标志，否则正则表达式.匹配任何字符，只有行结束符除外。 <br />
确省情况时，在整个输入队列中，正则表达式^和$忽略行结束符，只匹配开始和结束。 <br />
如果激活了 MULTILINE 模式，则^匹配输入的开始和所有行结束符之后，除了整个输入 的结束。 <br />
在MULTILINE 模式下，$匹配所有行结束符之前，和整个输入的结束。 <br />
</p>
<p><span style="font-size: medium; color: #0000ff;">4).Groups and capturing</span> <br />
分组捕获通过从左到右的顺序，根据括号的数量类排序。例如，在表达式((A)(B(C)))中，有四个组： <br />
1&nbsp;&nbsp;&nbsp;&nbsp; ((A)(B(C))) <br />
2&nbsp;&nbsp;&nbsp;&nbsp; (A) <br />
3&nbsp;&nbsp;&nbsp;&nbsp; (B(C)) <br />
4&nbsp;&nbsp;&nbsp;&nbsp; (C) <br />
0组代表整个表达式。 <br />
分
组捕获之所以如此命名，是因为在匹配过程中，输入序列的每一个与分组匹配的子序
列都会被保存起来。通过向后引用，被捕获的子序列可以在后面的表达式中被再次使用。而且，在匹配操作结束以后还可以通过匹配器重新找到。与一个分组关联的
被捕获到的输入通常是被保存的最近与这个分组相匹配的队列的子队列。如果一个分组被第二次求值，即使失败，它的上一次被捕获的值也会被保存起来。 <br />
例如，表达式(a(b)?)+匹配"aba"，"b"设为子分组。在开始匹配的时候，以前被捕获的输入都将被清除。以(?开始的分组是完全的，无需捕获的分组不会捕获任何文本，也不会计算分组总数。</p>
<p><span style="font-size: medium; color: #0000ff;">5).Unicode support</span> <br />
<br />
Unicode Technical Report #18: Unicode Regular Expression Guidelines通过轻微的语法改变实现了更深层次的支持。 <br />
在java代码中，像"u2014 这样的转义序列，java语言规范中？3.3提供了处理方法 。 <br />
为了便于使用从文件或键盘读取的unicode转义字符，正则表达式解析器也直接实现了这种转移。因此，字符串""u2014"与"""u2014"虽然不相等，但是编译进同一种模式，可以匹配十六进制数0x2014。 <br />
在
Perl中，unicode块和分类被写入"p,"P。如果输入有prop属性，"p{prop}将会匹配，
而"P{prop}将不会匹配。块通过前缀In指定，作为在nMongolian之中。分类通过任意的前缀Is指定： "p{L} 和 "p{IsL}
都引用 Unicode 字母。块和分类可以 被使用在字符类的内部或外部。 <br />
&nbsp; <br />
The Unicode Standard,
Version 3.0指出了支持的块和分类。块的名字在第14章和 Unicode CharacterDatabase中的
Blocks-3.txt 文件定义，但空格被剔除了。例如Basic Latin"变成了&nbsp;
"BasicLatin"。分类的名字被定义在88页，表4-5。</p>
<img src ="http://www.blogjava.net/alinglau36/aggbug/334448.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alinglau36/" target="_blank">lau</a> 2010-10-11 16:41 <a href="http://www.blogjava.net/alinglau36/archive/2010/10/11/334448.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于数组和List之间相互转换的方法</title><link>http://www.blogjava.net/alinglau36/archive/2010/04/02/317278.html</link><dc:creator>lau</dc:creator><author>lau</author><pubDate>Fri, 02 Apr 2010 03:24:00 GMT</pubDate><guid>http://www.blogjava.net/alinglau36/archive/2010/04/02/317278.html</guid><wfw:comment>http://www.blogjava.net/alinglau36/comments/317278.html</wfw:comment><comments>http://www.blogjava.net/alinglau36/archive/2010/04/02/317278.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alinglau36/comments/commentRss/317278.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alinglau36/services/trackbacks/317278.html</trackback:ping><description><![CDATA[<h1>
<a id="ctl04_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/RIVERSPIRIT/articles/1232368.html">关于数组和List之间相互转换的方法</a>
</h1>
<p>1.List转换成为数组。（这里的List是实体是ArrayList) </p>
<p>调用ArrayList的toArray方法。 </p>
<p>toArray </p>
<p>public T[] toArray(T[]
a)返回一个按照正确的顺序包含此列表中所有元素的数组；返回数组的运行时类型就是指定数组的运行时类型。如果列表能放入指定的数组，则返回放入此列表元
素的数组。否则，将根据指定数组的运行时类型和此列表的大小分配一个新的数组。 </p>
<p>如果指定的数组能容纳列表并有剩余空间（即数组的元素比列表的多），那么会将数组中紧跟在集合末尾的元素设置为 null。这对确定列表的长度很有用，但只 在调用方知道列表中不包含任何 null 元素时才有用。 </p>
<p>指定者： </p>
<p>接口 Collection 中的 toArray </p>
<p>指定者： </p>
<p>接口 List 中的 toArray </p>
<p>覆盖： </p>
<p>类 AbstractCollection 中的 toArray </p>
<p>参数： </p>
<p>a - 要存储列表元素的数组，如果它足够大的话；否则，它是一个为存储列表元素而分配的、具有相同运行时类型的新数组。 </p>
<p>返回： </p>
<p>包含列表元素的数组。 </p>
<p>抛出： </p>
<p>ArrayStoreException - 如果 a 的运行时类型不是此列表中每个元素的运行时类型的超类型。 </p>
<p><br />
具体用法： </p>
<p>List list = new ArrayList(); </p>
<p>list.add("1"); </p>
<p>list.add("2"); </p>
<p>final int size = list.size(); </p>
<p>String[] arr = (String[])list.toArray(new String[size]); </p>
<p><br />
2.数组转换成为List。 </p>
<p>调用Arrays的asList方法. </p>
<p>asList </p>
<p>public static List asList(T...
a)返回一个受指定数组支持的固定大小的列表。（对返回列表的更改会&#8220;直写&#8221;到数组。）此方法同 Collection.toArray
一起，充当了基于数组的 API 与基于 collection 的 API 之间的桥梁。返回的列表是可序列化的，并且实现了
RandomAccess。 </p>
<p>此方法还提供了一个创建固定长度的列表的便捷方法，该列表被初始化为包含多个元素： </p>
<p><br />
List stooges = Arrays.asList("Larry", "Moe", "Curly"); </p>
<p><br />
参数： </p>
<p>a - 支持列表的数组。 </p>
<p>返回： </p>
<p>指定数组的列表视图。 </p>
<p>另请参见： </p>
<p>Collection.toArray() </p>
<p><br />
具体用法: </p>
<p>String[] arr = new String[] {"1", "2"}; </p>
<p>List list = Arrays.asList(arr);&nbsp;&nbsp;</p>
<p>-------------------------------------------------------------------------------------------------------------------------------</p>
<p><strong>Arrays.asList is a feature every Java developer should know about. It'll save you from writing code like:</strong></p>
<p><strong>List&lt;Foo&gt; foolist = new ArrayList&lt;Foo&gt;();<br />
foolist.add(foo);<br />
return foolist;</strong></p>
<p><strong>or maybe</strong></p>
<p><strong>if(map.containsKey(id)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.get(id).add(foo);<br />
}else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;Foo&gt; foolist = new ArrayList&lt;Foo&gt;();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foolist.add(foo);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put(id, foo);<br />
}</strong></p>
<p><strong>and allow you to write code like:</strong></p>
<p><strong>return Arrays.asList(foo);</strong></p>
<p><strong>and</strong></p>
<p><strong>if(map.containsKey(id))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.get(id).add(foo);<br />
else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put(id, Arrays.asList(foo));</strong></p>
<p><strong>Update: I didn't notice that Arrays.asList returns a List
that can't be added too. When you try to call add on the returned List,
you'll get an UnsupportedOperationException in AbstractList.add. That
seemed lame to me, but the List interface does say that add is an
"optional operation". For the lists to be mutable, the above code
snippets have to be changed to something like:</strong></p>
<p><strong>return new ArrayList&lt;Foo&gt;(Arrays.asList(foo));</strong></p>
<p><strong>and</strong></p>
<p><strong>if(map.containsKey(id))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.get(id).add(foo);<br />
else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put(id, new ArrayList&lt;Foo&gt;(Arrays.asList(foo)));</strong></p>
<p><strong>Update: Of course, the more pathalogical example of what Arrays.asList saves you from is:</strong></p>
<p><strong>List&lt;Foo&gt; foolist = new ArrayList&lt;Foo&gt;(fooarray.length);<br />
for(int i=0,n=fooarray.length; i&lt;n; i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foolist.add(fooarray[i]);<br />
}</strong></p>
<p><strong>or</strong></p>
<p><strong>List&lt;Foo&gt; foolist = new ArrayList&lt;Foo&gt;(fooarray.length);<br />
for(Foo f : fooarray){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foolist.add(f);<br />
}</strong></p>
<p><strong>because that becomes just:</strong></p>
<p><strong>List&lt;Foo&gt; foolist = Arrays.asList(fooarray);</strong></p>
<img src ="http://www.blogjava.net/alinglau36/aggbug/317278.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alinglau36/" target="_blank">lau</a> 2010-04-02 11:24 <a href="http://www.blogjava.net/alinglau36/archive/2010/04/02/317278.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>错误汇总</title><link>http://www.blogjava.net/alinglau36/archive/2010/03/31/317100.html</link><dc:creator>lau</dc:creator><author>lau</author><pubDate>Wed, 31 Mar 2010 14:11:00 GMT</pubDate><guid>http://www.blogjava.net/alinglau36/archive/2010/03/31/317100.html</guid><wfw:comment>http://www.blogjava.net/alinglau36/comments/317100.html</wfw:comment><comments>http://www.blogjava.net/alinglau36/archive/2010/03/31/317100.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alinglau36/comments/commentRss/317100.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alinglau36/services/trackbacks/317100.html</trackback:ping><description><![CDATA[<strong>4.5.&nbsp;错误</strong><br />
<br />
java.lang.AbstractMethodError<br />
<br />
抽象方法错误。当应用试图调用抽象方法时抛出。<br />
<br />
java.lang.AssertionError<br />
<br />
断言错。用来指示一个断言失败的情况。<br />
<br />
java.lang.ClassCircularityError<br />
<br />
类循环依赖错误。在初始化一个类时，若检测到类之间循环依赖则抛出该异常。<br />
<br />
java.lang.ClassFormatError<br />
<br />
类格式错误。当Java虚拟机试图从一个文件中读取Java类，而检测到该文件的内容不符合类的有效格式时抛出。<br />
<br />
java.lang.Error<br />
<br />
错误。是所有错误的基类，用于标识严重的程序运行问题。这些问题通常描述一些不应被应用程序捕获的反常情况。<br />
<br />
java.lang.ExceptionInInitializerError<br />
<br />
初始化程序错误。当执行一个类的静态初始化程序的过程中，发生了异常时抛出。静态初始化程序是指直接包含于类中的static语句段。<br />
<br />
java.lang.IllegalAccessError<br />
<br />
违法访问错误。当一个应用试图访问、修改某个类的域（Field）或者调用其方法，但是又违反域或方法的可见性声明，则抛出该异常。<br />
<br />
java.lang.IncompatibleClassChangeError<br />
<br />
不兼容的类变化错误。当正在执行的方法所依赖的类定义发生了不兼容的改变时，抛出该异常。一般在修改了应用中的某些类的声明定义而没有对整个应用重新编译而直接运行的情况下，容易引发该错误。<br />
<br />
java.lang.InstantiationError<br />
<br />
实例化错误。当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出该异常.<br />
<br />
java.lang.InternalError<br />
<br />
内部错误。用于指示Java虚拟机发生了内部错误。<br />
<br />
java.lang.LinkageError<br />
<br />
链接错误。该错误及其所有子类指示某个类依赖于另外一些类，在该类编译之后，被依赖的类改变了其类定义而没有重新编译所有的类，进而引发错误的情况。<br />
<br />
java.lang.NoClassDefFoundError<br />
<br />
未找到类定义错误。当Java虚拟机或者类装载器试图实例化某个类，而找不到该类的定义时抛出该错误。<br />
<br />
java.lang.NoSuchFieldError<br />
<br />
域不存在错误。当应用试图访问或者修改某类的某个域，而该类的定义中没有该域的定义时抛出该错误。<br />
<br />
java.lang.NoSuchMethodError<br />
<br />
方法不存在错误。当应用试图调用某类的某个方法，而该类的定义中没有该方法的定义时抛出该错误。<br />
<br />
java.lang.OutOfMemoryError<br />
<br />
内存不足错误。当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。<br />
<br />
java.lang.StackOverflowError<br />
<br />
堆栈溢出错误。当一个应用递归调用的层次太深而导致堆栈溢出时抛出该错误。<br />
<br />
java.lang.ThreadDeath<br />
<br />
线程结束。当调用Thread类的stop方法时抛出该错误，用于指示线程结束。<br />
<br />
java.lang.UnknownError<br />
<br />
未知错误。用于指示Java虚拟机发生了未知严重错误的情况。<br />
<br />
java.lang.UnsatisfiedLinkError<br />
<br />
未满足的链接错误。当Java虚拟机未找到某个类的声明为native方法的本机语言定义时抛出。<br />
<br />
java.lang.UnsupportedClassVersionError<br />
<br />
不支持的类版本错误。当Java虚拟机试图从读取某个类文件，但是发现该文件的主、次版本号不被当前Java虚拟机支持的时候，抛出该错误。<br />
<br />
java.lang.VerifyError<br />
<br />
验证错误。当验证器检测到某个类文件中存在内部不兼容或者安全问题时抛出该错误。<br />
<br />
java.lang.VirtualMachineError<br />
<br />
虚拟机错误。用于指示虚拟机被破坏或者继续执行操作所需的资源不足的情况。<br />
<strong>4.6.&nbsp;注解符号类型</strong><br />
<br />
java.lang.Deprecated<br />
<br />
被废弃。用于指示出于安全或者有了更好的替代方案等原因而不鼓励再使用的程序元素。当使用或者在未废弃的代码中覆盖被声明为Deprecated的程序元素时，编译器会发出警告。<br />
<br />
java.lang.Override<br />
<br />
覆盖。用于指示某个类的方法被声明为要求覆盖其父类的同一方法的情况。如果一个方法被声明覆盖类型，而没有真正覆盖其父类的同一方法，那么编译器必须产生一个错误信息。<br />
<br />
java.lang.SuppressWarnings<br />
<br />
消除警告。用于指示在被注解的程序元素中消除某些特定的命名警告。该注解大多用于深深地被嵌套的元素上。
<img src ="http://www.blogjava.net/alinglau36/aggbug/317100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alinglau36/" target="_blank">lau</a> 2010-03-31 22:11 <a href="http://www.blogjava.net/alinglau36/archive/2010/03/31/317100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java enum 学习</title><link>http://www.blogjava.net/alinglau36/archive/2009/12/21/306821.html</link><dc:creator>lau</dc:creator><author>lau</author><pubDate>Mon, 21 Dec 2009 08:41:00 GMT</pubDate><guid>http://www.blogjava.net/alinglau36/archive/2009/12/21/306821.html</guid><wfw:comment>http://www.blogjava.net/alinglau36/comments/306821.html</wfw:comment><comments>http://www.blogjava.net/alinglau36/archive/2009/12/21/306821.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alinglau36/comments/commentRss/306821.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alinglau36/services/trackbacks/306821.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 关键字: java enum            在像C这样强调数据结构的语言里，枚举是必不可少的一种数据类型。然而在java的早期版本中，是没有一种叫做enum的独立数据结构的。所以在以前的java版本中，我们经常使用interface来simulate一个enum。 java 代码    public&nbsp;interface&nbsp;Color&nbsp;{ &nbs...&nbsp;&nbsp;<a href='http://www.blogjava.net/alinglau36/archive/2009/12/21/306821.html'>阅读全文</a><img src ="http://www.blogjava.net/alinglau36/aggbug/306821.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alinglau36/" target="_blank">lau</a> 2009-12-21 16:41 <a href="http://www.blogjava.net/alinglau36/archive/2009/12/21/306821.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网络编程之同步，阻塞，异步，非阻塞</title><link>http://www.blogjava.net/alinglau36/archive/2009/06/11/281399.html</link><dc:creator>lau</dc:creator><author>lau</author><pubDate>Thu, 11 Jun 2009 03:26:00 GMT</pubDate><guid>http://www.blogjava.net/alinglau36/archive/2009/06/11/281399.html</guid><wfw:comment>http://www.blogjava.net/alinglau36/comments/281399.html</wfw:comment><comments>http://www.blogjava.net/alinglau36/archive/2009/06/11/281399.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alinglau36/comments/commentRss/281399.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alinglau36/services/trackbacks/281399.html</trackback:ping><description><![CDATA[<p><font color="#ff0000">答案一：<br />
</font>1.异步传输 <br />
<br />
通常，异步传输是以字符为传输单位，每个字
符都要附加 1 位起始位和 1
位停止位，以标记一个字符的开始和结束，并以此实现数据传输同步。所谓异步传输是指字符与字符(一个字符结束到下一个字符开始)之间的时间间隔是可变的，
并不需要严格地限制它们的时间关系。起始位对应于二进制值 0，以低电平表示，占用 1 位宽度。停止位对应于二进制值 1，以高电平表示，占用
1~2 位宽度。一个字符占用 5~8位，具体取决于数据所采用的字符集。例如，电报码字符为 5 位、ASCII码字符为 7 位、汉字码则为8
位。此外，还要附加 1
位奇偶校验位，可以选择奇校验或偶校验方式对该字符实施简单的差错控制。发送端与接收端除了采用相同的数据格式(字符的位数、停止位的位数、有无校验位及
校验方式等)外，还应当采用相同的传输速率。典型的速率有：9 600 b/s、19.2kb/s、56kb/s等。 <br />
<br />
异步传输又称为
起止式异步通信方式，其优点是简单、可靠，适用于面向字符的、低速的异步通信场合。例如，计算机与Modem之间的通信就是采用这种方式。它的缺点是通信
开销大，每传输一个字符都要额外附加2～3位，通信效率比较低。例如，在使用Modem上网时，普遍感觉速度很慢，除了传输速率低之外，与通信开销大、通
信效率低也密切相关。 <br />
<br />
<br />
-------------------------------------------------------------------------------- <br />
<br />
2. 同步传输 <br />
<br />
通
常，同步传输是以数据块为传输单位。每个数据块的头部和尾部都要附加一个特殊的字符或比特序列，标记一个数据块的开始和结束，一般还要附加一个校验序列
(如16位或32位CRC校验码)，以便对数据块进行差错控制。所谓同步传输是指数据块与数据块之间的时间间隔是固定的，必须严格地规定它们的时间关
系。&nbsp;<br />
<br />
<font color="#ff0000">答案二：<br />
</font><font color="#000000">请讲详细一些，本人比较弱智，谢谢各位 &nbsp;<br />
--------------------------------------------------------------- &nbsp;<br />
&nbsp;<br />
同步是阻塞模式，异步是非阻塞模式。 &nbsp;<br />
--------------------------------------------------------------- &nbsp;<br />
&nbsp;<br />
我的理解：同步是指两个线程的运行是相关的，其中一个线程要阻塞等待另外一个线程的运行。异步的意思是两个线程毫无相关，自己运行自己的。 &nbsp;<br />
&nbsp;<br />
不知对错？楼下说 &nbsp;<br />
--------------------------------------------------------------- &nbsp;<br />
&nbsp;<br />
同步是指：发送方发出数据后，等接收方发回响应以后才发下一个数据包的通讯方式。 &nbsp;<br />
异步是指：发送方发出数据后，不等接收方发回响应，接着发送下个数据包的通讯方式。 &nbsp;<br />
&nbsp;<br />
CSDN上有讨论过: &nbsp;<br />
http://expert.csdn.net/Expert/topic/2646/2646592.xml?temp=.3842584 &nbsp;<br />
http://expert.csdn.net/Expert/topic/2659/2659726.xml?temp=.1480219 &nbsp;<br />
--------------------------------------------------------------- &nbsp;<br />
&nbsp;<br />
举个不太恰当的例子,就像: &nbsp;<br />
SendMessage(...) &nbsp;<br />
TRACE0("just &nbsp;like &nbsp;send"); &nbsp;<br />
&nbsp;<br />
PostMessage(...) &nbsp;<br />
TRACE0("just &nbsp;like &nbsp;WSASend &nbsp;using &nbsp;overlapped"); &nbsp;<br />
&nbsp;<br />
SendMessage是调用的时候不返回,等消息响应后才执行TRACE0,这就是同步. &nbsp;<br />
PostMessage是调用后马上返回,不用消息响应就执行TRACE0,这就是异步.<br />
<br />
<font color="#ff0000">答案三：<br />
</font>
</font></p>
<div><font color="#000000"><a href="mhtml:%3E%3Cimg%20height=" return=""  bbimg(this)?="" 13?="" src="mhtml:%20onmousewheel=" onload="javascript :if(this.width border='0' title='点击在新窗口查看原始图片' onload='java_script_:if(this.width>500)this.width=500'>screen.width-500)this.style.width=screen.width-500;">&nbsp;同步和异步的区别</a> </font></div>
<p><font color="#000000">&nbsp;举个例子：普通B/S模式（同步）AJAX技术（异步）<br />
同步：提交请求-&gt;等待服务器处理-&gt;处理完毕返回 这个期间客户端浏览器不能干任何事<br />
异步: 请求通过事件触发-&gt;服务器处理（这是浏览器仍然可以作其他事情）-&gt;处理完毕<br />
--------------------------------------------------------------------------------------------------------------------<br />
同步就是你叫我去吃饭，我听到了就和你去吃饭；如果没有听到，你就不停的叫，直到我告诉你听到了，才一起去吃饭。<br />
异步就是你叫我，然后自己去吃饭，我得到消息后可能立即走，也可能等到下班才去吃饭。</font></p>
<p><font color="#000000">所以，要我请你吃饭就用同步的方法，要请我吃饭就用异步的方法，这样你可以省钱。<br />
--------------------------------------------------------------------------------------------------------------------<br />
举个例子 打电话时同步 发消息是异步</font></p>
<p><font color="#000000"><br />
</font></p>
<p>同步：函数没有执行完不返回，线程被挂起 </p>
<p>阻塞：没有收完数据函数不返回，线程也被挂起</p>
<p>异步：函数立即返回，通过事件或是信号通知调用者</p>
<p>非阻塞：函数立即返回，通过select通知调用者</p>
<p>这样看来异步和非阻塞有什么区别呢？</p>
<p>异步=非阻塞？</p>
<p>同步是在操作系统层面上，阻塞是在套接字上？</p>
<p>Reactor是同步 Proactor是异步？</p>
<p><strong>回答：</strong></p>
<p>同步、异步、阻塞和非阻塞的概念</p>
<p>　　在进行网络编程时，我们常常见到同步、异步、阻塞和非阻塞四种调用方式。这些方式彼此概念并不好理解。下面是我对这些术语的理解。</p>
<p><strong>同步</strong><br />
所谓同步，就是在发出一个功能调用时，在没有得到结果之前，该调用就不返回。按照这个定义，其
实绝大多数函数都是同步调用（例如sin,
isdigit等）。但是一般而言，我们在说同步、异步的时候，特指那些需要其他部件协作或者需要一定时间完成的任务。最常见的例子就是
SendMessage。该函数发送一个消息给某个窗口，在对方处理完消息之前，这个函数不返回。当对方处理完毕以后，该函数才把消息处理函数所返回的
LRESULT值返回给调用者。</p>
<p><strong>异步</strong><br />
异步的概念和同步相对。当一个异步过程调用发出后，调用者不能立刻得到结果。实际处理这个调用
的部件在完成后，通过状态、通知和回调来通知调用者。以
CAsycSocket类为例（注意，CSocket从CAsyncSocket派生，但是起功能已经由异步转化为同步），当一个客户端通过调用
Connect函数发出一个连接请求后，调用者线程立刻可以朝下运行。当连接真正建立起来以后，socket底层会发送一个消息通知该对象。这里提到执行
部件和调用者通过三种途径返回结果：状态、通知和回调。可以使用哪一种依赖于执行部件的实现，除非执行部件提供多种选择，否则不受调用者控制。如果执行部
件用状态来通知，那么调用者就需要每隔一定时间检查一次，效率就很低（有些初学多线程编程的人，总喜欢用一个循环去检查某个变量的值，这其实是一种很严重
的错误）。如果是使用通知的方式，效率则很高，因为执行部件几乎不需要做额外的操作。至于回调函数，其实和通知没太多区别。</p>
<p><strong>阻塞</strong><br />
阻塞调用是指调用结果返回之前，当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许
会把阻塞调用和同步调用等同起来，实际上他是不同的。对于同
步调用来说，很多时候当前线程还是激活的，只是从逻辑上当前函数没有返回而已。例如，我们在CSocket中调用Receive函数，如果缓冲区中没有数
据，这个函数就会一直等待，直到有数据才返回。而此时，当前线程还会继续处理各种各样的消息。如果主窗口和调用函数在同一个线程中，除非你在特殊的界面操
作函数中调用，其实主界面还是应该可以刷新。socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候，
如果没有数据的情况下调用该函数，则当前线程就会被挂起，直到有数据为止。</p>
<p><strong>非阻塞</strong><br />
非阻塞和阻塞的概念相对应，指在不能立刻得到结果之前，该函数不会阻塞当前线程，而会立刻返回。</p>
<p>　　对象的阻塞模式和阻塞函数调用<br />
对象是否处于阻塞模式和函数是不是阻塞调用有很强的相关性，但是并不是一一对应的。阻塞对象上可以有
非阻塞的调用方式，我们可以通过一定的API去轮询状
态，在适当的时候调用阻塞函数，就可以避免阻塞。而对于非阻塞对象，调用特殊的函数也可以进入阻塞调用。函数select就是这样的一个例子。</p>
<img src ="http://www.blogjava.net/alinglau36/aggbug/281399.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alinglau36/" target="_blank">lau</a> 2009-06-11 11:26 <a href="http://www.blogjava.net/alinglau36/archive/2009/06/11/281399.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>StringUtils工具类的常用方法</title><link>http://www.blogjava.net/alinglau36/archive/2009/04/10/264885.html</link><dc:creator>lau</dc:creator><author>lau</author><pubDate>Fri, 10 Apr 2009 09:03:00 GMT</pubDate><guid>http://www.blogjava.net/alinglau36/archive/2009/04/10/264885.html</guid><wfw:comment>http://www.blogjava.net/alinglau36/comments/264885.html</wfw:comment><comments>http://www.blogjava.net/alinglau36/archive/2009/04/10/264885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alinglau36/comments/commentRss/264885.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alinglau36/services/trackbacks/264885.html</trackback:ping><description><![CDATA[<div>
<h3 title="随笔"><a href="/blog/148313">StringUtils工具类的常用方法</a></h3>
<strong>关键字: stringutils</strong> </div>
<div>
<p><span style="font-family: verdana,geneva;">StringUtils 方法的操作对象是 <span style="font-family: verdana,geneva;">java.lang.String</span> 类型的对象，是 <span style="font-family: verdana,geneva;">JDK</span> 提供的 <span style="font-family: verdana,geneva;">String</span> 类型操作方法的补充，并且是 <span style="font-family: verdana,geneva;">null</span> 安全的(即如果输入参数 <span style="font-family: verdana,geneva;">String</span> 为 <span style="font-family: verdana,geneva;">null</span> 则不会抛出&nbsp; <span style="font-family: verdana,geneva;">NullPointerException</span>
，而是做了相应处理，例如，如果输入为 <span style="font-family: verdana,geneva;">null</span> 则返回也是
<span style="font-family: verdana,geneva;">null</span>
等，具体可以查看源代码)。<br />
<br />
除了构造器，<span style="font-family: verdana,geneva;">StringUtils</span> 中一共有130多个方法，并且都是 <span style="font-family: verdana,geneva;">static</span> 的，所以我们可以这样调用 <span style="font-family: verdana,geneva;">StringUtils.xxx()</span>
<br />
<br />
下面分别对一些常用方法做简要介绍：<br />
<br />
<span style="font-family: verdana,geneva;">1.
<span style="color: #0000ff;">public static boolean isEmpty(String str)</span>
</span><br />
&nbsp;&nbsp; 判断某字符串是否为空，为空的标准是 <span style="font-family: verdana,geneva;">str==null</span> 或 <span style="font-family: verdana,geneva;">str.length()==0</span> <br />
&nbsp;&nbsp; 下面是 <span style="font-family: verdana,geneva;">StringUtils</span> 判断是否为空的示例：</span> </p>
<p style="padding-left: 30px;"><span style="font-family: arial,helvetica,sans-serif;"><span style="color: #800000;"><span>StringUtils.isEmpty(null) =
true<br />
StringUtils.isEmpty("") = true</span>
<br />
<span style="color: #800000;">StringUtils.isEmpty(" ") = false</span> </span>//注意在 <span style="font-family: verdana,geneva;">StringUtils</span> 中空格作非空处理<br />
<span style="font-family: arial,helvetica,sans-serif;"><span style="color: #800000;">StringUtils.isEmpty("&nbsp;&nbsp; ") =
false<br />
StringUtils.isEmpty("bob") = false<br />
StringUtils.isEmpty(" bob ") = false</span>
</span></span></p>
<p><span style="font-family: verdana,geneva;">2.<span style="color: #0000ff;"> public static boolean isNotEmpty(String str)
</span><br />
&nbsp;&nbsp; 判断某字符串是否非空，等于 <span style="color: #0000ff; font-family: verdana,geneva;">!isEmpty(String str)</span>
<br />
&nbsp;&nbsp; 下面是示例：</span> </p>
<p><span style="color: #800000; font-family: arial,helvetica,sans-serif;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringUtils.isNotEmpty(null) = false<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringUtils.isNotEmpty("") = false<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringUtils.isNotEmpty(" ") = true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringUtils.isNotEmpty("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ") = true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringUtils.isNotEmpty("bob") = true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringUtils.isNotEmpty(" bob ") = true <br />
<br />
<span style="font-family: verdana,geneva;">3. <span style="color: #0000ff;">public
static boolean isBlank(String str)</span> </span><br />
&nbsp;&nbsp;
判断某字符串是否为空或长度为0或由空白符<span style="font-family: verdana,geneva;">(whitespace)</span> 构成<br />
&nbsp;&nbsp; 下面是示例：<br />
<span style="color: #800000; font-family: arial,helvetica,sans-serif;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringUtils.isBlank(null) = true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringUtils.isBlank("") = true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringUtils.isBlank(" ") = true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringUtils.isBlank("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ") = true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringUtils.isBlank(""t "n "f "r") = true</span> &nbsp;
//对于制表符、换行符、换页符和回车符</span> </p>
<p><span style="color: #800000; font-family: arial,helvetica,sans-serif;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringUtils.isBlank() &nbsp; //均识为空白符<br />
<span style="color: #800000; font-family: arial,helvetica,sans-serif;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringUtils.isBlank(""b") = false</span> &nbsp;
//""b"为单词边界符<br />
<span style="color: #800000; font-family: arial,helvetica,sans-serif;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringUtils.isBlank("bob") = false<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringUtils.isBlank(" bob ") = false</span> <br />
<br />
<span style="font-family: verdana,geneva;">4. <span style="color: #0000ff;">public
static boolean isNotBlank(String str)</span> </span><br />
&nbsp;&nbsp;
判断某字符串是否不为空且长度不为0且不由空白符<span style="font-family: verdana,geneva;">(whitespace)</span> 构成，等于 <span style="font-family: verdana,geneva;">!isBlank(String str)</span> <br />
&nbsp;&nbsp;
下面是示例：</span> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.isNotBlank(null) = false<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.isNotBlank("") = false<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.isNotBlank(" ") = false<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.isNotBlank("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ") =
false<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.isNotBlank(""t "n "f "r") =
false<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.isNotBlank(""b") = true<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.isNotBlank("bob") = true<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.isNotBlank(" bob ") = true <br />
<br />
<span style="font-family: verdana,geneva;">5. <span style="color: #0000ff;">public
static String trim(String str)</span> </span><br />
&nbsp;&nbsp; 去掉字符串两端的控制符<span style="font-family: verdana,geneva;">(control characters, char &lt;= 32)</span> ,
如果输入为 <span style="font-family: verdana,geneva;">null</span> 则返回<span style="font-family: verdana,geneva;">null</span> <br />
&nbsp;&nbsp; 下面是示例：<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.trim(null) = null<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.trim("") = ""<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.trim(" ") = ""<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.trim("&nbsp; "b "t "n "f "r&nbsp;&nbsp;&nbsp; ") =
""<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.trim("&nbsp;&nbsp;&nbsp;&nbsp; "n"tss&nbsp;&nbsp; "b") =
"ss"<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.trim(" d&nbsp;&nbsp; d dd&nbsp;&nbsp;&nbsp;&nbsp; ") = "d&nbsp;&nbsp; d
dd"<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.trim("dd&nbsp;&nbsp;&nbsp;&nbsp; ") = "dd"<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.trim("&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ") = "dd"
<br />
<br />
<span style="font-family: verdana,geneva;">6. <span style="color: #0000ff;">public static String trimToNull(String str)</span>
</span><br />
&nbsp;&nbsp; 去掉字符串两端的控制符<span style="font-family: verdana,geneva;">(control
characters, char &lt;= 32)</span> ,如果变为 <span style="font-family: verdana,geneva;">null</span> 或""，则返回 <span style="font-family: verdana,geneva;">null</span> <br />
&nbsp;&nbsp; 下面是示例：<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.trimToNull(null) = null<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.trimToNull("") = null<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.trimToNull(" ") = null<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.trimToNull("&nbsp;&nbsp;&nbsp;&nbsp; "b "t "n "f "r&nbsp;&nbsp;&nbsp; ") =
null<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.trimToNull("&nbsp;&nbsp;&nbsp;&nbsp; "n"tss&nbsp;&nbsp; "b") =
"ss"<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.trimToNull(" d&nbsp;&nbsp; d dd&nbsp;&nbsp;&nbsp;&nbsp; ") = "d&nbsp;&nbsp; d
dd"<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.trimToNull("dd&nbsp;&nbsp;&nbsp;&nbsp; ") =
"dd"<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.trimToNull("&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ") = "dd"
<br />
<br />
<span style="color: #0000ff; font-family: verdana,geneva;"><span style="color: #000000;">7.</span> public static String trimToEmpty(String
str)</span> <br />
&nbsp;&nbsp; 去掉字符串两端的控制符<span style="font-family: verdana,geneva;">(control
characters, char &lt;= 32)</span> ,如果变为 <span style="font-family: verdana,geneva;">null</span> 或 <span style="font-family: verdana,geneva;">""</span> ，则返回<span style="font-family: verdana,geneva;"> ""</span> <br />
&nbsp;&nbsp; 下面是示例：<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="font-size: small; font-family: arial,helvetica,sans-serif;"><span style="color: #800000;">StringUtils.trimToEmpty(null)
= ""<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: small; font-family: arial,helvetica,sans-serif;"><span style="color: #800000;">StringUtils.trimToEmpty("") =
""<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: small; font-family: arial,helvetica,sans-serif;"><span style="color: #800000;">StringUtils.trimToEmpty(" ") =
""<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: small; font-family: arial,helvetica,sans-serif;"><span style="color: #800000;">StringUtils.trimToEmpty("&nbsp;&nbsp;&nbsp;&nbsp;
"b "t "n "f "r&nbsp;&nbsp;&nbsp; ") = ""<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: small; font-family: arial,helvetica,sans-serif;"><span style="color: #800000;">StringUtils.trimToEmpty("&nbsp;&nbsp;&nbsp;&nbsp;
"n"tss&nbsp;&nbsp; "b") = "ss"<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: small; font-family: arial,helvetica,sans-serif;"><span style="color: #800000;">StringUtils.trimToEmpty(" d&nbsp;&nbsp;
d dd&nbsp;&nbsp;&nbsp;&nbsp; ") = "d&nbsp;&nbsp; d dd"<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: small; font-family: arial,helvetica,sans-serif;"><span style="color: #800000;">StringUtils.trimToEmpty("dd&nbsp;&nbsp;&nbsp;&nbsp; ") =
"dd"<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.trimToEmpty("&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ") = "dd"
<br />
<span style="font-family: verdana,geneva;"><br />
8. <span style="color: #0000ff;">public static String strip(String str)</span>
</span><br />
&nbsp;&nbsp; 去掉字符串两端的空白符<span style="color: #0000ff; font-family: verdana,geneva;">(whitespace)</span> ，如果输入为
<span style="font-family: verdana,geneva;">null</span> 则返回 <span style="font-family: verdana,geneva;">null</span> <br />
&nbsp;&nbsp; 下面是示例(注意和<span style="color: #0000ff; font-family: verdana,geneva;"> trim()</span>
的区别)：<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.strip(null) = null<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.strip("") = ""<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.strip(" ") = ""<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.strip("&nbsp;&nbsp;&nbsp;&nbsp; "b "t "n "f "r&nbsp;&nbsp;&nbsp; ") =
""b"<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.strip("&nbsp;&nbsp;&nbsp;&nbsp; "n"tss&nbsp;&nbsp; "b") = "ss&nbsp;&nbsp;
"b"<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.strip(" d&nbsp;&nbsp; d dd&nbsp;&nbsp;&nbsp;&nbsp; ") = "d&nbsp;&nbsp; d
dd"<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.strip("dd&nbsp;&nbsp;&nbsp;&nbsp; ") = "dd"<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.strip("&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ") = "dd"
<br />
<br />
<span style="font-family: verdana,geneva;">9. <span style="color: #0000ff;">public static String stripToNull(String str)</span>
</span><br />
&nbsp;&nbsp; 去掉字符串两端的空白符<span style="color: #0000ff; font-family: verdana,geneva;">(whitespace)</span> ，如果变为
<span style="font-family: verdana,geneva;">null</span> 或""，则返回<span style="font-family: verdana,geneva;"> null</span> <br />
&nbsp;&nbsp; 下面是示例(注意和 <span style="color: #0000ff; font-family: verdana,geneva;">trimToNull()</span>
的区别)：<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.stripToNull(null) = null<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.stripToNull("") = null<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.stripToNull(" ") = null<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.stripToNull("&nbsp;&nbsp;&nbsp;&nbsp; "b "t "n "f "r&nbsp;&nbsp;&nbsp; ") =
""b"<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.stripToNull("&nbsp;&nbsp;&nbsp;&nbsp; "n"tss&nbsp;&nbsp; "b") = "ss&nbsp;&nbsp;
"b"<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.stripToNull(" d&nbsp;&nbsp; d dd&nbsp;&nbsp;&nbsp;&nbsp; ") = "d&nbsp;&nbsp; d
dd"<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.stripToNull("dd&nbsp;&nbsp;&nbsp;&nbsp; ") =
"dd"<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.stripToNull("&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ") = "dd"
<br />
<br />
<span style="font-family: verdana,geneva;">10. <span style="color: #0000ff;">public static String stripToEmpty(String str)</span>
</span><br />
&nbsp;&nbsp;&nbsp; 去掉字符串两端的空白符<span style="color: #0000ff; font-family: verdana,geneva;">(whitespace)</span>
，如果变为<span style="font-family: verdana,geneva;"> null</span> 或<span style="font-family: verdana,geneva;">""</span> ，则返回<span style="font-family: verdana,geneva;">""</span> <br />
&nbsp;&nbsp;&nbsp; 下面是示例(注意和 <span style="font-family: verdana,geneva;">trimToEmpty()</span> 的区别)：<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.stripToNull(null) = ""<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.stripToNull("") = ""<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.stripToNull(" ") = ""<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.stripToNull("&nbsp;&nbsp;&nbsp;&nbsp; "b "t "n "f "r&nbsp;&nbsp;&nbsp; ") =
""b"<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.stripToNull("&nbsp;&nbsp;&nbsp;&nbsp; "n"tss&nbsp;&nbsp; "b") = "ss&nbsp;&nbsp;
"b"<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.stripToNull(" d&nbsp;&nbsp; d dd&nbsp;&nbsp;&nbsp;&nbsp; ") = "d&nbsp;&nbsp; d
dd"<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.stripToNull("dd&nbsp;&nbsp;&nbsp;&nbsp; ") =
"dd"<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.stripToNull("&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ") = "dd"
<br />
<br />
以下方法只介绍其功能，不再举例：<br />
<span style="font-family: verdana,geneva;">11. <span style="color: #0000ff;">public static String strip(String str, String
stripChars)</span> </span><br />
&nbsp;&nbsp; 去掉 <span style="font-family: verdana,geneva;">str</span> 两端的在 <span style="font-family: verdana,geneva;">stripChars</span> 中的字符。<br />
&nbsp;&nbsp; 如果 <span style="font-family: verdana,geneva;">str</span> 为 <span style="font-family: verdana,geneva;">null</span> 或等于<span style="font-family: verdana,geneva;">""</span> ，则返回它本身；<br />
&nbsp;&nbsp; 如果 <span style="font-family: verdana,geneva;">stripChars</span> 为 <span style="font-family: verdana,geneva;">null</span> 或<span style="font-family: verdana,geneva;">""</span> ，则返回 <span style="font-family: verdana,geneva;">strip(String str)</span> 。<br />
<br />
<span style="font-family: verdana,geneva;">12. <span style="color: #0000ff;">public
static String stripStart(String str, String stripChars)</span> </span><br />
&nbsp;&nbsp;&nbsp;
和11相似，去掉<span style="font-family: verdana,geneva;"> str</span> 前端的在 <span style="font-family: verdana,geneva;">stripChars</span> 中的字符。<br />
<br />
<span style="font-family: verdana,geneva;">13. <span style="color: #0000ff;">public
static String stripEnd(String str, String stripChars)</span> </span><br />
&nbsp;&nbsp;&nbsp;
和11相似，去掉 <span style="font-family: verdana,geneva;">str </span>末端的在 <span style="font-family: verdana,geneva;">stripChars</span> 中的字符。<br />
<br />
<span style="font-family: verdana,geneva;">14. <span style="color: #0000ff;">public
static String[] stripAll(String[] strs)</span> </span><br />
&nbsp;&nbsp;&nbsp; 对字符串数组中的每个字符串进行
<span style="font-family: verdana,geneva;">strip(String str)</span> ，然后返回。<br />
&nbsp;&nbsp;&nbsp;
如果 <span style="font-family: verdana,geneva;">strs</span> 为 <span style="font-family: verdana,geneva;">null</span> 或 <span style="font-family: verdana,geneva;">strs</span> 长度为0，则返回 <span style="font-family: verdana,geneva;">strs</span> 本身<br />
<br />
<span style="font-family: verdana,geneva;">15. <span style="color: #0000ff;">public
static String[] stripAll(String[] strs, String stripChars)</span> </span><br />
&nbsp;&nbsp;&nbsp;
对字符串数组中的每个字符串进行 <span style="color: #0000ff; font-family: verdana,geneva;">strip(String str, String
stripChars)</span> ，然后返回。<br />
&nbsp;&nbsp;&nbsp; 如果 <span style="font-family: verdana,geneva;">strs </span>为 <span style="font-family: verdana,geneva;">null</span> 或 <span style="font-family: verdana,geneva;">strs</span> 长度为0，则返回 <span style="font-family: verdana,geneva;">strs</span> 本身<br />
<br />
<span style="font-family: verdana,geneva;">16. <span style="color: #0000ff;">public
static boolean equals(String str1, String str2)</span> </span><br />
&nbsp;&nbsp;&nbsp;
比较两个字符串是否相等，如果两个均为空则也认为相等。<br />
<br />
<span style="font-family: verdana,geneva;">17.<span style="color: #0000ff;"> public
static boolean equalsIgnoreCase(String str1, String str2)</span> </span><br />
&nbsp;&nbsp;&nbsp;
比较两个字符串是否相等，不区分大小写，如果两个均为空则也认为相等。<br />
<br />
<span style="color: #000000; font-family: verdana,geneva;">18. <span style="color: #0000ff;">public static int indexOf(String str, char
searchChar)</span> </span><br />
&nbsp;&nbsp;&nbsp; 返回字符 searchChar 在字符串 <span style="font-family: verdana,geneva;">str</span> 中第一次出现的位置。<br />
&nbsp;&nbsp;&nbsp; 如果 <span style="font-family: verdana,geneva;">searchChar</span> 没有在 <span style="font-family: verdana,geneva;">str</span> 中出现则返回-1，<br />
&nbsp;&nbsp;&nbsp; 如果 <span style="font-family: verdana,geneva;">str</span> 为 <span style="font-family: verdana,geneva;">null</span> 或 <span style="font-family: verdana,geneva;">""</span> ，则也返回-1<br />
<br />
<span style="font-family: verdana,geneva;">19. <span style="color: #0000ff;">public
static int indexOf(String str, char searchChar, int startPos)</span>
</span><br />
&nbsp;&nbsp;&nbsp; 返回字符 <span style="font-family: verdana,geneva;">searchChar</span>
从 <span style="font-family: verdana,geneva;">startPos</span> 开始在字符串 <span style="font-family: verdana,geneva;">str</span> 中第一次出现的位置。<br />
&nbsp;&nbsp;&nbsp; 如果从 <span style="font-family: verdana,geneva;">startPos</span> 开始 <span style="font-family: verdana,geneva;">searchChar</span> 没有在<span style="font-family: verdana,geneva;"> str</span> 中出现则返回-1，<br />
&nbsp;&nbsp;&nbsp; 如果 <span style="font-family: verdana,geneva;">str</span> 为 <span style="font-family: verdana,geneva;">null</span> 或 <span style="font-family: verdana,geneva;">""</span> ，则也返回-1<br />
<br />
<span style="font-family: verdana,geneva;">20. <span style="color: #0000ff;">public
static int indexOf(String str, String searchStr)</span> </span><br />
&nbsp;&nbsp;&nbsp; 返回字符串
<span style="font-family: verdana,geneva;">searchStr </span>在字符串 <span style="font-family: verdana,geneva;">str</span> 中第一次出现的位置。<br />
&nbsp;&nbsp;&nbsp; 如果 <span style="font-family: verdana,geneva;">str</span> 为 <span style="font-family: verdana,geneva;">null</span> 或 <span style="font-family: verdana,geneva;">searchStr</span> 为 <span style="font-family: verdana,geneva;">null</span> 则返回-1，<br />
&nbsp;&nbsp;&nbsp; 如果 <span style="font-family: verdana,geneva;">searchStr</span> 为 <span style="font-family: verdana,geneva;">""</span> ,且<span style="font-family: verdana,geneva;"> str </span>为不为 <span style="font-family: verdana,geneva;">null</span> ，则返回0，<br />
&nbsp;&nbsp;&nbsp; 如果 <span style="font-family: verdana,geneva;">searchStr</span> 不在<span style="font-family: verdana,geneva;"> str</span> 中，则返回-1<br />
<br />
<span style="font-family: verdana,geneva;">21. <span style="color: #0000ff;">public
static int ordinalIndexOf(String str, String searchStr, int ordinal)</span>
</span><br />
&nbsp;&nbsp;&nbsp; 返回字符串 <span style="font-family: verdana,geneva;">searchStr</span>
在字符串 <span style="font-family: verdana,geneva;">str</span> 中第 <span style="font-family: verdana,geneva;">ordinal</span> 次出现的位置。<br />
&nbsp;&nbsp;&nbsp; 如果 <span style="font-family: verdana,geneva;">str=null</span> 或 <span style="font-family: verdana,geneva;">searchStr=null</span> 或 <span style="font-family: verdana,geneva;">ordinal&lt;=0</span> 则返回-1<br />
&nbsp;&nbsp;&nbsp;
举例(*代表任意字符串)：<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.ordinalIndexOf(null, *, *) =
-1<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.ordinalIndexOf(*, null, *) =
-1<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.ordinalIndexOf("", "", *) =
0<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.ordinalIndexOf("aabaabaa", "a", 1) =
0<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.ordinalIndexOf("aabaabaa", "a", 2) =
1<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.ordinalIndexOf("aabaabaa", "b", 1) =
2<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.ordinalIndexOf("aabaabaa", "b", 2) =
5<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.ordinalIndexOf("aabaabaa", "ab", 1) =
1<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.ordinalIndexOf("aabaabaa", "ab", 2) =
4<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.ordinalIndexOf("aabaabaa", "bc", 1) =
-1<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.ordinalIndexOf("aabaabaa", "", 1) =
0<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.ordinalIndexOf("aabaabaa", "", 2) = 0
<br />
<br />
<span style="font-family: verdana,geneva;">22. <span style="color: #0000ff;">public static int indexOf(String str, String searchStr,
int startPos)</span> </span><br />
&nbsp;&nbsp;&nbsp; 返回字符串 <span style="font-family: verdana,geneva;">searchStr</span> 从 <span style="font-family: verdana,geneva;">startPos</span> 开始在字符串 <span style="font-family: verdana,geneva;">str</span> 中第一次出现的位置。<br />
&nbsp;&nbsp;&nbsp;
举例(*代表任意字符串)：<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.indexOf(null, *, *) = -1<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.indexOf(*, null, *) = -1<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.indexOf("", "", 0) = 0<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.indexOf("aabaabaa", "a", 0) =
0<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.indexOf("aabaabaa", "b", 0) =
2<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.indexOf("aabaabaa", "ab", 0) =
1<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.indexOf("aabaabaa", "b", 3) =
5<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.indexOf("aabaabaa", "b", 9) =
-1<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.indexOf("aabaabaa", "b", -1) =
2<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;"><span>StringUtils.indexOf("aabaabaa", "", 2) =
2<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #800000; font-family: arial,helvetica,sans-serif;">StringUtils.indexOf("abc", "", 9) = 3 <br />
<span style="color: #000000; font-family: verdana,geneva;"><br />
23. <span style="color: #0000ff;">public static int lastIndexOf(String str, char
searchChar)</span> </span><br />
&nbsp;&nbsp;&nbsp; 基本原理同18<br />
<br />
<span style="font-family: verdana,geneva;">24. <span style="color: #0000ff;">public
static int lastIndexOf(String str, char searchChar, int startPos)</span>
</span><br />
&nbsp;&nbsp;&nbsp; 基本原理同19<br />
<br />
<span style="font-family: verdana,geneva;">25.
<span style="color: #0000ff;">public static int lastIndexOf(String str, String
searchStr)</span> </span><br />
&nbsp;&nbsp;&nbsp; 基本原理同20<br />
<br />
<span style="font-family: verdana,geneva;">26. <span style="color: #0000ff;">public
static int lastIndexOf(String str, String searchStr, int startPos)</span>
</span><br />
&nbsp;&nbsp;&nbsp; 基本原理同22<br />
<br />
另附：<br />
<br />
<span style="font-family: verdana,geneva;">String</span> 的 <span style="font-family: verdana,geneva;">split(String regex)</span> &nbsp;
方法的用法<br />
如果我们需要把某个字符串拆分为字符串数组，则通常用<span style="font-family: verdana,geneva;">
split(String regex)</span> 来实现。<br />
<br />
例如：<br />
</span></p>
<div>
<div>
<div>Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://janwer.javaeye.com/blog/148313#"><img alt="复制代码" src="http://janwer.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol>
    <li>String&nbsp;str&nbsp;=&nbsp;"aa,bb,cc,dd";&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</li>
    <li>String[]&nbsp;strArray&nbsp;=&nbsp;str.split(",");&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</li>
    <li>System.out.println(strArray.length);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0<span>;&nbsp;i&nbsp;&lt;&nbsp;strArray.length;&nbsp;i++)&nbsp;{&nbsp;&nbsp;&nbsp;
    &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(strArray[i]);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</li>
    <li>}&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none;" name="code">String str = "aa,bb,cc,dd";
String[] strArray = str.split(",");
System.out.println(strArray.length);
for (int i = 0; i &lt; strArray.length; i++) {
System.out.println(strArray[i]);
}</pre>
&nbsp;
<p>结果为：<br />
<span style="font-family: verdana,geneva;">4<br />
aa<br />
bb<br />
cc<br />
dd
<br />
<br />
如果，<br />
<span style="font-family: verdana,geneva;">String str =
"aa.bb.cc.dd";<br />
String[] strArray = str.split(".");</span>
<br />
<br />
则结果为：0<br />
<br />
为什么结果不是我们所想的呢，原因是参数<span style="font-family: verdana,geneva;"> String regex</span> 是正则表达式 <span style="font-family: verdana,geneva;">(regular expression)</span> 而不是普通字符串，而 <span style="font-family: verdana,geneva;">"."</span>
在正则表达式中有特殊含义，表示匹配所有单个字符。如果要那样拆分，我们必须给 <span style="font-family: verdana,geneva;">"."</span> 进行转义，<span style="font-family: verdana,geneva;">String[] strArray = str.split(".")</span>
修改为 <span style="font-family: verdana,geneva;">String[] strArray =
str.split(""".")</span> 即可。<br />
</span>另外有关<span style="font-family: verdana,geneva;"> StringUtils 的详细 <span style="font-family: verdana,geneva;">API</span> 请参见官方网站<span style="font-family: arial,helvetica,sans-serif;">:</span> <span style="font-family: arial,helvetica,sans-serif;"><a href="http://commons.apache.org/lang/api/org/apache/commons/lang/StringUtils.html" target="_blank">http://commons.apache.org/lang/api/org/apache/commons/lang/StringUtils.html</a> </span></span></p>
</div>
<img src ="http://www.blogjava.net/alinglau36/aggbug/264885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alinglau36/" target="_blank">lau</a> 2009-04-10 17:03 <a href="http://www.blogjava.net/alinglau36/archive/2009/04/10/264885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java经典基础</title><link>http://www.blogjava.net/alinglau36/archive/2009/03/30/262887.html</link><dc:creator>lau</dc:creator><author>lau</author><pubDate>Mon, 30 Mar 2009 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/alinglau36/archive/2009/03/30/262887.html</guid><wfw:comment>http://www.blogjava.net/alinglau36/comments/262887.html</wfw:comment><comments>http://www.blogjava.net/alinglau36/archive/2009/03/30/262887.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alinglau36/comments/commentRss/262887.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alinglau36/services/trackbacks/262887.html</trackback:ping><description><![CDATA[<p><font color="#808080">对于这个系列里的问题，每个学Java的人都应该搞懂。当然，如果只是学Java玩玩就无所谓了。如果你认为自己已经超越初学者了，却不很懂这些问题，请将你自己重归初学者行列。内容均来自于CSDN的经典老贴。</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#808080"><strong> <font color="#ff0000">问题一：我声明了什么！</font><br />
</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String s = "Hello
world!";<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 许多人都做过这样的事情，但是，我们到底声明了什么？回答通常是：一个String，内容是&#8220;Hello
world!&#8221;。这样模糊的回答通常是概念不清的根源。如果要准确的回答，一半的人大概会回答错误。<br />
这个语句<font color="#ff0000"><strong>声明的是一个指向对象的引用，名为&#8220;s&#8221;，可以指向类型为String的任何对象，目前指向"Hello
world!"这个String类型的对象</strong>。</font>这就是真正发生的事情。我们并没有声明一个String对象，我们只是声明了一个只能指向String对象的引用变量。所以，如果在刚才那句语句后面，如果再运行一句：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
String string = s;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
我们是声明了另外一个只能指向String对象的引用，名为string，并没有第二个对象产生，string还是指向原来那个对象，也就是，和s指向同一个对象。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#808080"><strong><font color="#ff0000">
问题二："=="和equals方法究竟有什么区别？</font><br />
</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
==操作符专门用来比较变量的值是否相等。比较好理解的一点是：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int a=10;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int b=10;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
则a==b将是true。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但不好理解的地方是：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String a=new String("foo");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
String b=new String("foo");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 则a==b将返回false。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
根据前一帖说过，对象变量其实是一个引用，它们的值是指向对象所在的内存地址，而不是对象本身。a和b都使用了new操作符，意味着将在内存中产生两个内容为"foo"的字符串，既然是&#8220;两个&#8221;，它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值，所以使用"=="操作符，结果会是false。诚然，a和b所指的对象，它们的内容都是"foo"，应该是&#8220;相等&#8221;，<font color="#ff0000">但是</font><font color="#ff0000"><strong>==操作符并不涉及到对象内容的比较。</strong><strong>对象内容的比较，正是equals方法做的事。</strong><br />
</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
看一下Object对象的equals方法是如何实现的：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean equals(Object o){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return this==o;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Object对象默认使用了==操作符。所以如果你自创的类没有覆盖equals方法，那你的类使用equals和使用==会得到同样的结果。同样也可以看出，Object的equals方法没有达到equals方法应该达到的目标：比较两个对象内容是否相等。因为答案应该由类的创建者决定，所以Object把这个任务留给了类的创建者。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
看一下一个极端的类：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class Monster{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String content;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean equals(Object another){ return true;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
我覆盖了equals方法。这个实现会导致无论Monster实例内容如何，它们之间的比较永远返回true。<br />
<br />
所以当你是用equals方法判断对象的内容是否相等，请不要想当然。因为可能你认为相等，而这个类的作者不这样认为，而类的equals方法的实现是由他掌握的。如果你需要使用equals方法，或者使用任何基于散列码的集合（HashSet,HashMap,HashTable），请察看一下java
doc以确认这个类的equals逻辑是如何实现的。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000"><strong>问题三：String到底变了没有？</strong><br />
</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
没有。因为String被设计成不可变(immutable)类，所以它的所有对象都是不可变对象。请看下列代码：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String s =
"Hello";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s = s + " world!";<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
s所指向的对象是否改变了呢？从本系列第一篇的结论很容易导出这个结论。我们来看看发生了什么事情。在这段代码中，s原先指向一个String对象，内容是"Hello"，然后我们对s进行了+操作，那么s所指向的那个对象是否发生了改变呢？答案是没有。这时，s不指向原来那个对象了，而指向了另一个String对象，内容为"Hello
world!"，原来那个对象还存在于内存之中，只是s这个引用变量不再指向它了。<br />
通过上面的说明，我们很容易导出另一个结论，如果经常对字符串进行各种各样的修改，或者说，不可预见的修改，那么使用String来代表字符串的话会引起很大的内存开销。因为String对象建立之后不能再改变，所以对于每一个不同的字符串，都需要一个String对象来表示。这时，应该考虑使用StringBuffer类，它允许修改，而不是每个不同的字符串都要生成一个新的对象。并且，这两种类的对象转换十分容易。<br />
同时，我们还可以知道，如果要使用内容相同的字符串，不必每次都new一个String。例如我们要在构造器中对一个名叫s的String引用变量进行初始化，把它设置为初始值，应当这样做：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
public class Demo {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String s;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
public Demo {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s = "Initial Value";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 而非 s = new String("Initial Value");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
后者每次都会调用构造器，生成新对象，性能低下且内存开销大，并且没有意义，因为String对象不可改变，所以对于内容相同的字符串，只要一个String对象来表示就可以了。也就说，多次调用上面的构造器创建多个对象，他们的String类型属性s都指向同一个对象。<br />
上面的结论还基于这样一个事实：对于字符串常量，如果内容相同，Java认为它们代表同一个String对象。而用关键字new调用构造器，总是会创建一个新的对象，无论内容是否相同。<br />
至于为什么要把String类设计成不可变类，是它的用途决定的。其实不只String，很多Java标准类库中的类都是不可变的。在开发一个系统的时候，我们有时候也需要设计不可变类，来传递一组相关的值，这也是面向对象思想的体现。不可变类有一些优点，比如因为它的对象是只读的，所以多线程并发访问也不会有任何问题。当然也有一些缺点，比如每个不同的状态都要一个对象来代表，可能会造成性能上的问题。所以Java标准类库还提供了一个可变版本，即StringBuffer。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<strong><font color="#ff0000">问题四：final关键字到底修饰了什么？</font></strong><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
final使得被修饰的变量"不变"，但是由于对象型变量的本质是&#8220;引用&#8221;，使得&#8220;不变&#8221;也有了两种含义：引用本身的不变，和引用指向的对象不变。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
引用本身的不变：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final StringBuffer a=new StringBuffer("immutable");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
final StringBuffer b=new StringBuffer("not immutable");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
a=b;//编译期错误<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引用指向的对象不变：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final StringBuffer a=new
StringBuffer("immutable");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.append(" broken!"); //编译通过<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
可见，<font color="#ff0000">final只对引用的&#8220;值&#8221;(也即它所指向的那个对象的内存地址)有效，它迫使引用只能指向初始指向的那个对象，改变它的指向会导致编译期错误。至于它所指向的对象的变化，final是不负责的。这很类似==操作符：==操作符只负责引用的&#8220;值&#8221;相等，至于这个地址所指向的对象内容是否相等，==操作符是不管的。<br />
</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
理解final问题有很重要的含义。许多程序漏洞都基于此----final只能保证引用永远指向固定对象，不能保证那个对象的状态不变。在多线程的操作中,一个对象会被多个线程共享或修改，一个线程对对象无意识的修改可能会导致另一个使用此对象的线程崩溃。一个错误的解决方法就是在此对象新建的时候把它声明为final，意图使得它&#8220;永远不变&#8221;。其实那是徒劳的。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<font color="#ff0000"><strong>问题五：到底要怎么样初始化！</strong><br />
</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
本问题讨论变量的初始化，所以先来看一下Java中有哪些种类的变量。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. 类的属性，或者叫值域<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.
方法里的局部变量<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3. 方法的参数<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
对于第一种变量，Java虚拟机会自动进行初始化。如果给出了初始值，则初始化为该初始值。如果没有给出，则把它初始化为该类型变量的默认初始值。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
int类型变量默认初始值为0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float类型变量默认初始值为0.0f<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
double类型变量默认初始值为0.0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean类型变量默认初始值为false<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
char类型变量默认初始值为0(ASCII码)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long类型变量默认初始值为0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
所有对象引用类型变量默认初始值为null，即不指向任何对象。注意数组本身也是对象，所以没有初始化的数组引用在自动初始化后其值也是null。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<font color="#ff0000"><strong>对于两种不同的类属性，static属性与instance属性，初始化的时机是不同的。instance属性在创建实例的时候初始化，static属性在类加载，也就是第一次用到这个类的时候初始化，对于后来的实例的创建，不再次进行初始化</strong>。</font>这个问题会在以后的系列中进行详细讨论。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
对于第二种变量，必须明确地进行初始化。如果再没有初始化之前就试图使用它，编译器会抗议。如果初始化的语句在try块中或if块中，也必须要让它在第一次使用前一定能够得到赋值。也就是说，把初始化语句放在只有if块的条件判断语句中编译器也会抗议，因为执行的时候可能不符合if后面的判断条件，如此一来初始化语句就不会被执行了，这就违反了局部变量使用前必须初始化的规定。但如果在else块中也有初始化语句，就可以通过编译，因为无论如何，总有至少一条初始化语句会被执行，不会发生使用前未被初始化的事情。对于try-catch也是一样，如果只有在try块里才有初始化语句，编译部通过。如果在catch或finally里也有，则可以通过编译。总之，要保证局部变量在使用之前一定被初始化了。所以，一个好的做法是在声明他们的时候就初始化他们，如果不知道要出事化成什么值好，就用上面的默认值吧！<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
其实第三种变量和第二种本质上是一样的，都是方法中的局部变量。只不过作为参数，肯定是被初始化过的，传入的值就是初始值，所以不需要初始化。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<font color="#ff0000"><strong>问题六：instanceof是什么东东？</strong><br />
</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
instanceof是Java的一个二元操作符，和==，&gt;，&lt;是同一类东东。由于它是由字母组成的，所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例，返回boolean类型的数据。举个例子：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
String s = "I AM an Object!";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean isObject = s instanceof
Object;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
我们声明了一个String对象引用，指向一个String对象，然后用instancof来测试它所指向的对象是否是Object类的一个实例，显然，这是真的，所以返回true，也就是isObject的值为True。<br />
instanceof有一些用处。比如我们写了一个处理账单的系统，其中有这样三个类：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
public class Bill {//省略细节}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class PhoneBill extends Bill
{//省略细节}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class GasBill extends Bill {//省略细节}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
在处理程序里有一个方法，接受一个Bill类型的对象，计算金额。假设两种账单计算方法不同，而传入的Bill对象可能是两种中的任何一种，所以要用instanceof来判断：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
public double calculate(Bill bill) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (bill instanceof PhoneBill)
{<br />
&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; if (bill instanceof GasBill)
{<br />
&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; ...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
这样就可以用一个方法处理两种子类。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
然而，这种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现，这是面向对象变成应有的做法，避免回到结构化编程模式。只要提供两个名字和返回值都相同，接受参数类型不同的方法就可以了：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
public double calculate(PhoneBill bill) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //计算电话账单<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public double calculate(GasBill bill) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//计算燃气账单<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所以，使用instanceof在绝大多数情况下并不是推荐的做法，应当好好利用多态。</font></p>
<img src ="http://www.blogjava.net/alinglau36/aggbug/262887.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alinglau36/" target="_blank">lau</a> 2009-03-30 14:55 <a href="http://www.blogjava.net/alinglau36/archive/2009/03/30/262887.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>语言深入:java中究竟是传值还是传引用</title><link>http://www.blogjava.net/alinglau36/archive/2009/03/24/261747.html</link><dc:creator>lau</dc:creator><author>lau</author><pubDate>Tue, 24 Mar 2009 10:21:00 GMT</pubDate><guid>http://www.blogjava.net/alinglau36/archive/2009/03/24/261747.html</guid><wfw:comment>http://www.blogjava.net/alinglau36/comments/261747.html</wfw:comment><comments>http://www.blogjava.net/alinglau36/archive/2009/03/24/261747.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/alinglau36/comments/commentRss/261747.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alinglau36/services/trackbacks/261747.html</trackback:ping><description><![CDATA[<p><font color="#808080">首先，推荐对Java有一定理解的同仁一本书《Practical Java》。在《Practical
Java》中也有一个章节介绍Java中关于传值和传引用的问题，堪称经典。《Practical
Java》在Java中，事实上底层工作原理不存在传引用的概念，这也象《Practical
Java》中所说的那样，Java中只有传值。这句话理解起来需要费一定的周折。</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
熟悉C的程序员都用过指针，对指针可谓爱之深恨之切。指针是指向一块内存地址的内存数据（有些拗口），也就是说指针本身是一个占用4字节内存的int（32
位系统内），而这个int值恰恰又是另一块内存的地址。比如"hello"这个字串，存放在@0x0000F000这个地址到@0x0000F005这段内存区域内（包括0x00的结束字节）。而在@0x0000FFF0到@0x0000FFF03这四个字节内存放着一个int，这个int的值是
@0x0000F000。这样就形成了一个指向"hello"字串的指针。</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Java中，很多人说没有指针，事实上，在Java更深层次里，<strong><font color="#ff0000">到处都是大师封装好的精美绝伦的指针。</font></strong>为了更容易的讲解Java中关于类和类型的调用，Java中出现了值与引用的说法。浅显的来说，我们可以认为Java中的引用与C中的指针等效（其实差别非常非常大，但是为了说明我们今天的问题，把他们理解为等效是没有任何问题的）。</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
所谓传引用的说法是为了更好的讲解调用方式。基于上面对指针的理解，我们不难看出，指针其实也是一个int值，所谓传引用，我们是复制了复制了指针的int值进行传递。为了便于理解，我们可以姑且把指针看作一种数据类型，透明化指针的int特性，从而提出传引用的概念。</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="#ff0000"><strong>重申一遍：Java中只有传值。</strong></font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong> 1所谓传值和传引用</strong></font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
传值和传引用的问题一直是Java里争论的话题。与C++不同的，Java里面没有指针的概念，Java的设计者巧妙的对指针的操作进行了管理。事实上，在懂C++的Java程序员眼中，Java到处都是精美绝伦的指针。<br />
下面举个简单的例子，说明什么是传值，什么是传引用。<br />
//例1<br />
void
method1(){<br />
int
x=0;<br />
this.change(x);<br />
System.out.println(x);<br />
}</font></p>
<p><font color="#808080">void change(int i){<br />
i=1;<br />
}</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
很显然的，在mothod1中执行了change(x)后，x的值并不会因为change方法中将输入参数赋值为1而变成1，也就是说在执行change(x)后，x的值z依然是0。这是因为x传递给change(int
i)的是值。这就是最简单的传值。<br />
同样的，进行一点简单的变化。<br />
//例2<br />
void method1(){<br />
StringBuffer
x=new
StringBuffer("Hello");<br />
this.change(x);<br />
System.out.println(x);<br />
}</font></p>
<p><font color="#808080">void change(StringBuffer i){<br />
i.append("
world!");<br />
}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 看起来没什么变化，但是这次mothed1中执行了change
(x)后，x的值不再是"Hello"了，而是变成了"Hello
world!"。这是因为x传递给change(i)的是x的引用。这是最经典的传引用。<br />
似乎有些奇怪了，两段程序没有特别的不同，可是为什么一个传的是值而另一个传的是引用呢？......</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>2非要搞清楚传值还是传引用的问题吗？</strong></font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 搞清楚这自然是有必要的，不然我也不需要写这么多了，不过的确没有到"非要"的地步。</font></p>
<p><br />
<font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
首先，如果我们不太关心什么是传值什么是传引用，我们一样能写出漂亮的代码，但是这些代码在运行过程中可能会存在着极大的隐患。全局变量是让大家深恶痛绝（又难以割舍）的东西，原因就是使用全局变量要特别注意数据的保护。如果在多线程的程序里使用全局变量简直就等于跟自己过不去。不了解传值和传引用的问题，跟使用全局变量不考虑数据保护的罪过是不相上下下的，甚至有时候比它还要糟。你会莫名其妙，为什么我的返回参数没有起作用，为什么我传进去的参数变成了这样......？<br />
一个例子：<br />
//例3<br />
void
mothed1(){<br />
int x=0;<br />
int
y=1;<br />
switchValue(x,y);<br />
System.out.println("x="+x);<br />
System.out.println("y="+y);<br />
}<br />
void
switchValue(int a,int b){</font></p>
<p><font color="#808080">int c=a;<br />
a=b;<br />
b=c;<br />
}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
上面是一个交换a,b值的函数，看起来似乎蛮正确的，但是这个函数永远也不会完成你想要的工作。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
还有一个例子：<br />
//例4<br />
StringBuffer a=new StringBuffer("I am a ");<br />
StringBuffer
b=a;<br />
a.append("after
append");<br />
a=b;<br />
System.out.println("a="+a);<br />
在编程过程中，经常会遇到这种情况，一个变量的值要被临时改变一下，等用完之后再恢复到开始的值。就好像上面的例子，a为了保持它的值，使用b=a做赋值，之后a被改变，再之后a把暂存在b里面的值取回来。这是我们一厢情愿的想法，而事实上，这段代码执行后，你会发现a的值已经改变了。<br />
以上是两个最简单的例子，真正的程序开发过程中，比这要复杂的情况每天都会遇到。</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>3类型和类</strong></font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java
提出的思想，在Java里面任何东西都是类。但是Java里面同时还有简单数据类型int,byte,char,boolean，与这些数据类型相对应的类是Integer，Byte，Character，Boolean，这样做依然不会破坏Java关于任何东西都是类的提法。这里提到数据类型和类似乎和我们要说的传值和传引用的问题无关，但这是我们分辨传值和传引用的基础。</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>4试图分辨传值还是传引用</strong></font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
为什么是"试图分辨"呢？很简单，传值和传引用的问题无处不在，但是似乎还没有人能正统的给出标准，怎样的就是值拷贝调用，怎样的就是引用调用。面对这个问题，我们更多的应该是来自平时积累对Java的理解。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
回过头来，我们分析一下上面的几个例子：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
先看例1，即使你不明白为什么，但是你应该知道这样做肯定不会改变x的值。为了方便说明，我们给例子都加上行号。<br />
//例1<br />
1 void
method1(){<br />
2&nbsp;&nbsp; int x=0;<br />
3&nbsp;&nbsp; this.change(x);<br />
4 }<br />
5<br />
6 void
change(int i){<br />
7 i=7;<br />
8}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 让我们从内存的存储方式看一下x和I之间到底是什么关系。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
在执行到第2行的时候，变量x指向一个存放着int 0的内存地址。</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变量x----&gt;[存放值0]</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
执行第3行调用change(x)方法的时候，内存中是这样的情形：x把自己值在内存中复制一份，然后变量i指向这个被复制出来的0。</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变量x----&gt;[存放值0]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&#8595;进行了一次值复制<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变量x----&gt;[存放值0]</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
这时候再执行到第7行的时候，变量i的被赋值为7，而这一步的操作已经跟x没有任何关系了。</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变量x----&gt;[存放值0]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
变量x----&gt;[存放值7]</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
说到这里应该已经理解为什么change(x)不能改变x的值了吧？因为这个例子是传值的。<br />
那么，试着分析一下为什么例三中的switchValue()方法不能完成变量值交换的工作？<br />
再看例2。<br />
//例2<br />
1void
method1(){<br />
2 StringBuffer x=new StringBuffer("Hello");<br />
3
this.change(x);<br />
4}<br />
5<br />
6void change(StringBuffer i){<br />
7 i.append("
world!");<br />
8}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
例2似乎和例1从代码上看不出什么差别，但是执行结果却是change(x)能改变x的值。依然才从内存的存储角度来看看例2的蹊跷在哪里。<br />
在执行到第2行时候，同例1一样，x指向一个存放"Hello"的内存空间。</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变量x----&gt;[存放值"Hello"]</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
接下来执行第三行change(x)，注意，这里就与例1有了本质的不同：调用change(x)时，变量i也指向了x指向的内存空间，而不是指向x的一个拷贝。</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变量x "<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;[存放值"Hello"]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
变量x /</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
于是，第7行对i调用append方法，改变i指向的内存空间的值，x的值也就随之改变了。</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变量x "<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;[追加为"Hello
World!"]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变量x /</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
为什么x值能改变呢？因为这个例子是传引用的。<br />
这几个例子是明白了，可是很多人会开始有另一个疑问了：这样看来，到底什么时候是传的值什么时候是传得引用呢？于是，我们前面讲到的类型和类在这里就派上了用场<strong>：<font color="#ff0000">对于参数传递，如果是简单数据类型，那么它传递的是值拷贝，对于类的实例它传递的是类的引用。需要注意的是，这条规则只适用于参数传递。</font></strong>为什么这么说呢？我们看看这样一个例子：<br />
//例5<br />
String
str="abcdefghijk";<br />
str.replaceAll("b","B");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
这两句执行后，str的内容依然是"abcdefghijk"，但是我们明明是对str操作的，为什么是这样的呢？因为str的值究竟会不会被改变完全取决于replaceAll这个方法是怎么实现的。类似的，有这样一个例子：<br />
//例6<br />
1
void method1() {<br />
2 StringBuffer x = new StringBuffer("Hello");<br />
3
change1(x);<br />
4 System.out.println(x);<br />
5 }<br />
6<br />
7 void method2() {<br />
8
StringBuffer x = new StringBuffer("Hello");<br />
9 change2(x);<br />
10
System.out.println(x);<br />
11 }<br />
12<br />
13 void change1(StringBuffer sb) {<br />
14
sb.append(" world!");<br />
15 }<br />
16<br />
17 void change2(StringBuffer sb) {<br />
18
sb = new StringBuffer("hi");<br />
19 sb.append(" world!");<br />
20 }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
调用method1()，屏幕打印结果为："Hello world!"<br />
调用method2()，我们认为结果应该是"hi
world"，因为sb传进来的是引用。可是实际执行的结果是"Hello"！<br />
难道change2()又变成传值了？！其实change1()和change2()的确都是通过参数传入引用，但是在方法内部因为处理方法的不同而使结果大相径庭。我们还是从内存的角度分析：<br />
执行method1()和change1()不用再多说了，上面的例子已经讲解过，这里我们分析一下method2()和change2()。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
程序执行到第8行，x指向一个存放着"Hello"的内存空间。</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变量x----&gt;[存放值"Hello"]</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第9行调用change2，将sb指向x指向的内存空间，也就是传入x的引用。</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变量x "<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;[存放值"Hello"]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
变量x /</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="#ff0000">到这里为止还没有什么异样，接下来执行18行，这里就出现了类似传入值拷贝的变化：new
方法并没有改变sb指向内存的内容，而是在内从中开辟了一块新的空间存放串"hi"，同时sb指向了这块空间。</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变量x----&gt;[存放值"Hello"]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&#215;原有的引用被切断<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变量x----&gt;[另一块存放"hi"的空间]</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
接下来再对sb进行append已经和x没有任何关系了。<br />
所以，还有一条不成规则的规则：对于函数调用，最终效果是什么完全看函数内部的实现。比较标准的做法是如果会改变引用的内容，则使用void作为方法返回值，而不会改变引用内容的则在返回值中返回新的值。<br />
虽然已经说了这么多，但是感觉传值还是传引用的问题依然没有完全说清楚。因为这个问题本身就是很难归纳总结的问题，所以更多的理解要靠平时的积累和形成。下面几个例子，给大家尝试进行分析。<br />
//例7，打印结果是什么？<br />
public
static void main(String[] args) {<br />
int a;<br />
int b;<br />
StringBuffer
c;<br />
StringBuffer d;<br />
a = 0;<br />
b = a;<br />
c = new StringBuffer("This is
c");<br />
d = c;</font></p>
<p><font color="#808080">a = 2;<br />
c.append("!!");</font></p>
<p><font color="#808080">System.out.println("a=" + a);<br />
System.out.println("b="
+ b);<br />
System.out.println("c=" + c);<br />
System.out.println("d=" +
d);<br />
}</font></p>
<p><font color="#808080">//例8，打印结果是什么？<br />
public class Test{</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args)
{</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer sb = new StringBuffer("Hello
");</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Before change, sb = " +
sb);</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; changeData(sb);</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("After changeData(n), sb = "
+ sb);</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void changeData(StringBuffer
strBuf) {</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer sb2 = new StringBuffer("Hi
");</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strBuf = sb2;</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb2.append("World!");</font></p>
<p><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font color="#808080">}<br /><br /></font><strong>如果本文对您有帮助并且要鼓励我的话，请扫描如下二维码支持本人的劳动成果，多谢了！</strong><br /><br /><img src="http://www.blogjava.net/images/blogjava_net/alinglau36/wcpay.jpg" width="500" height="685" alt="" /><font color="#808080"><br /></font></p><img src ="http://www.blogjava.net/alinglau36/aggbug/261747.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alinglau36/" target="_blank">lau</a> 2009-03-24 18:21 <a href="http://www.blogjava.net/alinglau36/archive/2009/03/24/261747.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>System.getProperty()</title><link>http://www.blogjava.net/alinglau36/archive/2009/03/16/260021.html</link><dc:creator>lau</dc:creator><author>lau</author><pubDate>Mon, 16 Mar 2009 06:54:00 GMT</pubDate><guid>http://www.blogjava.net/alinglau36/archive/2009/03/16/260021.html</guid><wfw:comment>http://www.blogjava.net/alinglau36/comments/260021.html</wfw:comment><comments>http://www.blogjava.net/alinglau36/archive/2009/03/16/260021.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alinglau36/comments/commentRss/260021.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alinglau36/services/trackbacks/260021.html</trackback:ping><description><![CDATA[<h2><a id="viewpost1_TitleUrl" href="../../javafield/archive/2008/01/05/172952.html">System.getProperty()</a>
</h2>
<div>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #008080;">&nbsp;1</span><img id="Codehighlighter1_25_2210_Open_Image" onclick="this.style.display='none'; Codehighlighter1_25_2210_Open_Text.style.display='none'; Codehighlighter1_25_2210_Closed_Image.style.display='inline'; Codehighlighter1_25_2210_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_25_2210_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_25_2210_Closed_Text.style.display='none'; Codehighlighter1_25_2210_Open_Image.style.display='inline'; Codehighlighter1_25_2210_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Information&nbsp;</span><span id="Codehighlighter1_25_2210_Open_Text"><span style="color: #000000;">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;2</span><span style="color: #000000;"><img id="Codehighlighter1_73_2205_Open_Image" onclick="this.style.display='none'; Codehighlighter1_73_2205_Open_Text.style.display='none'; Codehighlighter1_73_2205_Closed_Image.style.display='inline'; Codehighlighter1_73_2205_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_73_2205_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_73_2205_Closed_Text.style.display='none'; Codehighlighter1_73_2205_Open_Image.style.display='inline'; Codehighlighter1_73_2205_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">static</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String&nbsp;args[])&nbsp;</span><span id="Codehighlighter1_73_2205_Open_Text"><span style="color: #000000;">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;3</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">java_vendor:</span><span style="color: #000000;">"</span>&nbsp;<span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;System.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">java.vendor</span><span style="color: #000000;">"</span><span style="color: #000000;">));&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;4</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">java_vendor_url:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;5</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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;">&nbsp;System.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">java.vendor.url</span><span style="color: #000000;">"</span><span style="color: #000000;">));&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;6</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">java_home:</span><span style="color: #000000;">"</span>&nbsp;<span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;System.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">java.home</span><span style="color: #000000;">"</span><span style="color: #000000;">));&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;7</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">java_class_version:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;8</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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;">&nbsp;System.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">java.class.version</span><span style="color: #000000;">"</span><span style="color: #000000;">));&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;9</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">java_class_path:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">10</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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;">&nbsp;System.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">java.class.path</span><span style="color: #000000;">"</span><span style="color: #000000;">));&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">11</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">os_name:</span><span style="color: #000000;">"</span>&nbsp;<span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;System.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">os.name</span><span style="color: #000000;">"</span><span style="color: #000000;">));&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">12</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">os_arch:</span><span style="color: #000000;">"</span>&nbsp;<span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;System.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">os.arch</span><span style="color: #000000;">"</span><span style="color: #000000;">));&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">13</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">os_version:</span><span style="color: #000000;">"</span>&nbsp;<span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;System.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">os.version</span><span style="color: #000000;">"</span><span style="color: #000000;">));&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">14</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">user_name:</span><span style="color: #000000;">"</span>&nbsp;<span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;System.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">user.name</span><span style="color: #000000;">"</span><span style="color: #000000;">));&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">15</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">user_home:</span><span style="color: #000000;">"</span>&nbsp;<span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;System.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">user.home</span><span style="color: #000000;">"</span><span style="color: #000000;">));&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">16</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">user_dir:</span><span style="color: #000000;">"</span>&nbsp;<span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;System.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">user.dir</span><span style="color: #000000;">"</span><span style="color: #000000;">));&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">17</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">java_vm_specification_version:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">18</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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;">&nbsp;System.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">java.vm.specification.version</span><span style="color: #000000;">"</span><span style="color: #000000;">));&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">19</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">java_vm_specification_vendor:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">20</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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;">&nbsp;System.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">java.vm.specification.vendor</span><span style="color: #000000;">"</span><span style="color: #000000;">));&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">21</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">java_vm_specification_name:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">22</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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;">&nbsp;System.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">java.vm.specification.name</span><span style="color: #000000;">"</span><span style="color: #000000;">));&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">23</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">java_vm_version:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">24</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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;">&nbsp;System.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">java.vm.version</span><span style="color: #000000;">"</span><span style="color: #000000;">));&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">25</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">java_vm_vendor:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">26</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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;">&nbsp;System.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">java.vm.vendor</span><span style="color: #000000;">"</span><span style="color: #000000;">));&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">27</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">28</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">java_vm_name:</span><span style="color: #000000;">"</span>&nbsp;<span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;System.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">java.vm.name</span><span style="color: #000000;">"</span><span style="color: #000000;">));&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">29</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">java_ext_dirs:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">30</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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;">&nbsp;System.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">java.ext.dirs</span><span style="color: #000000;">"</span><span style="color: #000000;">));&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">31</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">file_separator:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">32</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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;">&nbsp;System.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">file.separator</span><span style="color: #000000;">"</span><span style="color: #000000;">));&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">33</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">path_separator:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">34</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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;">&nbsp;System.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">path.separator</span><span style="color: #000000;">"</span><span style="color: #000000;">));&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">35</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">line_separator:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">36</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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;">&nbsp;System.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">line.separator</span><span style="color: #000000;">"</span><span style="color: #000000;">));&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">37</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">38</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">39</span><span style="color: #000000;"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
常用的System.getProperty()，这里贴一下，省得下次麻烦.<font size="3"><br />
<br />
</font>From jdk 1.5.0 documents<br />
<table style="border: 1pt solid windowtext; margin-left: 36pt;" border="1" cellpadding="0">
    <tbody>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">java.version</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Java </span><span style="font-size: 12pt; font-family: 宋体;">运行时环境版本</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">java.vendor</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Java </span><span style="font-size: 12pt; font-family: 宋体;">运行时环境供应商</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">java.vendor.url</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Java </span><span style="font-size: 12pt; font-family: 宋体;">供应商的 URL</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">java.home</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Java </span><span style="font-size: 12pt; font-family: 宋体;">安装目录</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">java.vm.specification.version</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Java </span><span style="font-size: 12pt; font-family: 宋体;">虚拟机规范版本</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">java.vm.specification.vendor</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Java </span><span style="font-size: 12pt; font-family: 宋体;">虚拟机规范供应商</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">java.vm.specification.name</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Java </span><span style="font-size: 12pt; font-family: 宋体;">虚拟机规范名称</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">java.vm.version</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Java </span><span style="font-size: 12pt; font-family: 宋体;">虚拟机实现版本</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">java.vm.vendor</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Java </span><span style="font-size: 12pt; font-family: 宋体;">虚拟机实现供应商</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">java.vm.name</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Java </span><span style="font-size: 12pt; font-family: 宋体;">虚拟机实现名称</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">java.specification.version</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Java </span><span style="font-size: 12pt; font-family: 宋体;">运行时环境规范版本</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">java.specification.vendor</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Java </span><span style="font-size: 12pt; font-family: 宋体;">运行时环境规范供应商</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">java.specification.name</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Java </span><span style="font-size: 12pt; font-family: 宋体;">运行时环境规范名称</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">java.class.version</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Java </span><span style="font-size: 12pt; font-family: 宋体;">类格式版本号</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">java.class.path</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Java </span><span style="font-size: 12pt; font-family: 宋体;">类路径</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">java.library.path</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">加载库时搜索的路径列表</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">java.io.tmpdir</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">默认的临时文件路径</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">java.compiler</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">要使用的 JIT 编译器的名称</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">java.ext.dirs</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">一个或多个扩展目录的路径</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">os.name</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">操作系统的名称</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">os.arch</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">操作系统的架构</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">os.version</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">操作系统的版本</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">file.separator</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">文件分隔符（在 UNIX
            系统中是&#8220;/&#8221;）</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">path.separator</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">路径分隔符（在 UNIX
            系统中是&#8220;:&#8221;）</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">line.separator</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">行分隔符（在 UNIX
            系统中是&#8220;/n&#8221;）</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">user.name</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">用户的账户名称</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">user.home</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">用户的主目录</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">user.dir</span></p>
            </td>
            <td style="padding: 0.75pt;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">用户的当前工作目录</span></p>
            </td>
        </tr>
    </tbody>
</table>
<br />
<font size="3"><br />
系统属性值中的多个路径是用平台的路径分隔符分隔的</font></div>
<img src ="http://www.blogjava.net/alinglau36/aggbug/260021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alinglau36/" target="_blank">lau</a> 2009-03-16 14:54 <a href="http://www.blogjava.net/alinglau36/archive/2009/03/16/260021.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java需要了解的东西</title><link>http://www.blogjava.net/alinglau36/archive/2009/03/02/257337.html</link><dc:creator>lau</dc:creator><author>lau</author><pubDate>Mon, 02 Mar 2009 06:32:00 GMT</pubDate><guid>http://www.blogjava.net/alinglau36/archive/2009/03/02/257337.html</guid><wfw:comment>http://www.blogjava.net/alinglau36/comments/257337.html</wfw:comment><comments>http://www.blogjava.net/alinglau36/archive/2009/03/02/257337.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alinglau36/comments/commentRss/257337.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alinglau36/services/trackbacks/257337.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1、forward&nbsp;和redirect的区别答：1.forward是服务器请求资源，服务器直接访问目标地址的URL，把那个URL的响应内容读取过来，然后把这些内容再发给浏览器，浏览器根本不知道服务器发送的内容是从哪儿来的，所以它的地址栏中还是原来的地址。&nbsp;&nbsp;&nbsp;&nbsp;redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址...&nbsp;&nbsp;<a href='http://www.blogjava.net/alinglau36/archive/2009/03/02/257337.html'>阅读全文</a><img src ="http://www.blogjava.net/alinglau36/aggbug/257337.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alinglau36/" target="_blank">lau</a> 2009-03-02 14:32 <a href="http://www.blogjava.net/alinglau36/archive/2009/03/02/257337.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中static的作用 </title><link>http://www.blogjava.net/alinglau36/archive/2009/03/02/257313.html</link><dc:creator>lau</dc:creator><author>lau</author><pubDate>Mon, 02 Mar 2009 04:03:00 GMT</pubDate><guid>http://www.blogjava.net/alinglau36/archive/2009/03/02/257313.html</guid><wfw:comment>http://www.blogjava.net/alinglau36/comments/257313.html</wfw:comment><comments>http://www.blogjava.net/alinglau36/archive/2009/03/02/257313.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alinglau36/comments/commentRss/257313.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alinglau36/services/trackbacks/257313.html</trackback:ping><description><![CDATA[java中static的作用
<p>有时你希望定义一个类成员，使它的使用完全独立于该类的任何对象。通常情况下，类成员必须通过它的类的对象访问，但是可以创建这样一个成员，它能够
被它自己使用，而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static，它就能
够在它的类的任何对象创建之前被访问，而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main(
) 。因为在程序开始执行时必须调用main() ，所以它被声明为static。 </p>
<p>声明为static的变量实质上就是全局变量。当声明一个对象时，并不产生static变量的拷贝，而是该类所有的实例变量共用同一个static变量。声明为static的方法有以下几条限制： <br />
&#183; <br />
它们仅能调用其他的static 方法。 <br />
&#183; <br />
它们只能访问static数据。 <br />
&#183; <br />
它们不能以任何方式引用this 或super（关键字super 与继承有关，在下一章中描述）。 <br />
如果你需要通过计算来初始化你的static变量，你可以声明一个static块，Static 块仅在该类被加载时执行一次。下面的例子显示的类有一个static方法，一些static变量，以及一个static 初始化块： <br />
// Demonstrate static variables，methods，and blocks. </p>
<p>class UseStatic { <br />
static int a = 3; <br />
static int b; </p>
<p><br />
static void meth(int x) { <br />
System.out.println("x = " + x); <br />
System.out.println("a = " + a); <br />
System.out.println("b = " + b); </p>
<p><br />
} </p>
<p>static { <br />
System.out.println("Static block initialized."); <br />
b = a * 4; </p>
<p><br />
} </p>
<p>public static void main(String args[]) { <br />
meth(42); <br />
} <br />
} </p>
<p><br />
一旦UseStatic 类被装载，所有的static语句被运行。首先，a被设置为3，接着static
块执行(打印一条消息)，最后，b被初始化为a*4 或12。然后调用main()，main() 调用meth()
，把值42传递给x。3个println ( ) 语句引用两个static变量a和b，以及局部变量x 。 </p>
<p>注意：在一个static 方法中引用任何实例变量都是非法的。 </p>
<p>下面是该程序的输出： </p>
<p>Static block initialized. <br />
x = 42 <br />
a = 3 <br />
b = 12 <br />
在定义它们的类的外面，static 方法和变量能独立于任何对象而被使用。这样，你只要在类的名字后面加点号运算符即可。例如，如果你希望从类外面调用一个static方法，你可以使用下面通用的格式： </p>
<p>classname.method( ) </p>
<p>这里，classname
是类的名字，在该类中定义static方法。可以看到，这种格式与通过对象引用变量调用非static方法的格式类似。一个static变量可以以同样的
格式来访问——类名加点号运算符。这就是Java 如何实现全局功能和全局变量的一个控制版本。 </p>
<p>下面是一个例子。在main() 中，static方法callme() 和static 变量b在它们的类之外被访问。 </p>
<p>class StaticDemo { <br />
static int a = 42; <br />
static int b = 99; <br />
static void callme() { </p>
<p><br />
System.out.println("a = " + a); <br />
} <br />
} </p>
<p><br />
class StaticByName { </p>
<p>public static void main(String args[]) { <br />
StaticDemo.callme(); <br />
System.out.println("b = " + StaticDemo.b); </p>
<p><br />
} <br />
} </p>
<p>下面是该程序的输出： </p>
<p>a = 42 <br />
b = 99</p>
<p><br />
&nbsp;</p>
<p>static成员是不能被其所在class创建的实例访问的。</p>
<p>如果不加static修饰的成员是对象成员，也就是归每个对象所有的。 </p>
加static修饰的成员是类成员，就是可以由一个类直接调用，为所有对象共有的
<img src ="http://www.blogjava.net/alinglau36/aggbug/257313.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alinglau36/" target="_blank">lau</a> 2009-03-02 12:03 <a href="http://www.blogjava.net/alinglau36/archive/2009/03/02/257313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何避免在Java中使用Checked Exception</title><link>http://www.blogjava.net/alinglau36/archive/2009/02/17/255045.html</link><dc:creator>lau</dc:creator><author>lau</author><pubDate>Tue, 17 Feb 2009 03:18:00 GMT</pubDate><guid>http://www.blogjava.net/alinglau36/archive/2009/02/17/255045.html</guid><wfw:comment>http://www.blogjava.net/alinglau36/comments/255045.html</wfw:comment><comments>http://www.blogjava.net/alinglau36/archive/2009/02/17/255045.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/alinglau36/comments/commentRss/255045.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alinglau36/services/trackbacks/255045.html</trackback:ping><description><![CDATA[<h1>如何避免在Java中使用Checked Exception  </h1>
<table style="margin: 2px 0px 20px;" width="560" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td bgcolor="#b1bcc0" height="1"><br />
            </td>
        </tr>
    </tbody>
</table>
<table style="margin-bottom: 20px;" width="560" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td align="center">发布时间：2007.08.20 08:52&nbsp;&nbsp;&nbsp;&nbsp; 来源：赛迪网&nbsp;&nbsp;&nbsp;&nbsp;作者：dxaw</td>
        </tr>
    </tbody>
</table>
<span id="zoom" class="a14c">
<p style="text-indent: 2em;">这
篇文章指出了Java中checked Exception的一些缺点，提出应该在程序设计中避免使用checked
Exception,对于需要处理checked Exception的代码，可以使用ExceptionAdapter这个类对checked
Exception进行包装。这篇文章的概念和ExceptionAdapter这个类均源自Bruce Eckel的Does Java need
Checked Exception。
</p>
<p style="text-indent: 2em;">Java的Exception分为两类，一类是RuntimeException及
其子类，另外一类就是checked Exception。Java要求函数对没有被catch处理掉的checked
Exception，需要将其写在函数的声明部分。然而，这一要求常常给程序员带来一些不必要的负担。
</p>
<p style="text-indent: 2em;">为了避免在函数声明中写throws部分，在Java项目里面常常可以看到以下代码用来&#8216;吞掉&#8217;Exception：
</p>
<center><ccid_nobr>
<table bordercolorlight="black" bordercolordark="#FFFFFF" width="400" align="center" border="1" cellpadding="2" cellspacing="0">
    <tbody>
        <tr>
            <td style="font-size: 9pt;" bgcolor="#e6e6e6">
            <pre><ccid_code>try {<br />
            <br />
            <br />
            <br />
            // ...<br />
            <br />
            <br />
            <br />
            } catch (Exception ex) {<br />
            <br />
            <br />
            <br />
            ex.printStackTrace(); <br />
            <br />
            <br />
            <br />
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr></center>
<p style="text-indent: 2em;">这显然不是一个好的处理Exception办法，事实上，catch并处理一个Exception意味着让程序从发生的错误(Exception)中恢复过来。从这种意义上说，已上的代码只可能在一些很简单的情况下工作而不带来问题。
</p>
<p style="text-indent: 2em;">对于很多Exception，往往没有去处理它并让程序从错误中恢复出来的办法，这
时唯一能做的事情可能就是在界面上显示一些提示信息给用户。这种情况下让程序抛出遇到的Exception是更为合理的做法。然而，这样做会使得一些函数
的声明急剧膨胀。一个函数可能需要声明会抛出的7、8个checked Exception，而且每个调用它的函数也需要同样的声明。
</p>
<p style="text-indent: 2em;">比这更糟糕的是，这有可能破坏类设计的open-close原则。简单来
说，open-close原则是指当扩展一个模块的时候，可以不影响其现有的client。open-close原则是通过继承来实现的，当继承一个类的
时候，我们既扩展了这个类，也不会影响原有的client（因为对这个类没有改动）。
</p>
<p style="text-indent: 2em;">现在考虑下面这种情况，有一个父类Base：
</p>
<center><ccid_nobr>
<table bordercolorlight="black" bordercolordark="#FFFFFF" width="400" align="center" border="1" cellpadding="2" cellspacing="0">
    <tbody>
        <tr>
            <td style="font-size: 9pt;" bgcolor="#e6e6e6">
            <pre><ccid_code>public class Base {<br />
            <br />
            public void foo() throws ExceptionA {<br />
            <br />
            // ...<br />
            <br />
            }<br />
            <br />
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr></center>
<p style="text-indent: 2em;">现在需要继承Base这个类并重载foo这个方法，在新的实现中，foo可能抛出ExceptionB：
</p>
<center><ccid_nobr>
<table bordercolorlight="black" bordercolordark="#FFFFFF" width="400" align="center" border="1" cellpadding="2" cellspacing="0">
    <tbody>
        <tr>
            <td style="font-size: 9pt;" bgcolor="#e6e6e6">
            <pre><ccid_code>public class Extend extends Base {<br />
            <br />
            public void foo() throws ExceptionB {<br />
            <br />
            // ...<br />
            <br />
            }<br />
            <br />
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr></center>
<p style="text-indent: 2em;">然而，这样写在Java里面是不合法的，因为Java把可能会抛出的Exception看作函数特征的一部分，子类声明抛出的Exception必须是父类的子集。
</p>
<p style="text-indent: 2em;">可以在Base类的foo方法中加入抛出ExceptionB的声明，然而，这样就破坏了open-close原则。而且，有时我们没有办法去修改父类，比如当重载一个Jdk里的类的时候。
</p>
<p style="text-indent: 2em;">另一个可能的做法是在Extend的foo方法中catch住ExceptionB，然后构造一个ExceptionA并抛出。这是个可行的办法但也只是一个权宜之计。
</p>
<p style="text-indent: 2em;">如果使用RuntimeException，这些问题都不会存在。这说明
checked
Exception并不是一个很实用的概念，也意味着在程序设计的时候，我们应该让自己的Exception类继承RuntimeException而不
是Exception。（这和JDK的建议正好相反，但实践证明这样做代码的质量更好。）
</p>
<p style="text-indent: 2em;">对于那些需要处理checked
Exception的代码，可以利用一个ExceptionAdapter的类把checked
Exception包装成一个RuntimeException抛出。ExceptionAdapter来自Bruce Eckel的Does
Java need Checked Exception这篇文章，在这里的ExceptionAdapter是我根据JDK 1.4修改过的：
</p>
<center><ccid_nobr>
<table bordercolorlight="black" bordercolordark="#FFFFFF" width="400" align="center" border="1" cellpadding="2" cellspacing="0">
    <tbody>
        <tr>
            <td style="font-size: 9pt;" bgcolor="#e6e6e6">
            <pre><ccid_code>public class ExceptionAdapter extends RuntimeException {<br />
            <br />
            <br />
            <br />
            public ExceptionAdapter(Exception ex) {<br />
            <br />
            <br />
            <br />
            super(ex); <br />
            <br />
            }<br />
            <br />
            <br />
            <br />
            public void printStackTrace(java.io.PrintStream s) { <br />
            <br />
            <br />
            <br />
            getCause().printStackTrace(s); <br />
            <br />
            }<br />
            <br />
            <br />
            <br />
            public void printStackTrace(java.io.PrintWriter s) { <br />
            <br />
            <br />
            <br />
            getCause().printStackTrace(s); <br />
            <br />
            <br />
            <br />
            }<br />
            <br />
            <br />
            <br />
            // rethrow()的作用是把被包装的Exception再次抛出。<br />
            <br />
            <br />
            <br />
            public void rethrow() <br />
            <br />
            throws Exception<br />
            <br />
            {<br />
            <br />
            throw (Exception) getCause(); <br />
            <br />
            }<br />
            <br />
            <br />
            <br />
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr></center>
<p style="text-indent: 2em;">（责任编辑：编辑龚勋）
</p>
</span>
<img src ="http://www.blogjava.net/alinglau36/aggbug/255045.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alinglau36/" target="_blank">lau</a> 2009-02-17 11:18 <a href="http://www.blogjava.net/alinglau36/archive/2009/02/17/255045.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>