public class Test {
public static void main(String[] args)
{
String a=new String("A");
String b=new String("B");
fun(a,b);
System.out.println(a+","+b);
}
public static void fun(String x,String y)
{
x+=y;
y=x;
}
}这个程序的结果为什么是: A,B ,为什么不是:AB,AB呢?
String产生的不是对象吗? fun(a,b)传递的不是a,b的引用吗?

解决方案 »

  1.   

    谁告诉你的java是传引用就狠狠的扁他。
      

  2.   

    A还是那个A  B还是那个B
      

  3.   

    引用这个词在C++中使用,java中不使用引用,而采用值传递。
      

  4.   

    java中除了四类八种基本数据类型,其他类型变量都是引用型变量,变量参数传递是值传递。
      

  5.   

    String 产生的是对象,但参数传递是值传递。
      

  6.   

    如果你想实现AB的话,可以这么写public class pass { 

    public static void main(String[] args) { 
    String a=new String("A"); 
    String b=new String("B"); 
    fun(a,b); 
    System.out.println(a+","+b); 
      System.out.println(a.concat(b));


    public static void fun(String x,String y) { 
    x+=y; 
    y=x; 
     } 
      

  7.   

    生命周期。fun方法内x,y皆为AB,到了main就不是了。
      

  8.   

    5楼正解。
    问题出在 x+=y;
    String对于+操作,是生成新的String对象,而不改变原来的对象。
      

  9.   

    String对象是引用类型,非值类型,String a=new String("A"); 
    String b=new String("B"); String类型a,b的空间重新new了一个新的值A,B
      

  10.   

    java内存中,主要有两块存放数据的,一个叫栈,一个叫堆,
    基本数据类型都是存放在栈里面的,比如char,byte,short,int,long,float,double,boolean,
    int i=1;i和1都是存储在栈里面的
    复杂数据类型,比如自定义对象,String a=new String("A"); o这个引用变量(或者叫指针)是存放在栈里面的,我们new的空间(或者说这个对象的数据内存块)是存放在堆里面,o所代表的值就是堆里面内存块的首地址
    public class Test { 
    public static void main(String[] args) 

    String a=new String("A"); 
    String b=new String("B"); 
    fun(a,b); //=============只是一个引用传递,你可以这样理解把b、b的值赋给了参数x、y 
    System.out.println(a+","+b); //fun方法中做任何事都不会改变 a 、b的值(指目前代码)
    }
    public static void fun(String x,String y) //===方法中只是做了x、y的值的改变

    x+=y; 
    y=x;
    System.out.println(x+","+y);//=====你要是在这加上这个那就会出现AB,AB

      

  11.   

    java的基本数据类型是传值的,对象类型是传引用,String是对象类型,所以是传引用
    只不过String是final的,其内容无法改变,每次赋值都会在内存中重新分配一块区域来存储新的内容public static void main(String[] args)
    {
        String str = "A";
        fun(str);
    }public staitc void fun(String s)
    {
        s = "B";
    }
    用上面这个例子来说明,str是一个引用,引用的对象是“A”, 当调用fun(str)时,fun的形参s一开始也将引用"A",但是当执行s = "B"时,虚拟机将在内存中重新分配一块儿内存来存储"B",并让s引用"B",而str仍然引用的是“A”
    简而言之,这里的s = "B",基本上可以认为是s = new String("B"),如果是这样写的话,就能够理解str为啥没有改变了。当然事实上还是会有差别的,这就要牵扯到String类型的常量池的问题,就不多说了
      

  12.   

    8楼的代码简化一下就是
    public class pass { 
    public static void main(String[] args) { 
        String a=new String("A"); 
        String b=new String("B");     System.out.println(a.concat(b));


    输出结果:AB你原来的代码也可以这样写(可能比较烂,但能实现楼主愿望)
    public class Test { 
    public static void main(String[] args) { 
    String a=new String("A"); 
    String b=new String("B"); 
    fun(a,b); 
    //System.out.println(a+","+b); 这里输出的是a,b的最初值

    public static void fun(String x,String y) { //这个方法没有改变a,b的值,而是X,Y
    x += y; 
    y = x; 
    System.out.println(x + "," + y);

    }
    输出结果: AB,AB
      

  13.   

    这个说的好,大家不要在讨论Java是传值还是传引用了,其实,引用就是一个内存地址,这个内存地址也是一个值啊,大家以后再遇到这类问题时,说明白就行了,可以理解为传值,也可以理解为传引用,说清楚就ok
      

  14.   

    sun的英文官方文档上写的是传值的copy,没有传引用这一说
    上个世纪90年代末,大学首开c/c++,所以理解上面都是带c/c++的思想,还流传下来了,甚至出的书上也这么写,但结果是没错
    值的拷贝,但它的值就是一个地址,就这么回事
    只是String类型的值是不可变的
      

  15.   

    大家绕的太复杂拉,其实楼主问的很简单class bbb{
      public static int x = 1;
      public static void main(String[] args){
        add(x);
        System.out.println(x);
      }
      public static void add(int a){
        a++;
      }
    }楼主你认为输出的是什么?很明显是1,不是2吧