黑马程序员技术交流社区
标题:
求大神给分析下。。。不太懂。
[打印本页]
作者:
黑马-陈思源
时间:
2013-3-4 08:13
标题:
求大神给分析下。。。不太懂。
本帖最后由 黑马-陈思源 于 2013-3-6 12:43 编辑
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
作者:
talkyong
时间:
2013-3-4 08:23
这是引用传递,对象的属性可能会被这个方法改变。
作者:
刘国涛
时间:
2013-3-4 08:29
当然是引用传递,你都说了是把对象作为参数传递给方法,而不是变量。
作者:
michaelchen
时间:
2013-3-4 08:32
是引用传递,实际是把该对象的地址作为实际参数传给了函数
作者:
黑马-陈思源
时间:
2013-3-4 09:04
额。。。我改听谁的 - -#
作者:
彭波
时间:
2013-3-4 09:13
本帖最后由 彭波 于 2013-3-4 09:17 编辑
是值传递。
Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
给你个程序看看,这个例子是从网上看到的,希望对你有帮助
public class Abc
{ int a;
int b;
Abc(int x, int y)
{//构造方法,就本体而言对象a的成员变量a=5,b=6
a = x;
b = y;
}
int add()
{// 此方法实现的是对象a的成员变量a,b的加法
int s;
s = this.a + b;
return s;
}
int add(int a, int b)
{//此方法实现的是传入参数a,b的加法
return a + b;//a,b是参数,与成员变量无关,这是因为a,b是局部变量
}
public static void main(String[] args)
{ Abc a = new Abc(5, 6);
System.out.println("add1的结果:a+b=" + a.add());
System.out.println("add2的结果:a+b=" + a.add(7, 8));
}
}
结果是:add1是11
add2是15
作者:
李辉
时间:
2013-3-4 12:03
本帖最后由 小李 于 2013-3-4 12:05 编辑
是引用传递! 下面写个简单例子来说明:
class ReferenceTest{
static void aaa(ReferenceTest arg){
... // 各种代码
}
public static void main(String[] args){
ReferenceTest rt1=new ReferenceTest();
aaa(rt1);
}
}
aaa(rt1)会把rt1的引用传递给aaa方法,不管aaa方法里面怎么操作arg,rt1这个引用是不会变的,永远指向ReferenceTest rt1=new ReferenceTest();这里创建的那个对象。
aaa方法里改变arg的属性,会真实的改变rt1对象的属性。
如果要限制aaa方法改变rt1对象的属性,可以声明aaa方法时对参数声明final
以上是在下自己的愚见,如有不妥,还请大神们赐教!!!
作者:
黑马-陈思源
时间:
2013-3-4 17:26
..............我晕了 {:soso_e141:}
你们有的说是引用类型,有的说是值类型,而且每个人说的,我看着好像都有道理似的。。。。
求大神指示啊 0.0
作者:
聂斌
时间:
2013-3-4 19:00
同学:
这是引用类型传递,,对象是引用数据类型,,,和string一样的,,,,基本数据类型是值传递,,实际上你那个方法里的形式参数接收的是个对象的引用,,就是对象的内存地址值赋给了你那个形式参数,,,那么形式参数有了这个地址值后就会指向那个对象,,,,你指向那个对象后就可以修改对象里面的属性了,,,,在后面的学习当中,,,传递数据我们一般会把数据封装成对象来传递,,,这样效率高,方便....
同学你可以自己画个内存图那样方便你直观的理解,,,,你可以跟着毕老师画个内存图,,,你画完后就感觉so easy
作者:
朱玉玺
时间:
2013-3-4 19:18
public void add(String s)
{
System.out.println(s);
}
复制代码
多数是引用传递。对于上边的方法add,如果你传进的是String s1="abc"中的s1(引用传递),或者“efg”这样的值(值传递),对着前者,是把s1指向的地址赋值给add参数中的s,对于后者是把“efg”它在内存中的地址赋值给s,方法体内部操作的也是s。他们传递都是引用的地址。什么时候会出现值传递?如果上边的add方法中的参数不是String,而是八种基本数据类型,那么它传递的就是值。可以这样来总结:方法的参数是基本数据类型,它传递的是值;方法参数引用数据类型,它传递的是引用。
作者:
谢洋
时间:
2013-3-4 23:55
本帖最后由 谢洋 于 2013-3-5 00:05 编辑
不用说得那么复杂吧
引用,即地址,而地址所指向某空间,空间的内容可以说是对象的一些数据了;
打个比如:你叫我修理你家里的某个东西(对对象的成员的操作),那么我必须得到你家的地址才行(把地址传来),我就可以找到你家了;
要不然你得把你家的东西搬过来,你可以这样做;但jvm不是这样子干的,因为jvm好像就一个吧,还能叫谁传给它搞呢?
不会自已都找到东西,然后再传给自已,搞完了又叫自己再搬回去原来那里,没有那么疯狂吧
作者:
黄玉昆
时间:
2013-3-5 21:44
给你一张图吧,你看了就明白了。
赋值.PNG
(422.92 KB, 下载次数: 20)
下载附件
2013-3-5 21:44 上传
作者:
王亚东
时间:
2013-3-6 07:29
是引用传递,如果把整个对象的数据作为参数传递,多费力啊,直接传递一个引用,然后方法通过引用找到对象。
就好比有人送你一套房子,那么真正交到你手里的是一把钥匙(房子地址),而不是一套房子,你再根据地址就找到了。
作者:
黑马-陈思源
时间:
2013-3-6 12:41
谢谢大家。原来是这样 {:soso_e113:}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2