public static void fund(int a,String b,String c){
a=a+1;
b.trim();
c=b;
}              int a=0;
String b="Hello World  ";
String c="OK";
fund(a,b,c);
System.out.println(a+","+b+","+c);最后调用输出结果为0,Hello World  ,OK,为什么后面是OK呢,而不是Hello World 

解决方案 »

  1.   

    string传入了一个引用的副本,在fund里的修改副本不影响main里的
      

  2.   

    string这个参数传入的不是对象引用吗,还是JVM在处理string对象的时候传入的是引用副本
      

  3.   

    同意楼上的 楼主可以看看这个帖子 说的很详细:
    http://topic.csdn.net/u/20090523/21/c6c9028b-04de-4aef-8b9e-f63e8eb29864.html
      

  4.   

    java 都是值传递的。这种值包含
    1.普通类型的实际的值
    2.对象类型的引用。引用也是一种值。
      

  5.   

    是一回事。java中只有传值,也就是副本。
    对于基本类型,复制基本类型。
    对于引用,复制引用。
      

  6.   

    一个最起码有50%的人不知道的问题
    被标题吸引进来了。
    ------------------
    java中的八大基本类型作为方法参数是值传递,传进来的是3、HelloWord、OK
    Object引用类型同样也是值传递,传进来的是这个Object实例的引用地址,方法内根据这个地址来操作目标数据。(这点看上去确实像所谓的引用传递,呵呵,但其实不是)
      

  7.   

    但我知道string不是对象吗,对象不是传引用的吗,引用不就是传内存地址,那按这样C=B,应该会改变C中的内容吗
      

  8.   


    我想下面个例子能解释下
    java public static void main(String[] argus){
    String str1="a";
    String str2="b";
    change(str1,str2);
    System.out.println("str1:" + str1);
    System.out.println("str2:" + str2);
    } private static void change(String str1, String str2){
    String temp = str1;
    str1=str2;
    str2=temp;
    }
      

  9.   

    public static void fund(int a,String b,String c); 其实所有的形参和实参结合的时候,都是值传递
    调用fund(a,b,c)的时候只是将引用c做了一个拷贝。
    c=b;将被拷贝的引用赋值为引用b,原来的实参不变。注:Java的引用与C++的引用不同(不要受其影响),它与C++的指针很类似。
      

  10.   

    这个是老问题,我在其他帖子里已经回答过了。“
    首先,楼主要明确一个概念:JAVA只有值传递,没有引用传递!
    分两种情况:
    1:如果参数是基本数据类型的话,函数内部对参数做修改,不会影响外部原参数。
    因为基本数据类型在传入函数时,java会做个copy动作,所以在内部修改此参数,只是修改的copy副本
    2:如果参数是对象类型的话,函数内部对对象的域做的修改,会改变外部原对象的域。
    因为参数是对象,java会copy此对象的句柄地址为一个新的副本,对此副本指向的对象做域的更改,自然会更改到原对象。根据以上两种情况,java都会做个copy副本的动作,所以是“值传递”不知道我解释的明白吗?
      

  11.   

    fund(a,b,c);  根本就没有输出, system.out.println()这里的是上面的a,b,c 。明白了吧
    在一个就是 fund(a,b,c);只是一个方法函数,不会对abc的值做出改变,不会影响,因为fund(a,b,c);返回类型是void 来填充的。看看书吧
      

  12.   

    又是String  唉, 永远不过时
      

  13.   

    string是特殊的类型。它是final的,java 做JVM编译 的时候, string final 类似 const char *是不可通过指针修改实际内容的。所以你的trim 和 =都不会在外部成功。但是int[]作为参数就可以实现操作,数组是Object类型。fund(int a,String b,String c)编译后的栈区
    fund地址-->函数地址
    a--->普通值复制。
    b--->一看不可通过引用修改就编译为b的引用副本
    c--->一看不可通过引用修改就编译为c的引用副本
    你修改的是栈内指针。
      

  14.   

     JAVA 不能改变参数的值,只能改变参数的属性值
    其实引用就是指针
    你的 c = b ; 是把c的副本指向的地址给改变了
    但并没有改变参数c的值即地址;
      

  15.   

    public static void fund(int a,String b,Test c){
    a=a+1;
    b.trim();
    c.str="BBBBBBBBBBB";
    }
    public class Test{
      String str = "AAAAAA";
    }琢磨琢磨这个吧 希望能明白
      

  16.   

    把System.out.println(a+","+b+","+c);放fund()里面就是了
      

  17.   

    我不知这样lz能明白不(自己的理解)
    假设:
      我和lz都是会分身术的神人,我的职业是吸毒,而lz则是贩毒。根据规定我俩只能在一间屋内进行交易,而自身不能亲自去交易,彼此就只能各分出一个小我来参与交易,[b]而小我只能在屋内存在[/b]。
      我犯毒瘾了,找lz买毒。根据规定,双方都只能拿着现金或毒品在屋外等待,让彼此的小我去交易,同时,装着现金的保险箱上有两条绳子,一条连着我,而另一条则连着小我,lz也如此。
      在屋内,我和lz的小我正在紧锣密鼓的交易,双方的小我把彼此绳头交换,这样在屋内看似彼此已经完成交易,我和lz在外面窃喜,殊不知,正当得意之时,彼此的小我连同绳子却一起消失,我和lz的愿望也就落空了
      巩固一下:张孝祥老师的例子:
    public class PassRef
    {
    int x;
    public static void main(String[] args)
    {
    PassRef obj=new PassRef();
    obj.x=5;
    change(obj);
    System.out.println(obj.x);
    }
    public static void change(PassRef obj)
    {
    obj.x=3;
    }
    }
     这次小我们比较聪明,交易成功了!
    不知这样解释妥当不
      

  18.   

    首先19楼的说法肯定是错的。
    fund(a,b,c){}和 String c="OK";中都有c变量,我们都知道字符串是引用类型,
    fund(a,b,c){}中的c和String c="OK";相当于是两个指针变量,但都是指向同一地址,fund(a,b,c){}中的c=b当然不会改变String c="OK";中定义的c的值,所以打印的结果为ok我倒觉得打印出的变量b的值有些出乎我的意料,但看了看String类中trim()方法的代码实现,就知道原因是什么了。
      

  19.   

    java传值 传的是拷贝,而不是原来的那个变量的值
      

  20.   

    2好像不对吧 JVM对String是特殊处理的 String会独立开放一个新的内存空间 原来的引用还是指向原来的内存空间
      

  21.   

    答案再此public class StringTest {
    public static void change(String a) {
    a = "aa";
    }

    public static void changeBuffer(StringBuffer a) {
    a.append("a");
    }

    public static void main(String[] args) {
    String b = "b";
    change(b);
    StringBuffer c = new StringBuffer("c");
    changeBuffer(c);
    System.out.print(c);
    }
    }
      

  22.   

    要补充以行
    System.out.print(b);结合String的常量特性;容易理解的
      

  23.   

    Java中函数的参数传递都只有一种传递方式:值传递; public class Test { 
        public static void fund(int a,String b,String c){
         a=a+1;//5
         b.trim();//6
         c=b;//7
        }
       public static void main(String[] args){
         int a=0;//1
         String b="Hello World ";//2
         String c="OK";//3
         fund(a,b,c);//4
         System.out.println(a+","+b+","+c);//8
       }
    }  内存的执行过程分析:
    1,程序从main函数进入,在栈空间(Stack)分配一块区域给变量a=0;
    2,在常量池(或称数据段)分配一块内存区域存放"Hello Word"同时将它的引用赋值给b,b在栈空间分配,即栈空间的b指向了数据段中的"Hello Word" 
    3,第三句的执行过程和第二句同理;
    4,到第四句调用函数fund()时转到函数体中,主意很关键的地方就是传进去的参数在内存中的分配,此时的a是临时在栈空间的又一次分配,它与main函数中的a是不一样的;b和c也是临时在栈中分配,指向常量池中的"Hello Word";可以理解为在调用fund执行的过程中栈中有两个a=0,一个为main的,另一个为fund的,当fund执行完后为其分配的变量就消失了,同理b和c也一样。所以fund执行完后对main中的变量在此是没有影响的;
    5...;
    6...;
    7...;
    8最后打印出:0,Hello World ,OK;接着main函数结束,为其分配的变量消失,整个程序执行完毕。
        补充:考虑以下情况,在main函数中new一个对象,并将这个对象的引用传给一个函数func(),在func()中对对象的属性进行修改,那么当在main中调用func()时会改变对象的属性,但是在main中该对象的引用是不会变的,道理是一样的。
       希望能给楼主释疑......
      

  24.   

    http://topic.csdn.net/u/20100401/14/9e88a4ca-3eb3-4c92-bdd4-5de3613bc7b5.html
      

  25.   

    fund()中的c是可以改变它所引用的对象,即main()中的c(和fund()中的c不是一个东西,只不过指向了同一个对象)所引用的那只"OK",不过foud()中的c同志并没有选择这么做,它。。
    同意#38的说法~~
      

  26.   

    public static void fund(int a,String b,String c){
    a=a+1;
    b.trim();
    c=b;
    }在java中,基本类型传递的是值,所以这里修改了a并不会影响了外部的a的值而b.trim()并不会影响b的值,这个方法是返回一个新的对象的(如果不用处理就直接返回自身)
    而c = b是使得c指向了一个新的对象,并不是修改原来c对象的值,所以外部对象的值不会受到影响
      

  27.   

    调用fund 函数,系统又开辟了一个新内存 string c; 
    所以fund 函数中的 c 和 main 中传的实参c的地址是不一样的;
      

  28.   

    public static void fund(int a1,String b1,String c1){
    a1=a1+1;
    b1.trim();
    c1=b1;
    }这样好理解点
      

  29.   

    JAVA中只有值传递。。
    这个是java中的争议问题,也是说sun设计java上缺陷:
    在比如Integer中在0—127之间是相等的,boolean类型在实际中并不是一位的,可能是2个字节、4个字节
      

  30.   

    字符串不可变常量的问题。
    main中的c,与fund中的c在作了c=b,指到的是另一个对象,(1)(2)指的对象不一样,而main c对象与(1)处是一样的
    main c->OK
    fund(){
       c->OK...........(1)
       String e=c;
       c=b;
       c->Hello World.............(2)
       测试
      e==c ?  就明白了
     
    }
      

  31.   

    public static void fund(int a,String b,String c){
    a=a+1;
    b.trim(); String 是不变字符串 任何对他的操作都将生成一个新的对象  方法的返回值就是 
                  string trim();
    c=b;  //C 本来指向 "OK“ 在这里C指向了 C=“Hello World ” 
    但是外面的C引用还是指向 =“OK” ,传递的是对象的引用,
    }  int a=0;
    String b="Hello World ";
    String c="OK";
    fund(a,b,c);
    System.out.println(a+","+b+","+c);
      

  32.   

    基础问题。标题太噱头。当然这个说法是对的,因为学java的远不到世界总人数的50%。如果是指在学java的人群中,那么不懂这个问题的人本身不能算作已学会了java。