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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© tuanjie 中级黑马   /  2014-1-13 09:06  /  1002 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 tuanjie 于 2014-1-14 10:52 编辑

下面是关于引用传递的的代码,代码都差不多,可结果运行却不一样,
引用传递一:
  1. class Demo{
  2.         int temp = 30;
  3. }
  4. public class TestJava {
  5.         public static void main(String[] args) {
  6.                 Demo d1 = new Demo();
  7.                 d1.temp = 50;
  8.                 System.out.println("fun方法调用之前:"+ d1.temp);
  9.                 fun(d1);
  10.                 System.out.println("fun方法调用之后" + d1.temp);
  11.         }
  12.         public static void fun(Demo d2){
  13.                 d2.temp = 100;
  14.         }
  15. }
复制代码
运行结果:
fun方法调用之前:50
fun方法调用之后100

引用传递二:
  1. class Demo{
  2.         String temp = "hello";
  3. }
  4. public class TestJava {
  5.         public static void main(String[] args) {
  6.                 Demo d1 = new Demo();
  7.                 d1.temp = "world";
  8.                 System.out.println("fun方法调用之前:"+ d1.temp);
  9.                 fun(d1);
  10.                 System.out.println("fun方法调用之后:" + d1.temp);
  11.         }
  12.         public static void fun(Demo d2){
  13.                 d2.temp = "welcome";
  14.         }
  15. }
复制代码
运行结果:
fun方法调用之前:world
fun方法调用之后:welcome

同样都是引用传递,只是Demo类中的temp类型变了,运行结果差别很大,谁能分析一下这是什么原因吗?

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 神马都是浮云

查看全部评分

7 个回复

倒序浏览
没搞明白你到底想问什么?两个运行结果不是一样的道理吗?
回复 使用道具 举报
不知道同学所说的差别在哪里?根据你所描述的,这完全是合乎情理,没有什么差别啊
回复 使用道具 举报
mrwise1991 发表于 2014-1-13 22:49
不知道同学所说的差别在哪里?根据你所描述的,这完全是合乎情理,没有什么差别啊 ...

在fun方法里,把d1的引用地址赋给d2,d2修改temp的值,怎么会影响d1的temp值
回复 使用道具 举报
tuanjie 发表于 2014-1-14 10:27
在fun方法里,把d1的引用地址赋给d2,d2修改temp的值,怎么会影响d1的temp值

因为在将d1的引用赋给d2的时候,它们两个就指向了同一个对象在堆内存中的首地址值,此时无论是d1还是d2,访问属性temp并修改之后都会同步到该对象在堆内存中的成员变量temp的值。
回复 使用道具 举报
mrwise1991 发表于 2014-1-14 10:40
因为在将d1的引用赋给d2的时候,它们两个就指向了同一个对象在堆内存中的首地址值,此时无论是d1还是d2, ...

那谢谢你了
回复 使用道具 举报

不客气,一起进步。。。
回复 使用道具 举报
字符串一旦赋值就不会被改变 知道这点去了解就OK了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马