黑马程序员技术交流社区
标题:
传递问题
[打印本页]
作者:
张冉
时间:
2011-7-22 22:27
标题:
传递问题
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递
?
作者:
匿名
时间:
2011-7-22 22:43
public string m(person p){}
public static void main(....){
person per=new person();
per.m(per);
}
new person对象per,per里存放的是person对象在heap中的内存地址,调用m方法,把per
当参数传,m()方法用person p来接收,p=per,这时是把per里存放的内存地址再赋给p,这时
p,per都指向heap中的person对象。
对象作为参数传时,传的是内存地址。
作者:
匿名
时间:
2011-7-22 22:50
对象都是地址引用。
作者:
匿名
时间:
2011-7-22 22:51
对象的传递,赋值,都是把对象的内存地址赋值给一个引用
作者:
匿名
时间:
2011-7-22 22:53
标题:
回复 楼主 的帖子
传递对象就是引用嘛。
作者:
匿名
时间:
2011-7-22 23:01
这里的传递当然是引用的传递了,引用数据类型的参数传递。你可以看下老师的视频里面有讲到的。
作者:
匿名
时间:
2011-7-22 23:49
但凡是传递进去参数,方法运行改变参数后,原来参数发生改变的,都是引用传递。
但凡是传递进去参数,方法运行改变参数后,原来参数未发生改变的,都是值传递。
一般来说,对象都是引用传递。
作者:
匿名
时间:
2011-7-22 23:56
就是传值。地址也是值
作者:
崔虎
时间:
2011-7-23 09:27
标题:
传值、传引用调用
既然您都知道了传值调用和传引用调用的存在,那么咱们就具体看看,他们到底有什么区别吧。
在此之前,楼下的各位,回答问题最好把代码一起贴出来,更直观。也高度锻炼您的语言组织、逻辑思维等等。
首先,您要知道什么是形参和实参。
范例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 编辑
]
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2