既然您都知道了传值调用和传引用调用的存在,那么咱们就具体看看,他们到底有什么区别吧。
在此之前,楼下的各位,回答问题最好把代码一起贴出来,更直观。也高度锻炼您的语言组织、逻辑思维等等。
首先,您要知道什么是形参和实参。
范例1:形参和实参。[code=java]package org.cxy.demo;
public class Demo {
public static void main(String[] args){
print(30);
}
public static void print(int i){
System.out.println(i);
}
}[/code]实参:在main方法中,的调用语句“print(30)” 中的30就是实参。
形参:在"public static void print(int i)"的方法签名中的“i”就是形参。
在Java中,传值调用和传值调用的区别,取决于方法的形参的数据类型。
传值调用:形参的类型是8种基本类型。如:byte、int、short、long、float、double、boolean、char 。
传引用调用:形参的类型是数组、对象、接口等类型。
范例2:传值调用。[code=java]package org.cxy.demo;
public class Demo {
public static void main(String[] args){
int i = 30;
print(i);
System.out.println("main() --> "+i);
}
public static void print(int j){
j+=1;
System.out.println("print() --> "+j);
}
}[/code]程序输出:[code=java]print() --> 31
main() --> 30[/code]也就是说,传值调用,当形参的值改变时,实参的值并不会改变。
上面的调用过程,和下面的代码是等价的:[code=java]int i = 30;
int j = i;[/code]其实呢,传值调用,就是把实参的值,复制一份交给形参。而此时,形参和实参就是完全不相干的两个人了。之后,形参的死活,与实参的无任何关系。他们相互独立存在。
因此,只要形参的类型是8种基本数据类型,那么方法调用时,就是进行传值调用。
范例3:传引用调用。[code=java]package org.cxy.demo;
public class Demo {
public static void main(String[] args){
StringBuffer str = new StringBuffer("cxy_zy");
print(str);
System.out.println("main() --> "+str);
}
public static void print(StringBuffer sss){
sss.append(" 程序员!");
System.out.println("print() --> "+sss);
}
}[/code]形参的数据类型是:“数组、对象、接口等类型”时,执行方法调用操作,就是再进行传引用调用。说白了,传引用调用,传递的其实就是一个个的“对象”,别忘了哦,8种基本数据类型的数组,也是对象。
file:///D:/a.jpg 画了张图片,我不会上传啊,谁会?
上面的调用过程,和下面的代码是等价的:[code=java]StringBuffer str = new StringBuffer("cxy_zy");
StringBuffer sss = str ; [/code]最初,只有str指向StringBuffer对象,然后程序又将str的值(也就是StringBuffer的内存地址),赋值给了sss,此时,str就和sss共同指向同一个对象了,那么在print方法中,执行“sss.append(" 程序员!");” 时,变量sss改变的StringBuffer对象的值,因此方法调用结束后,在main方法中,str再次引用其所指向的StringBuffer对象时,得到的就是改变之后的值了。
传引用调用的核心:形参和实参共同指向同一块内存空间,二者中的任何一方,若改变这块空间的内容,都将会影响到另一方。
范例4:传引用调用,它也是传递调用。[code=java]package org.cxy.demo;
public class Demo {
public static void main(String[] args){
StringBuffer str = new StringBuffer("cxy_zy");
print(str);
System.out.println("main() --> "+str);
}
public static void print(StringBuffer sss){
sss = new StringBuffer();
sss.append("程序员!");
System.out.println("print() --> "+sss);
}
}[/code]程序运行结果:[code=java]print() --> 程序员!
main() --> cxy_zy[/code]范例3中,执行了“print(str)”语句后,变量str和sss就同时指向一片内存区域了。
但是,在范例4中,多了一句“sss = new StringBuffer("程序员!");” 此时,sss又指向了另一个对象(注意,每个对象在内存中都有自己的空间,因此,此时的sss其实是又指向了另一片空间),若sss修改了新空间中的内容,这并不会影响到str变量所指向的对象。 因为,此时str和sss分别指向的是不同的内存空间了。
各位若觉得写的知识很简单,那么您就别看了,这是给新手看的。
[ 本帖最后由 崔虎 于 2011-07-28 08:56 编辑 ] |