﻿<?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-水煮三国-文章分类-J2EE</title><link>http://www.blogjava.net/os586/category/13305.html</link><description>态度决定一切，思想决定出路</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 10:53:25 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 10:53:25 GMT</pubDate><ttl>60</ttl><item><title>JAVA当中的值传递</title><link>http://www.blogjava.net/os586/articles/59430.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Fri, 21 Jul 2006 07:54:00 GMT</pubDate><guid>http://www.blogjava.net/os586/articles/59430.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/59430.html</wfw:comment><comments>http://www.blogjava.net/os586/articles/59430.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/59430.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/59430.html</trackback:ping><description><![CDATA[值传递是在一个函数中，调用另外一个函数，其中含有参数传递的情况。往往值传递就是把数据传递到另外一个函数中进行进一步处理，以更清楚地显示函数的表达意思。在函数调用的时候会有数据传递，同样要考虑形参和实参的问题，如下面的一个程序：
<table cellspacing="0" cellpadding="0" width="0" align="right" border="0"><tbody><tr><td align="middle"></td></tr><tr><td><!--start banner ad--><!--ba--><script language="JavaScript1.1" src="http://ad.cn.doubleclick.net/adj/messagingplus.zdnet.com.cn/developer/code;sz=1x1;ord=1364206921?"></script><script src="http://m.cn.2mdn.net/879366/dartRichMedia_1_03.js"></script><!-- Sniffer Code for Flash 5 --><script language="VBScript"><![CDATA[
on error resume next 
ShockMode = (IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash.5")))
]]&gt;</script><noembed><a href="http://ad.cn.doubleclick.net/click%3Bh=v5|33d0|3|0|%2a|r%3B29568033%3B0-0%3B0%3B6694709%3B31-1|1%3B15525937|15543833|1%3B%3B%7Esscs%3D%3fhttp%3a%2f%2fwww.site.com" target="_blank"><img src="/upimg/2006-05-07/142825_09_534.gif" width="468" height="60" border="0" /></a></noembed><noscript><a href="http://ad.cn.doubleclick.net/click%3Bh=v5|33d0|3|0|%2a|r%3B29568033%3B0-0%3B0%3B6694709%3B31-1|1%3B15525937|15543833|1%3B%3B%7Esscs%3D%3fhttp%3a%2f%2fwww.site.com" target="_blank"><img src="/upimg/2006-05-07/142825_09_534.gif" width="468" height="60" border="0" /></a></noscript><noscript><a href="http://ad.cn.doubleclick.net/jump/messagingplus.zdnet.com.cn/developer/code;sz=1x1;ord=1364206921?"><img src="/upimg/2006-05-07/142827_010_923.cn/developer/code;sz=1x1;ord=1364206921?" border="0" /></a></noscript><!--end banner ad--></td></tr></tbody></table><p><font color="#0066ff">public class PassTest</font></p><p><font color="#0066ff">{</font></p><p><font color="#0066ff">    float ptValue; </font></p><p><font color="#0066ff">     public void changeInt (int value) </font></p><p><font color="#0066ff">    { </font></p><p><font color="#0066ff">           value = 55; </font></p><p><font color="#0066ff">    } </font></p><p><font color="#0066ff">     public void changeStr (String value) </font></p><p><font color="#0066ff">    { </font></p><p><font color="#0066ff">           value = new String ("different"); </font></p><p><font color="#0066ff">    } </font></p><p><font color="#0066ff">    public void changeObjValue (PassTest ref) </font></p><p><font color="#0066ff">    { </font></p><p><font color="#0066ff">           ref.ptValue = 99f; </font></p><p><font color="#0066ff">    } </font></p><p><font color="#0066ff">    public static void main (String args[]) </font></p><p><font color="#0066ff">    { </font></p><p><font color="#0066ff">           String str; </font></p><p><font color="#0066ff">           intval; </font></p><p><font color="#0066ff">           PassTest pt = new PassTest (); </font></p><p><font color="#0066ff">           val = 11; </font></p><p><font color="#0066ff">           pt.changeInt (val); </font></p><p><font color="#0066ff">           System.out.println ("Int value is: " + val); </font></p><p><font color="#0066ff">           str = new String ("Hello"); </font></p><p><font color="#0066ff">           pt.changeStr (str); </font></p><p><font color="#0066ff">           System.out.println ("Str value is: " + str); </font></p><p><font color="#0066ff">           pt.ptValue = 101f; </font></p><p><font color="#0066ff">           pt.changeObjValue (pt); </font></p><p><font color="#0066ff">           System.out.println ("Current ptValue is: " + pt.ptValue); </font></p><p><font color="#0066ff">     } </font></p><p><font color="#0066ff">}</font></p><p>　　这个程序最后输出的结果将是：</p><p>　　11</p><p>　　Hello</p><p>　　99f</p><p>　　开始的11和Hello就是遵循参数传递的原则，虽然改变了形参的值，但是实参却不改变，这同C语言中是一样的。那么如果想改变函数中的实参的值，那么应该怎么做呢？我们知道，在C语言中，我们可以采用指针变量，用指针变量作为函数的参数，那么这样，传递的就是参数存放的地址，那么在函数中改变同一地址的参数值的时候，就不会发生错误，可是，在java中没有指针的说法，那么，要实现上述C语言的做法，应该怎么处理呢？我们知道，java中处处都是考虑对象的，句柄是用来操作对象的活动的，那么我们如果将对象的句柄传递到函数中去，就可以使两者指向同一个句柄（也就是地址），这样就可以完成数据的修改了。见上面的程序，我们可以知道，pt是主函数中创建的PassTest的对象，通过传递它，就可以完成地址的传递，子函数中，ref与主函数的pt指向的其实是一个内存单元，那么修改ref中的ptValue的值，也就是修改pt中的ptValue的值，即使没有最后的数据返回，这个数据也是会改变的。</p><img src ="http://www.blogjava.net/os586/aggbug/59430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-07-21 15:54 <a href="http://www.blogjava.net/os586/articles/59430.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于值传递与引用传递的知识</title><link>http://www.blogjava.net/os586/articles/59427.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Fri, 21 Jul 2006 07:46:00 GMT</pubDate><guid>http://www.blogjava.net/os586/articles/59427.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/59427.html</wfw:comment><comments>http://www.blogjava.net/os586/articles/59427.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/59427.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/59427.html</trackback:ping><description><![CDATA[关于对值传递与引用传递我一直似是而非。<br /><br />今天有个朋友问起我这个问题的时候我还是很困惑。<br /><br />对值传递我还是用一个例子来说明一下吧：<br /><br />/* 例 1 */<br />/**<br />* @(#) Test.java<br />* @author fancy<br />*/<br />public class Test {<br />public static void test(boolean test) {<br />test = ! test;<br />System.out.println("In test(boolean) : test = " + test);<br />}<br />public static void main(String[] args) {<br />boolean test = true;<br />System.out.println("Before test(boolean) : test = " + test);<br />test(test);<br />System.out.println("After test(boolean) : test = " + test);<br />}<br />}<br />　　运行结果：<br />Before test(boolean) : test = true<br />In test(boolean) : test = false<br />After test(boolean) : test = true<br />　　不难看出，虽然在 test(boolean) 方法中改变了传进来的参数的值，但对这个参数源变量本身并没有影响，即对 main(String[]) 方法里的 test 变量没有影响。那说明，参数类型是简单类型的时候，是按值传递的。以参数形式传递简单类型的变量时，实际上是将参数的值作了一个拷贝传进方法函数的，那么在方法函数里再怎么改变其值，其结果都是只改变了拷贝的值，而不是源值。<br /><br />Java 是传值还是传引用，问题主要出在对象的传递上，因为 Java 中简单类型没有引用。既然争论中提到了引用这个东西，为了搞清楚这个问题，我们必须要知道引用是什么。<br />　　简单的说，引用其实就像是一个对象的名字或者别名 (alias)，一个对象在内存中会请求一块空间来保存数据，根据对象的大小，它可能需要占用的空间大小也不等。访问对象的时候，我们不会直接是访问对象在内存中的数据，而是通过引用去访问。引用也是一种数据类型，我们可以把它想象为类似 C 语言中指针的东西，它指示了对象在内存中的地址——只不过我们不能够观察到这个地址究竟是什么。<br />　　如果我们定义了不止一个引用指向同一个对象，那么这些引用是不相同的，因为引用也是一种数据类型，需要一定的内存空间来保存。但是它们的值是相同的，都指示同一个对象在内存的中位置。比如<br />String a = "Hello";<br />String b = a;<br />　　这里，a 和 b 是不同的两个引用，我们使用了两个定义语句来定义它们。但它们的值是一样的，都指向同一个对象 "Hello"。也许你还觉得不够直观，因为 String 对象的值本身是不可更改的 (像 b = "World"; b = a; 这种情况不是改变了 "World" 这一对象的值，而是改变了它的引用 b 的值使之指向了另一个 String 对象 a)。那么我们用 StringBuffer 来举一个例子：<br />/* 例 2 */<br />/**<br />* @(#) Test.java<br />* @author fancy<br />*/<br />public class Test {<br />public static void main(String[] args) {<br />StringBuffer a = new StringBuffer("Hello");<br />StringBuffer b = a;<br />b.append(", World");<br />System.out.println("a is " + a);<br />}<br />}<br />　　运行结果：<br />a is Hello, World<br />　　这个例子中 a 和 b 都是引用，当改变了 b 指示的对象的值的时候，从输出结果来看，a 所指示的对象的值也改变了。所以，a 和 b 都指向同一个对象即包含 "Hello" 的一个 StringBuffer 对象。<br />　　这里我描述了两个要点：<br />1. 引用是一种数据类型，保存了对象在内存中的地址，这种类型即不是我们平时所说的简单数据类型也不是类实例(对象)； <br />2. 不同的引用可能指向同一个对象，换句话说，一个对象可以有多个引用，即该类类型的变量。<br />3. 对象是如何传递的呢<br />　　关于对象的传递，有两种说法，即“它是按值传递的”和“它是按引用传递的”。这两种说法各有各的道理，但是它们都没有从本质上去分析，即致于产生了争论。 　　既然现在我们已经知道了引用是什么东西，那么现在不妨来分析一下对象作是参数是如何传递的。还是先以一个程序为例：<br />/* 例 3 */<br />/**<br />* @(#) Test.java<br />* @author fancy<br />*/<br />public class Test {<br />public static void test(StringBuffer str) {<br />str.append(", World!");<br />}<br />public static void main(String[] args) {<br />StringBuffer string = new StringBuffer("Hello");<br />test(string);<br />System.out.println(string);<br />}<br />}<br />　　运行结果：<br />Hello, World!<br />　　test(string) 调用了 test(StringBuffer) 方法，并将 string 作为参数传递了进去。这里 string 是一个引用，这一点是勿庸置疑的。前面提到，引用是一种数据类型，而且不是对象，所以它不可能按引用传递，所以它是按值传递的，它么它的值究竟是什么呢？是对象的地址。<br />　　由此可见，对象作为参数的时候是按值传递的，对吗？错！为什么错，让我们看另一个例子：<br />/* 例 4 */<br />/**<br />* @(#) Test.java<br />* @author fancy<br />*/<br />public class Test {<br />public static void test(String str) {<br />str = "World";<br />}<br />public static void main(String[] args) {<br />String string = "Hello";<br />test(string);<br />System.out.println(string);<br />}<br />}<br />　　运行结果：<br />Hello<br />　　为什么会这样呢？因为参数 str 是一个引用，而且它与 string 是不同的引用，虽然它们都是同一个对象的引用。str = "World" 则改变了 str 的值，使之指向了另一个对象，然而 str 指向的对象改变了，但它并没有对 "Hello" 造成任何影响，而且由于 string 和 str 是不同的引用，str 的改变也没有对 string 造成任何影响，结果就如例中所示。<br />　　其结果是推翻了参数按值传递的说法。那么，对象作为参数的时候是按引用传递的了？也错！因为上一个例子的确能够说明它是按值传递的。<br />　　结果，就像光到底是波还是粒子的问题一样，Java 方法的参数是按什么传递的问题，其答案就只能是：即是按值传递也是按引用传递，只是参照物不同，结果也就不同。<br /><img src ="http://www.blogjava.net/os586/aggbug/59427.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-07-21 15:46 <a href="http://www.blogjava.net/os586/articles/59427.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于tomcat中文显示的问题的Filter解决方案</title><link>http://www.blogjava.net/os586/articles/59343.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Fri, 21 Jul 2006 01:22:00 GMT</pubDate><guid>http://www.blogjava.net/os586/articles/59343.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/59343.html</wfw:comment><comments>http://www.blogjava.net/os586/articles/59343.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/59343.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/59343.html</trackback:ping><description><![CDATA[
		<font face="Courier New" size="2">大多数人对tomcat的中文都是对字符的转换来完成的。<br /><br />现在我们使用Filter来完成。<br /><br />使用tomcat自带的Servlet下的Filter文件夹下的setCharacterEncodingFilter.java,RequestDumpFilter.java这两个类来完成 我们的中文显示功能是非常有用的。<br /><br />在自己的应用程序下的web.xml当中这样设置：<br /><br /><br /><br /> &lt;filter&gt;<br /><br />   &lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<br /><br />   &lt;filter-class&gt;com.wrox.filter.setCharacterEncodingFilter.java&lt;/filter-class&gt;<br /><br />      &lt;init-param&gt;<br /><br />         &lt;param-name&gt;encoding&lt;/param-name&gt;<br /><br />         &lt;param-value&gt;GBK&lt;/param-value&gt;<br /><br />      &lt;/init-param&gt;<br /><br /><br /><br />&lt;/filter&gt;<br /><br />&lt;filter-mapping&gt;<br /><br />   &lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<br /><br />   &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br /><br />&lt;/filter-mapping&gt;<br /><br /><br /><br /><br />同时 在JSP文件当中加入<br /><br /><a href="mailto:%@page contentType=&quot;text/html;charset=GBK&quot;">%@page contentType="text/html;charset=GBK"</a>%&gt;<br /><br />&lt;META http-equiv="Content-Type content="text/html;charset=GBK"&gt;<br /><br /><br /><br /></font>
<img src ="http://www.blogjava.net/os586/aggbug/59343.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-07-21 09:22 <a href="http://www.blogjava.net/os586/articles/59343.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>