A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张冉   /  2011-7-22 22:27  /  2542 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

评分

参与人数 1技术分 +1 收起 理由
小龙 + 1

查看全部评分

8 个回复

倒序浏览
黑马网友  发表于 2011-7-22 22:43:26
沙发
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对象。
对象作为参数传时,传的是内存地址。

评分

参与人数 1技术分 +2 收起 理由
小龙 + 2 再接再励!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-22 22:50:04
藤椅
对象都是地址引用。

评分

参与人数 1技术分 +1 收起 理由
小龙 + 1 答到边了的都有分!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-22 22:51:45
板凳
对象的传递,赋值,都是把对象的内存地址赋值给一个引用

评分

参与人数 1技术分 +1 收起 理由
小龙 + 1 答到边了的都有分!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-22 22:53:01
报纸

回复 楼主 的帖子

传递对象就是引用嘛。

评分

参与人数 1技术分 +1 收起 理由
小龙 + 1 答到边了的都有分!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-22 23:01:01
地板
这里的传递当然是引用的传递了,引用数据类型的参数传递。你可以看下老师的视频里面有讲到的。

评分

参与人数 1技术分 +1 收起 理由
小龙 + 1 答到边了的都有分!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-22 23:49:47
7#
但凡是传递进去参数,方法运行改变参数后,原来参数发生改变的,都是引用传递。
但凡是传递进去参数,方法运行改变参数后,原来参数未发生改变的,都是值传递。
一般来说,对象都是引用传递。

评分

参与人数 1技术分 +1 收起 理由
小龙 + 1 答到边了的都有分!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-22 23:56:55
8#
就是传值。地址也是值

评分

参与人数 1技术分 +1 收起 理由
小龙 + 1 答到边了的都有分!

查看全部评分

回复 使用道具 举报
崔虎 黑马帝 2011-7-23 09:27:31
9#

传值、传引用调用

既然您都知道了传值调用和传引用调用的存在,那么咱们就具体看看,他们到底有什么区别吧。
在此之前,楼下的各位,回答问题最好把代码一起贴出来,更直观。也高度锻炼您的语言组织、逻辑思维等等。

首先,您要知道什么是形参和实参。
范例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 编辑 ]
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马