﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-JAVA</title><link>http://www.blogjava.net/lcgg110/</link><description>java</description><language>zh-cn</language><lastBuildDate>Mon, 04 May 2026 21:35:52 GMT</lastBuildDate><pubDate>Mon, 04 May 2026 21:35:52 GMT</pubDate><ttl>60</ttl><item><title>java---final 关键字 和 static 用法 </title><link>http://www.blogjava.net/lcgg110/archive/2008/07/02/212072.html</link><dc:creator> 超凡</dc:creator><author> 超凡</author><pubDate>Wed, 02 Jul 2008 02:27:00 GMT</pubDate><guid>http://www.blogjava.net/lcgg110/archive/2008/07/02/212072.html</guid><wfw:comment>http://www.blogjava.net/lcgg110/comments/212072.html</wfw:comment><comments>http://www.blogjava.net/lcgg110/archive/2008/07/02/212072.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcgg110/comments/commentRss/212072.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcgg110/services/trackbacks/212072.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt"><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final 关键字 和 static 用法</span><br />
<br />
<p><strong>一、final</strong> <br />
根据程序上下文环境，Java<nobr oncontextmenu="return false;" onmousemove="kwM(1);" id="key1" onmouseover="kwE(event,1, this);" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">关键</nobr>字final有&#8220;这是无法改变的&#8221;或者&#8220;终态的&#8221;含义，它可以修饰非抽象类、非抽象类成员<nobr oncontextmenu="return false;" onmousemove="kwM(3);" id="key2" onmouseover="kwE(event,3, this);" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">方法</nobr>和变量。你可能出于两种理解而需要阻止改变：设计或效率。</p>
final类不能被继承，没有子类，final类中的方法默认是final的。 <br />
final方法不能被子类的方法覆盖，但可以被继承。 <br />
final成员变量表示常量，只能被赋值一次，赋值后值不再改变。 <br />
final不能用于修饰构造方法。 <br />
注意：父类的private成员方法是不能被子类方法覆盖的，因此private类型的方法默认是final类型的。 <br />
<br />
<strong>1、final类</strong> <br />
&nbsp;&nbsp;&nbsp; final类不能被继承，因此final类的成员方法没有机会被覆盖，默认都是final的。在设计类时候，如果这个类不需要有子类，类的实现
<div class="left_3" id="artcnt"><nobr oncontextmenu="return false;" onmousemove="kwM(0);" id="key0" onmouseover="kwE(event,0, this);" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">细节</nobr>不允许改变，并且确信这个类不会载被扩展，那么就设计为final类。 <br />
<br />
2、final方法 <br />
如果一个类不允许其子类覆盖某个方法，则可以把这个方法声明为final方法。 <br />
<strong>使用final方法的原因有二：</strong> <br />
第一、把方法锁定，防止任何继承类修改它的意义和实现。 <br />
第二、高效。编译器在遇到调用final方法时候会转入内嵌机制，大大提高执行效率。 <br />
例如：
<p>&nbsp;</p>
<table bordercolor="#cccccc" cellspacing="0" cellpadding="3" width="500" align="center" bgcolor="#f3f3f3" border="1" heihgt="">
    <tbody>
        <tr>
            <td>public class Test1 { <br />
            <br />
            public static void main(String[] args) { <br />
            // TODO 自动生成方法存根 <br />
            } <br />
            <br />
            public void f1() { <br />
            System.out.println("f1"); <br />
            } <br />
            //无法被子类覆盖的方法 <br />
            public final void f2() { <br />
            System.out.println("f2"); <br />
            } <br />
            <br />
            public void f3() { <br />
            System.out.println("f3"); <br />
            } <br />
            <br />
            private void f4() { <br />
            System.out.println("f4"); <br />
            } <br />
            } <br />
            <br />
            public class Test2 extends Test1 { <br />
            <br />
            public void f1(){ <br />
            System.out.println("Test1父类方法f1被覆盖!"); <br />
            } <br />
            <br />
            public static void main(String[] args) { <br />
            Test2 t=new Test2(); <br />
            t.f1(); <br />
            t.f2(); //调用从父类继承过来的final方法 <br />
            t.f3(); //调用从父类继承过来的方法 <br />
            //t.f4(); //调用失败，无法从父类继承获得 <br />
            <br />
            } <br />
            }&nbsp;</td>
        </tr>
    </tbody>
</table>
<p><br />
<strong>3、final变量（常量）</strong> <br />
&nbsp;&nbsp;&nbsp; 用final修饰的成员变量表示常量，值一旦给定就无法改变！ <br />
&nbsp;&nbsp;&nbsp; final修饰的变量有三种：静态变量、实例变量和局部变量，分别表示三种类型的常量。 <br />
&nbsp;&nbsp;&nbsp; 从下面的例子中可以看出，一旦给final变量初值后，值就不能再改变了。 <br />
&nbsp;&nbsp;&nbsp; 另外，final变量定义的时候，可以先声明，而不给初值，这中变量也称为final空白，无论什么情况，编译器都确保空白final在使用之前必须被初始化。但是，final空白在final关键字final的使用上提供了更大的灵活性，为此，一个类中的final<nobr oncontextmenu="return false;" onmousemove="kwM(5);" id="key4" onmouseover="kwE(event,5, this);" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">数据</nobr>成员就可以实现依对象而有所不同，却有保持其恒定不变的特征。</p>
<p>&nbsp;</p>
<table bordercolor="#cccccc" cellspacing="0" cellpadding="3" width="500" align="center" bgcolor="#f3f3f3" border="1" heihgt="">
    <tbody>
        <tr>
            <td>package org.leizhimin; <br />
            <br />
            public class Test3 { <br />
            private final String S="final实例变量S"; <br />
            private final int A=100; <br />
            public final int B=90; <br />
            <br />
            public static final int C=80; <br />
            private static final int D=70; <br />
            <br />
            public final int E; //final空白,必须在初始化对象的时候赋初值 <br />
            <br />
            public Test3(int x){ <br />
            E=x; <br />
            } <br />
            <br />
            /** <br />
            * @param args <br />
            */ <br />
            public static void main(String[] args) { <br />
            Test3 t=new Test3(2); <br />
            //t.A=101; //出错,final变量的值一旦给定就无法改变 <br />
            //t.B=91; //出错,final变量的值一旦给定就无法改变 <br />
            //t.C=81; //出错,final变量的值一旦给定就无法改变 <br />
            //t.D=71; //出错,final变量的值一旦给定就无法改变 <br />
            <br />
            System.out.println(t.A); <br />
            System.out.println(t.B); <br />
            System.out.println(t.C); //不推荐用对象方式访问静态字段 <br />
            System.out.println(t.D); //不推荐用对象方式访问静态字段 <br />
            System.out.println(Test3.C); <br />
            System.out.println(Test3.D); <br />
            //System.out.println(Test3.E); //出错,因为E为final空白,依据不同对象值有所不同. <br />
            System.out.println(t.E); <br />
            <br />
            Test3 t1=new Test3(3); <br />
            System.out.println(t1.E); //final空白变量E依据对象的不同而不同 <br />
            } <br />
            <br />
            private void test(){ <br />
            System.out.println(new Test3(1).A); <br />
            System.out.println(Test3.C); <br />
            System.out.println(Test3.D); <br />
            } <br />
            <br />
            public void test2(){ <br />
            final int a; //final空白,在需要的时候才赋值 <br />
            final int b=4; //局部常量--final用于局部变量的情形 <br />
            final int c; //final空白,一直没有给赋值. <br />
            a=3; <br />
            //a=4; 出错,已经给赋过值了. <br />
            //b=2; 出错,已经给赋过值了. <br />
            } <br />
            }&nbsp;</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;<br />
<strong>4、final参数</strong> <br />
当<nobr oncontextmenu="return false;" onmousemove="kwM(6);" id="key5" onmouseover="kwE(event,6, this);" style="color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">函数</nobr>参数为final类型时，你可以读取使用该参数，但是无法改变该参数的值。</p>
<p>&nbsp;</p>
<table bordercolor="#cccccc" cellspacing="0" cellpadding="3" width="500" align="center" bgcolor="#f3f3f3" border="1" heihgt="">
    <tbody>
        <tr>
            <td>public class Test4 { <br />
            public static void main(String[] args) { <br />
            new Test4().f1(2); <br />
            } <br />
            <br />
            public void f1(final int i){ <br />
            //i++; //i是final类型的,值不允许改变的. <br />
            System.out.print(i); <br />
            } <br />
            }&nbsp;</td>
        </tr>
    </tbody>
</table>
<br />
<br />
<br />
<strong>二、static</strong> <br />
<br />
&nbsp;&nbsp;&nbsp; static表示&#8220;全局&#8221;或者&#8220;静态&#8221;的意思，用来修饰成员变量和成员方法，也可以形成静态static代码块，但是Java语言中没有全局变量的概念。<br />
&nbsp;&nbsp;&nbsp; 被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说，它不依赖类特定的实例，被类的所有实例共享。只要这个类被加载， Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此，static对象可以在它的任何对象创建之前访问，无需引用任何对象。 <br />
<br />
&nbsp;&nbsp;&nbsp; 用public修饰的static成员变量和成员方法本质是全局变量和全局方法，当声明它类的对象市，不生成static变量的副本，而是类的所有实例共享同一个static变量。 <br />
<br />
&nbsp;&nbsp;&nbsp; static 变量前可以有private修饰，表示这个变量可以在类的静态代码块中，或者类的其他静态成员方法中使用（当然也可以在非静态成员方法中使用--废话），但是不能在其他类中通过类名来直接引用，这一点很重要。实际上你需要搞明白，private是访问权限限定，static表示不要实例化就可以使用，这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。 <br />
<br />
&nbsp;&nbsp;&nbsp; static修饰的成员变量和成员方法习惯上称为静态变量和静态方法，可以直接通过类名来访问，访问语法为： <br />
类名.静态方法名(参数列表...) <br />
类名.静态变量名 <br />
<br />
用static修饰的代码块表示静态代码块，当Java虚拟机（JVM）加载类时，就会执行该代码块（用处非常大，呵呵）。 <br />
<br />
<strong>1、static变量</strong> <br />
按照是否静态的对类成员变量进行分类可分两种：一种是被static修饰的变量，叫静态变量或类变量；另一种是没有被static修饰的变量，叫实例变量。两者的区别是： <br />
对于静态变量在内存中只有一个拷贝（节省内存），JVM只为静态分配一次内存，在加载类的过程中完成静态变量的内存分配，可用类名直接访问（方便），当然也可以通过对象来访问（但是这是不推荐的）。 <br />
对于实例变量，没创建一个实例，就会为实例变量分配一次内存，实例变量可以在内存中有多个拷贝，互不影响（灵活）。 <br />
<br />
<strong>2、静态方法</strong> <br />
&nbsp;&nbsp;&nbsp;&nbsp; 静态方法可以直接通过类名调用，任何的实例也都可以调用，因此静态方法中不能用this和super关键字，不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法)，只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联！这个需要去理解，想明白其中的道理，不是记忆！！！ <br />
&nbsp;&nbsp;&nbsp; 因为static方法独立于任何实例，因此static方法必须被实现，而不能是抽象的abstract。 <br />
<br />
<strong>3、static代码块</strong> <br />
&nbsp;&nbsp;&nbsp; static 代码块也叫静态代码块，是在类中独立于类成员的static语句块，可以有多个，位置可以随便放，它不在任何的方法体内，JVM加载类时会执行这些静态的代码块，如果static代码块有多个，JVM将按照它们在类中出现的先后顺序依次执行它们，每个代码块只会被执行一次。例如：
<p>&nbsp;</p>
<table bordercolor="#cccccc" cellspacing="0" cellpadding="3" width="500" align="center" bgcolor="#f3f3f3" border="1" heihgt="">
    <tbody>
        <tr>
            <td>public class Test5 { <br />
            private static int a; <br />
            private int b; <br />
            <br />
            static{ <br />
            Test5.a=3; <br />
            System.out.println(a); <br />
            Test5 t=new Test5(); <br />
            t.f(); <br />
            t.b=1000; <br />
            System.out.println(t.b); <br />
            } <br />
            static{ <br />
            Test5.a=4; <br />
            System.out.println(a); <br />
            } <br />
            public static void main(String[] args) { <br />
            // TODO 自动生成方法存根 <br />
            } <br />
            static{ <br />
            Test5.a=5; <br />
            System.out.println(a); <br />
            } <br />
            public void f(){ <br />
            System.out.println("hhahhahah"); <br />
            } <br />
            }&nbsp;</td>
        </tr>
    </tbody>
</table>
&nbsp;<br />
<br />
运行结果： <br />
3 <br />
hhahhahah <br />
1000 <br />
4 <br />
5 <br />
<br />
&nbsp;&nbsp;&nbsp; 利用静态代码块可以对一些static变量进行赋值，最后再看一眼这些例子，都一个static的main方法，这样JVM在运行main方法的时候可以直接调用而不用创建实例。 <br />
<br />
<strong>4、static和final一块用表示什么</strong> <br />
static final用来修饰成员变量和成员方法，可简单理解为&#8220;全局常量&#8221;！ <br />
对于变量，表示一旦给值就不可修改，并且通过类名可以访问。 <br />
对于方法，表示不可覆盖，并且可以通过类名直接访问。<br />
<br />
http://www.blogjava.net/hongzionline/archive/2007/09/19/146392.html<br />
</span></div>
<img src ="http://www.blogjava.net/lcgg110/aggbug/212072.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcgg110/" target="_blank"> 超凡</a> 2008-07-02 10:27 <a href="http://www.blogjava.net/lcgg110/archive/2008/07/02/212072.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中参数传递是传值还是传址？ </title><link>http://www.blogjava.net/lcgg110/archive/2008/06/27/211118.html</link><dc:creator> 超凡</dc:creator><author> 超凡</author><pubDate>Fri, 27 Jun 2008 05:55:00 GMT</pubDate><guid>http://www.blogjava.net/lcgg110/archive/2008/06/27/211118.html</guid><wfw:comment>http://www.blogjava.net/lcgg110/comments/211118.html</wfw:comment><comments>http://www.blogjava.net/lcgg110/archive/2008/06/27/211118.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcgg110/comments/commentRss/211118.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcgg110/services/trackbacks/211118.html</trackback:ping><description><![CDATA[<p><strong>什么是值传递?什么是引用传递?<br />
</strong><br />
值传递是将要传递的值作为一副本传递.如 <br />
&nbsp;&nbsp;&nbsp;&nbsp; int i=4;<br />
&nbsp;&nbsp;&nbsp;&nbsp; int j=i;<br />
&nbsp;&nbsp;&nbsp;&nbsp; 这里相当于把14复制了一个副本给j,结果是i=4,j=4</p>
<p>引用传递,传递的是引用对象的内存地址 <br />
&nbsp;&nbsp;&nbsp;&nbsp; int *p,*p1; <br />
&nbsp;&nbsp;&nbsp;&nbsp; int j=5; *p=j; //这里是把j在内存当中的地址赋给了指针p <br />
&nbsp;&nbsp;&nbsp;&nbsp; p1=p;&nbsp; //这里是把指针p中保存的地址(就是j的地址)赋给了指针p1 <br />
&nbsp;&nbsp;&nbsp;&nbsp; j=4; //这里改变j的值 输出结果是 j=4 , *p=4 , *p1=4 //因为p和p1指向的都是j 所以他们的值随j值改变 <br />
(以上说明和代码来自http://zhidao.baidu.com/question/31191252.html)</p>
<br />
<strong>Java中函数参数的传递是值传递还是引用传递？ <br />
</strong><br />
Java中参数传递时传递到函数中的参数都是原变量的一份拷贝，对于非类类型如int，float等，这份拷贝自然和原变量脱离了关系，这不难理解；<br />
而对于类的实例而言，这份拷贝恰巧是实例引用的拷贝，它（参数）指向的实例地址和原实例引用指向的实例地址都是一样的，因此对参数的修改有时也会影响到实例本身，故此造成了Java传递类实例是传递的引用即地址的假象，如下面例子中的changeMemberField函数，但是我们把参数指向的地址改到别的实例上时，如changeMember函数，我们会发现参数和原实例引用再也不会发生关系了，这里证明Java中参数传递是完完全全是传值而不是传址。 <br />
<br />
例子代码：<br />
<br />
代码：<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0,0,255)">package</span><span style="color: rgb(0,0,0)">&nbsp;com.sitinspring;<br />
<br />
</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;ChangeClass{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;changeInt(</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;i){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">5</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;changeLong(</span><span style="color: rgb(0,0,255)">long</span><span style="color: rgb(0,0,0)">&nbsp;i){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">555</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;changeString(String&nbsp;str){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">5555</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;changeMember(Member&nbsp;member){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;member</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;Member(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Cindy</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">,</span><span style="color: rgb(0,0,0)">35</span><span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;changeMemberField(Member&nbsp;member){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;member.setAge(</span><span style="color: rgb(0,0,0)">20</span><span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;member.setName(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Andy</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">static</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;main(String[]&nbsp;args){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ChangeClass&nbsp;changeClass</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;ChangeClass();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;intValue</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">10</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;changeClass.changeInt(intValue);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(intValue);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">long</span><span style="color: rgb(0,0,0)">&nbsp;longValue</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">10</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;changeClass.changeLong(longValue);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(longValue);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;stringValue</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">1234</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;changeClass.changeString(stringValue);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(stringValue);&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;Member&nbsp;member2</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;Member(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Douglas</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">,</span><span style="color: rgb(0,0,0)">45</span><span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;changeClass.changeMember(member2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(member2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Member&nbsp;member</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;Member(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Bill</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">,</span><span style="color: rgb(0,0,0)">25</span><span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;changeClass.changeMemberField(member);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(member);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0,0,255)">package</span><span style="color: rgb(0,0,0)">&nbsp;com.sitinspring;<br />
<br />
</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;Member{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;Member(String&nbsp;name,</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;age){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,0)">.age</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,0)">.name</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;String&nbsp;toString(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Member&nbsp;name=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">name</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;age=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;getAge()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;setAge(</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;age)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,0)">.age&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;String&nbsp;getName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;setName(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,0)">.name&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
}</span></div>
<br />
<strong>输出</strong>：<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0,0,0)">10</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,0)">10</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,0)">1234</span><span style="color: rgb(0,0,0)"><br />
Member&nbsp;name</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">Douglas&nbsp;age</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">45</span><span style="color: rgb(0,0,0)"><br />
Member&nbsp;name</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">Andy&nbsp;age</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">20</span><span style="color: rgb(0,0,0)"><br />
</span></div>
<br />
<strong>解释</strong>：<br />
第一个输出10是因为int是基本类型,传递的参数是intValue的拷贝,对拷贝的修改对原值intValue没有影响.<br />
第一个输出10和上面是一个道理.<br />
第三个输出1234.由于String是类类型, str是stringValue的地址拷贝,参数str指向的地址和stringValue的一致,但在函数changeString 中,由于String的特殊性, str=&#8220;5555&#8221;和str=new String(&#8220;5555&#8221;)是等价的, str指向了新的&#8221;5555&#8221;所在的地址,此句后str就与原来的stringValue彻底脱离了联系.<br />
第四个输出Member?name=Douglas?age=45的道理和上面相同.<br />
第五个输出Member?name=Andy?age=20是因为changeMemberField函数中修改了参数member 的值,也就是修改member指向实例的值,而这个实例正是member指向的值,因此member就变成了name=Andy 且age=20.<br />
<br />
<strong>结论<br />
</strong><br />
Java中参数传递的都是值,对应基本类型,传递的是原值的拷贝;对于类类型,传递的是引用即地址的拷贝.<br />
对于函数对参数的改变是否会影响原值的问题:值类型自然不会影响到原值.而对于类类型要看改变的是参数的地址还是值,如果是前者,参数和原引用指向了不同的地址,它们自然脱离了关系;如果是后者,修改的实例就是原引用指向的实例,这当然对原值进行了修改.<br />
<br />
<strong>代码下载</strong>：<br />
<a href="http://www.blogjava.net/Files/sitinspring/PassValueOrReference20080116142420.rar">http://www.blogjava.net/Files/sitinspring/PassValueOrReference20080116142420.rar</a>
<img src ="http://www.blogjava.net/lcgg110/aggbug/211118.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcgg110/" target="_blank"> 超凡</a> 2008-06-27 13:55 <a href="http://www.blogjava.net/lcgg110/archive/2008/06/27/211118.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>http://www.blogjava.net/hadeslee 学习</title><link>http://www.blogjava.net/lcgg110/archive/2008/06/19/209230.html</link><dc:creator> 超凡</dc:creator><author> 超凡</author><pubDate>Thu, 19 Jun 2008 10:29:00 GMT</pubDate><guid>http://www.blogjava.net/lcgg110/archive/2008/06/19/209230.html</guid><wfw:comment>http://www.blogjava.net/lcgg110/comments/209230.html</wfw:comment><comments>http://www.blogjava.net/lcgg110/archive/2008/06/19/209230.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcgg110/comments/commentRss/209230.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcgg110/services/trackbacks/209230.html</trackback:ping><description><![CDATA[http://www.blogjava.net/hadeslee
<img src ="http://www.blogjava.net/lcgg110/aggbug/209230.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcgg110/" target="_blank"> 超凡</a> 2008-06-19 18:29 <a href="http://www.blogjava.net/lcgg110/archive/2008/06/19/209230.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>可以学习学习</title><link>http://www.blogjava.net/lcgg110/archive/2008/06/17/alexarchive.html</link><dc:creator> 超凡</dc:creator><author> 超凡</author><pubDate>Tue, 17 Jun 2008 07:12:00 GMT</pubDate><guid>http://www.blogjava.net/lcgg110/archive/2008/06/17/alexarchive.html</guid><wfw:comment>http://www.blogjava.net/lcgg110/comments/208630.html</wfw:comment><comments>http://www.blogjava.net/lcgg110/archive/2008/06/17/alexarchive.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcgg110/comments/commentRss/208630.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcgg110/services/trackbacks/208630.html</trackback:ping><description><![CDATA[http://www.blogjava.net/alex/archive/2006/09/06/68148.html<br />
<br />
<br />
<img src ="http://www.blogjava.net/lcgg110/aggbug/208630.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcgg110/" target="_blank"> 超凡</a> 2008-06-17 15:12 <a href="http://www.blogjava.net/lcgg110/archive/2008/06/17/alexarchive.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>