黑马程序员技术交流社区
标题: 关于赋值a=b 的问题 [打印本页]
作者: z_one 时间: 2015-11-8 15:49
标题: 关于赋值a=b 的问题
变量a=b,应该是用 b 给 a 赋值吧,但是把这句话放在方法里就不起作用了,为什么?
假如有一个类Employee ,然后运行
Employeeaa=new Employee("aa",10000);
Employee bb=new Employee("bb",20000);
aa=bb;
编译运行,能够把bb实例域的值赋予aa的实例域
但是如果在类里这样写
staticvoid swap(Employee x,Employee y)
{
x=y;
}
然后执行这个方法
Employee.swap(aa,bb);
aa 和 bb 的实例域都没有改变
作者: 我若为神 时间: 2015-11-8 22:13
看不懂,啊
作者: 黑夜中那颗星 时间: 2015-11-8 22:31
static void swap(Employee x,Employee y) //相当于把上面的那个aa对象的地址给了x, bb就给了y
这里是两个新的变量,你x=y并不是把上面的bb赋值给aa,这是不同的变量。
如果你调用x,改变这个对象的属性,那么aa也会改变,他们对应的是相同的对象
比如x.setName("lisi");
这样你到上面去调用aa.getName(); 这里返回的是lisi
我可能表达的不清楚,不知道你能不能看懂
{
x=y;
}
作者: Mr___dangerous 时间: 2015-11-8 22:38
楼上正解,可能表达的不清楚,不知道你能不能看懂
作者: nice非飞 时间: 2015-11-8 22:48
两个变量不用初始化吗
作者: 迷茫不堪的年纪 时间: 2015-11-8 23:25
你上面如果要换的话, 应该是地址覆盖吧, 因为也不是 俩个对象一个引用,那么对象bb的就没有了地址就没有指向成垃圾了,代码不全不好看
作者: yuhongzhen 时间: 2015-11-9 00:26
这里有形参和实参传递的知识,还有引用变量和值变量的知识。在你 的方法中只是把对象的内存地址传入方法,在没有进行对象操作的情况下,你的这种操作,是不会影响方法外的参数的。可能我的表达不清楚,看下面的例子。如果你直接对对象的属性等内容进行操作,就设计引用类型变量了。但是你的方法和下面的例子里的一样。
int a=21;
int b=24;
test(a,b);
System.out.println("a="+a+"b="+b);
//输出结果,a和b 的值并不会交换
void test(int x,int y){
int temp=x;
x=y;
y=temp;
System.out.println("x="+x+"y="+y);
//x和y 的值发生交换
}
作者: 醉叶惜秋 时间: 2015-11-9 00:40
赞一下,顶起
作者: z_one 时间: 2015-11-9 01:55
意思是参数传递,仅仅是把值拷贝了, 但是地址是新开辟的?
作者: 黑夜中那颗星 时间: 2015-11-9 09:20
只是把对象的地址值拷贝了,但是他们是不同的变量,你改变x的时候,只是改变x引用地址值,并不改变aa的引用地址值
作者: wx_ao22R6RC 时间: 2015-11-9 09:45
你定义的swap类里面改变的只是它里面的赋值方法,swap方法出栈后局部变量就消失了,所以改变的不是原来的而是你定义swap方法里的
作者: ln0491 时间: 2015-11-9 16:22
不明白.........
作者: 大自然的搬运工 时间: 2015-11-9 18:01
地址值传递,这只是把aa bb 的引用对象有分别复制个x y ,aa和x同时指向 new Employee("aa",10000);然后你把X的指向改变了,但是aa的指向没有变。再看看参数传递那块吧。。,,,加油 ,,,
作者: 3872982 时间: 2015-11-9 18:30
看的有点晕晕的..
作者: oup 时间: 2015-11-9 19:57
看得有点晕
作者: Sayman 时间: 2015-11-9 21:43
活到老 学到老
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |