还是《Java编程思想》上的一个问题:
    “将一个对象传递给方法时,也会产生别名问题:”以下是示例:    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()之外的对象。”
       这句话又该怎么理解?
    问题表达得可能不是很清楚,各位费心了。

解决方案 »

  1.   

    是不是可以这样理解,f(x);这条语句让方法f()有了一个操作对象的遥控器,这个对象是Letter实例化后生成的。同时f(x)这条语句又是将自己想要做的事(把c赋值为z)通过这个遥控器x来遥控Letter实例化后的对象,从而将Letter实例化后的对象的成员变量c赋值为z。
      

  2.   

    恩,一楼说的的确很形象,但不知道我理解的是不是正确。就是说在栈里放着x,在堆中放着Letter生成的对象,同时x指向了这个对象。而f(x)这条语句让方法 f也有了一个指向Letter生成对象的引用,同时方法f做了一个操作,将对象中的c赋值为z,而这个操作也是通过x这个引用实现的。
      

  3.   

    恩  差不多是这样   java中除了基本类型是值传递的,数组、对象等都是引用的传递,f(Letter y)中的y只是传递了一个对Letter对象的引用
      

  4.   


    跟果子大神一样的观点哦 最近有啥推荐的JAVA书么? 除了核心技术和这本书..最好有电子版
      

  5.   

    main中的x与f()中的y,在栈内存中在不同的地方,可以内容都是一样的,都是
    Letter x = new Letter();
    所产生的Letter对象在堆内存中的地址。
    x---
        +---->Letter Object
    y---所谓“复制的副本”,就是将x的内容(Letter对象的地址)复制给y,y的内容是x的内容是一样的,都用Letter对象的地址,这样一来x,y都指到了堆内存的同一个地方,这就指到了同一个对象。
      

  6.   

    java中参数传递是传值不是引用
      

  7.   

    有本书叫《Agile Java》,据说还不错,里面“贯穿了单元测试和TDD,潜移默化的影响你的编程思维走向敏捷,走向TDD。”准备把《Java编程思想》看过后再翻翻那本书。这是那个人发的帖子http://www.javaeye.com/topic/52992
      

  8.   


    class A {
    int row = 10;
    }
    public class ReferOrValue {
    int line = 1;
    public void setNum(int num){
    num++;//在许多编程语言中,方法似乎要在它的作用域内复制其参数的一个副本
    }
    public void setRow(A a){
    a.row = 20;//若传的是对象 ,副本和母本的值相同,指向了同一个对象,
    //所以对副本指向的对象的操作会改变母本指向的对象的属性
    }
    public static void main(String[] args) {
    ReferOrValue r = new ReferOrValue();
    int num = 100;
    r.setNum(num);
    System.out.println(num);//100//在许多编程语言中,方法似乎要在它的作用域内复制其参数的一个副本
    A a = new A();
    System.out.println(a.row);//10
    r.setRow(a);
    System.out.println(a.row);//20
    }
    }
    参数是基础类型或对象时,都是传的值,只是它们的值的本质区别导致的不同效果!
    这是自己写的一个测试程序,不好要轻拍哦!
      

  9.   

    建议LZ可以看看这个文章:
    http://topic.csdn.net/u/20100414/14/a6290ab8-79c4-4904-8b31-9e364c64c1d2.html?seed=1624237131&r=64684169#r_64684169里面的例子比我的更具有说服力!