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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© z_one 中级黑马   /  2015-11-8 15:49  /  1006 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


变量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 的实例域都没有改变

15 个回复

倒序浏览
看不懂,啊
回复 使用道具 举报
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;

}
回复 使用道具 举报
楼上正解,可能表达的不清楚,不知道你能不能看懂
回复 使用道具 举报
两个变量不用初始化吗
回复 使用道具 举报
你上面如果要换的话, 应该是地址覆盖吧, 因为也不是 俩个对象一个引用,那么对象bb的就没有了地址就没有指向成垃圾了,代码不全不好看
回复 使用道具 举报
这里有形参和实参传递的知识,还有引用变量和值变量的知识。在你 的方法中只是把对象的内存地址传入方法,在没有进行对象操作的情况下,你的这种操作,是不会影响方法外的参数的。可能我的表达不清楚,看下面的例子。如果你直接对对象的属性等内容进行操作,就设计引用类型变量了。但是你的方法和下面的例子里的一样。
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 的值发生交换
}
回复 使用道具 举报
赞一下,顶起
回复 使用道具 举报
z_one 中级黑马 2015-11-9 01:55:27
9#
黑夜中那颗星 发表于 2015-11-8 22:31
static void swap(Employee x,Employee y)   //相当于把上面的那个aa对象的地址给了x,   bb就给了y
这里是 ...

意思是参数传递,仅仅是把值拷贝了, 但是地址是新开辟的?
回复 使用道具 举报
z_one 发表于 2015-11-9 01:55
意思是参数传递,仅仅是把值拷贝了, 但是地址是新开辟的?

只是把对象的地址值拷贝了,但是他们是不同的变量,你改变x的时候,只是改变x引用地址值,并不改变aa的引用地址值
回复 使用道具 举报
你定义的swap类里面改变的只是它里面的赋值方法,swap方法出栈后局部变量就消失了,所以改变的不是原来的而是你定义swap方法里的
回复 使用道具 举报
不明白.........
回复 使用道具 举报
地址值传递,这只是把aa bb 的引用对象有分别复制个x y ,aa和x同时指向 new Employee("aa",10000);然后你把X的指向改变了,但是aa的指向没有变。再看看参数传递那块吧。。,,,加油 ,,,
回复 使用道具 举报
看的有点晕晕的..
回复 使用道具 举报
oup 中级黑马 2015-11-9 19:57:48
15#
看得有点晕
回复 使用道具 举报
活到老  学到老
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马