public void changeObjValue (PassTest ref) {  
15 ref.ptValue = 99.0f;  
16 }  
改变了pt.ptValue 的值,因为它直接对地址操作,
其它只是改变了引用的数值

解决方案 »

  1.   

    这段话的意思就是:java进行参数(原始数据类型)传递时,被调用方法得到的只是原变量的一个值拷贝,因此它的只能对这个拷贝进行操作,当然就不能改变原变量的值了。但如果参数是对象,则被调用方法得到的是原对象的一个引用,因此它就能通过该引用对原对象进行操作,所以原对象的内容也就可以在被调用方法中改变了。对象的引用实际上是一个指针,如果被改变了那它所指向的对象不久改变了么??例子里面的字符串对象是个特殊例子,在这里把它当作原始数据类型。
    这样解释不知道你明白没??
      

  2.   

    java是传递对象的引用,当调用changeObjValue()时,传进pt的引用,他所
    指的对象与外面的pt实际上是同一个。你用pt.ptValue=99.0时,实际已经改变了外面的ptValue了。而在另外的changStr()你用value=“”;实际上是把这个引用指向“”而已。他原来也是指向“”的。
    一个与changeObjValue相同的例子。
    BufferString bs=new BufferString("qqqq");
    changeBufferString(BufferString point)
    {
        point.append("wwwww");
    }
    调用changeBufferString(bs)这个函数后bs的值为qqqqwwww。
    因为point也是指向bs对象的,在函数里添加了字符。
      

  3.   

    二位说的我看明白一些,很有启发,但是
    那该怎么判断传递的是一个对象还是一个参数呢?是不是所有原始数据类型都可以看做是参数而不是对象?在本例中,是不是
    27 val = 11;
    36 str = new String ( " hello " ); 
    呵呵,它们是不是只是一个变量啊?

    45 pt.ptValue = 101.0f;
    是一个对象?
    是不是可以说,凡是对对象的引用都可以理解为指针?
    谢谢!
      

  4.   

    jgo(航海家) 
    您所说的传递对象的引用是不是说:   45 pt.ptValue = 101.0f; 
    对象PT引用了ptValue,所以   50 pt.changeObjValue (pt);
    实际上传递的是ptValue?方法里面修改的也就是它了?
    那么  36 str = new String ( " hello " );  是不是说STR引用的是一个空字符?或者是"hello"的地址?如果是地址,我不明白那里面不就等于修改了地址吗?
      

  5.   

    我不知道 11 value = new String ( " different " );和BufferString bs=new BufferString("qqqq");
    的区别,value不是对象吗?bs是对象的话,它的引用是什么?是"qqqq"吗?
    谢谢!
      

  6.   

    如果是基本类型,传递时先拷贝这个值再传过去
    如果是对象,拷贝这个引用再传过去
    例如声明了如下函数:
    void foo(int a);
    void fooo(Object o);
    调用时:
    int s=5;
    Vector v=new Vector();foo(s); 相当于int a=s; foo(a);
    fooo(o):相当于Vector vv=v; fooo(vv); vv和v指向同一个对象
      

  7.   

    java传递的永远是“引用”。
    还是我的例子。String s="s"; 
    主要的区别是:你注意看函数里的具体操作。changeS(String sPoint)
    {
        sPoint="2";
    }
    如果bs的值原来也是“bs";changeBS(BufferString bsPoint)
    {
        bsPoint.append("2");
    }
    将s与bs传到函数里时,传递了“引用”,也就是sPoint和sbPoint引用了相应的值,即此时sPoint指向了“s",sbPoint指向了”sb"。
    但是最关键的是:
    sPoint=“2"的意思是将sPoint又指向了另外一个对象“2";
    而sPoint是s的一份拷贝,它与s是不同一个对象。所以还是s="s"。再看sbPoint.append("2")的意思是sbPoint所指的对象添加“2"。这样的话
    由于sbPoint指向对象与sb是同一个。所以调用函数后sb="sb2"。其实是同样的道理  s  与  sPoint指向同一对象   “s"。
                      sb 与  sbPoint也是指向同一对象   ”sb"。关键的不同是函数里的 = 与  .  这两个操作的性质不同。
    应该很清楚了吧。欢迎和我讨论。QQ 15549694