给出下面的代码块,变量foo的值是_______? 
public class X { 
  public static void main(String[] args) { 
    String foo = "ABCDE"; 
    foo.substring(3); 
    foo.concat("XYZ"); 
  } 
}
我想问下结果原因,java中的值传递和引用传递到底怎么区分?请专家帮我解决下这个困扰我的问题.

解决方案 »

  1.   

    还是ABCDE如果你这样写的话 会输出一个不同的String对象str了
    String str =  foo.substring(3); 
      

  2.   

    换个角度来说一下  你在做 foo.substring(3)操作的时候  其实不干foo什么事  这是取得了foo字符串中的“DE” 至于DE指向谁了  不知道...如果你说foo =  foo.substring(3)那么 foo就会输出为DE了
      

  3.   

    这跟什么传递没有关系.另外: java 只有 pass by value.
      

  4.   

    有书说JAVA没有引用,没有指针 我不这么认为,我同意以下观点   简单数据类型按值  其他按引用
      

  5.   

    准确说明一下:
    Java采用值传递给方法传递参数。其中:
        基本类型数值:传递实际的值。方法内部局部参数的值的改变不会影响方法外部变量的值。
            (byte, short, int, long, float, double, char, boolean)
        引用类型:传递的参数包含对实际变量的引用。任何出现在方法体内部的对这个变量的修改都将影响到作为参数被传递的原始变量。
            (数组、字符串、对象……)楼主所用的foo.substring(3); foo.concat("XYZ");都没有用新的字符串变量接受返回值,所以不对原foo产生任何效果
      

  6.   

    ABCDE,没对原来的foo进行实质的操作,每个操作都返回一个新的String
      

  7.   

    java only pass by value:
    基础数据类型是copy值
    类是copy引用(其实引用也是一个值)
    所谓的pass by value其核心是指,传递的时候要拷贝一份,所以无论是基础数据类型还是类对象,都是要在内存拷贝一份再传递的,因此都属于pass by value.
      

  8.   

    foo是String 类型的对象,foo.substring(3);
    只是调用了对象的方法。
      

  9.   

    Here is a summary of what you can and cannot do with method parameters in the Java programming language:
    A method cannot modify a parameter of primitive type (that is, numbers or Boolean values).
    A method can change the state of an object parameter.
    A method cannot make an object parameter refer to a new object.
      

  10.   

    如果要改变原值,可以用StringBuffer!
      

  11.   

    顶顶顶,虽然看不懂,不过我感受到JAVA的恐怖了。
    大家学JAVA多长时间了呀?
      

  12.   

    一般对象传递,就是用了引用传递,对象的定义如
      Date d=new Date();
    其中d是引用,是在栈中的,而new Date()是在堆中开辟的空间保存对象,d中是堆中内容的地址,因此函数传递的是地址,这点跟C++是相同的,而int i=2;i是栈中的变量,因此只是值传递
      

  13.   

    我告诉你吧 java都是pass by value 没有reference