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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张天昊76 中级黑马   /  2013-11-23 15:40  /  1549 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

java中只有一种参数传递的方式(值传递)。
当传递剧本数据类型时,传递的是实参的值。
传递引用类型的参数时,传递的是对象的引用。
问题:以下代码就不明白了。
  1. public class Test {

  2.     public static void main(String[] args) {
  3.         Circle c1 = new Circle(1);  
  4.         Circle c2 = new Circle(2);
  5.         
  6.         // 交换前c1和c2的radius的值
  7.         System.out.println("c1.radius = " + c1.radius + " 、c2.radius = " + c2.radius);
  8.         // 第一次交换后c1和c2的radius的值
  9.         swap1(c1, c2);
  10.         System.out.println("swap1: c1.radius = " + c1.radius + " 、c2.radius = " + c2.radius);
  11.         // 第二次交换后c1和c2的radius的值
  12.         swap2(c1, c2);
  13.         System.out.println("swap2: c1.radius = " + c1.radius + " 、c2.radius = " + c2.radius);
  14.     }

  15.     public static void swap1(Circle x, Circle y) {
  16.         Circle temp = x;
  17.         x = y;
  18.         y = temp;
  19.     }

  20.     public static void swap2(Circle x, Circle y) {
  21.         double temp = x.radius;
  22.         x.radius = y.radius;
  23.         y.radius = temp;
  24.     }

  25. }

  26. class Circle {
  27.     double radius;

  28.     Circle(double newradius) {
  29.         radius = newradius;
  30.     }
  31. }
复制代码
执行的结果是:
  1. c1.radius = 1.0 、c2.radius = 2.0
  2. swap1: c1.radius = 1.0 、c2.radius = 2.0
  3. swap2: c1.radius = 2.0 、c2.radius = 1.0
复制代码
不太明白的就是。在swap1后,两个对象的引用变量都交换了。那调用对象的属性也应该和之前不一样了。
我不太明白为啥会是这个结果呢。

希望有人解答,先谢谢了。


评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!好学上进!

查看全部评分

8 个回复

倒序浏览
这个就和C/C++和C#里的值传递和引用传递差不多,但是可以肯定,java里对象是引用类型,可以走一段代码看,第一个函数是,定义一个中间对象是吧,然后互换位置,可是里面的东西没变啊,也就是对象里面的属性没变,第二个就不一样了,改变了对象里面的东西

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 很给力!

查看全部评分

回复 使用道具 举报
在你类中,定义的第一个值交换函数,交换的是Circle类创建的对角值,交换的不是对象的引用,只在函数的运算范围内有效,而函数外的Circle对象不会被改变
而定义的第二个值交换函数,定义交换的是Circle类对象的引用,改变的是对象引用的值,

评分

参与人数 1黑马币 +3 收起 理由
FFF + 3 回答再认真一点就有技术分了~

查看全部评分

回复 使用道具 举报
王贺 发表于 2013-11-23 16:06
这个就和C/C++和C#里的值传递和引用传递差不多,但是可以肯定,java里对象是引用类型,可以走一段代码看, ...

嗯,第一个它们的属性都没有变,对象的引用的指向变了。也就是说c2指向原来的c1对象了。c1指向了原来c1的对象。那返回c1的属性,就是原来c2的属性。c2的属性就是原来c1的属性。
我就是这个不太懂了。
回复 使用道具 举报
忄雾飞扬 发表于 2013-11-23 16:14
在你类中,定义的第一个值交换函数,交换的是Circle类创建的对角值,交换的不是对象的引用,只在函数的运 ...

你的意思是说对象的引用没有被交换吗?
回复 使用道具 举报
张天昊76 发表于 2013-11-23 16:24
你的意思是说对象的引用没有被交换吗?

对象引用的值没有被交换,交换的是形参的值并不是对象的值 
回复 使用道具 举报
王贺 中级黑马 2013-11-23 16:43:19
7#
我想可以这样理解下,第一个是值传递,就像是
void swap(int a,int b)
{
  int temp;
temp=a;
a=b;
b=temp
}
和这个性质差不多吧
回复 使用道具 举报
你第一交换方法交换的是对象的内存地址,并没有把值交换。对象c1跟c2的内存地址改变了,但是里面的值是没有变的。
回复 使用道具 举报
FFF 金牌黑马 2013-11-24 00:40:50
9#
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html
如果没有解决,可能你的问题问得不够清楚。可以重新发问的哦~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马