日期:2014-05-20  浏览次数:20675 次

方法调用中的别名问题
还是《Java编程思想》上的一个问题:
  “将一个对象传递给方法时,也会产生别名问题:”以下是示例:
Java code

    import static net.mindview.util.Print.*;

    class Letter {
        char c;
    }
    
    public class PassObject {
        static void f(Letter y) {
            y.c = 'z';
        }
        public static void main(String[] args) {
           Letter x = new Letter();
           x.c = 'a';
           print("1: x.c " + x.c);
           f(x);
           print("2: x.c " + x.c);
        }
    }


  其输出结果为:
  1: x.c = a
  2: x.c = z
  然后作者又说
  “在许多编程语言中,方法f()似乎要在它的作用域内复制其参数Letter y的一个副本;但实际上只是传递了一个引用。所以代码行
  y.c = 'z';
  实际改变的是f()之外的对象。”
  对这段话不是太理解:
  1、“但实际上只是传递了一个引用”是说f(x)中的x是指向f()方法的一个引用吗?
  2、“所以代码行
  y.c = 'z';
  实际改变的是f()之外的对象。”
  这句话又该怎么理解?
  问题表达得可能不是很清楚,各位费心了。


------解决方案--------------------
可以把引用想像成遥控器,对象想像成电视机。把引用传递给一个方法,相当于你把电视机的遥控器复制了一个一模一样的给另一个人,这时,你们两个中的任何一个人操作遥控器,控制的都是同一台电视机。
------解决方案--------------------
传入的只是指向这个变量的地址或者可以理解为指针
在便于理解的情况下 一般也可以理解为传入的是这个变量本身

我觉得楼上解释得挺好哇
------解决方案--------------------
建议LZ可以看看这个文章:
http://topic.csdn.net/u/20100414/14/a6290ab8-79c4-4904-8b31-9e364c64c1d2.html?seed=1624237131&r=64684169#r_64684169

里面的例子比我的更具有说服力!