public class Example{ 
  String str=new String("good"); 
  char[]ch={'a','b','c'}; 
  public static void main(String args[]){ 
    Example ex=new Example(); 
    ex.change(ex.str,ex.ch); 
    System.out.print(ex.str+" and "); 
    Sytem.out.print(ex.ch); 
  } 
  public void change(String str,char ch[]){ 
    str="test ok"; 
    ch[0]='g'; 
  } 
}  

解决方案 »

  1.   

    good and abc
    应该这样,没有测试
    很明显你把引数的作用搞错了。
    引数只是指向一块内存,当Str="test ok";其实是把str指向test ok,当函数调用玩。str就被释放了
      

  2.   

    你的输入法有问题 把下面的代码拷贝再试试:
    public class Example{

    String str = new String("good");

    char [] ch = {'a','b','c'};

    public static void main(String args[]){
    Example ex = new Example();
    ex.change(ex.str, ex.ch);
    System.out.println(ex.str + "end");
    System.out.println(ex.ch);
    }
    public void change(String str, char ch[]){
    str = "test ok";
    ch[0] = 'g';
    }
    }
      

  3.   

    纠正一下
    基本类型int,char,float等和c语言一样。
    object的引数则很大区别。
    自己看看书吧,最基本知识
      

  4.   

    如果有兴趣可以看看finel。如果修饰基本类型,该内容不可改变。如果修饰object,内容可以改变,但指向的地址不可变。可以看到实质。object是2个内存操作的,基本类型是一个。(我说的是逻辑上的)
    如果是初学,建议不要学。java太垃圾了,因为免费才受到老板喜欢。其实一无是处。
      

  5.   

    我知道是reference的作用!就是不明白,为什么ch[]数组内容被改了?
    str = "test ok";  的str 和String str = new String ("good");
    中的str是指乡向同一个地址,怎么可能不改变String str = new String ("good");的值呢?
      

  6.   

    import java.util.*;
    public class Test {
      
      String str="good"; 
      char[]ch={'a','b','c'}; 
      static T t = new T();
       public static void main(String args[]){ 
         Test ex=new Test (); 
         ex.change(ex.str,ex.ch,t); 
         System.out.print(ex.str+" and "); 
         System.out.print(ex.ch ); 
         System.out.println(" " +  t.i);  
       } 
       public void change(String st,char ch[],T tt){ 
            System.out.println("----------------------------------"); 
            System.out.println(st); 
            System.out.println(ch); 
            System.out.println("---------------------------"); 
              tt.i=65;
              st="test ok"; 
              ch[0]='g'; 
       } 
    }class T{
      int i=10;
    }
    结果为什么是这样的呢?
    ----------------------------------
    good
    abc
    ---------------------------
    good and gbc 65
      

  7.   

    public class Example{

    String str = new String("good");

    char [] ch = {'a','b','c'};

    public static void main(String args[]){
    Example ex = new Example();
    ex.change(ex.str, ex.ch);
    System.out.println(ex.str + "end");
    System.out.println(ex.ch);
    }
    public void change(String y, char ch[]){
    y= "test ok";
    ch[0] = 'g';
    }
    }我觉得是这样的啊:
             _____________
            |             |
    y-------|             |
            |             |
    str-----|test ok      |
            |             |
            |             |
            |             |
             --------------
      

  8.   

    http://community.csdn.net/Expert/topic/4007/4007791.xml?temp=.7784235
      

  9.   

    xiangqianchong(向前冲) :
    开了这个帖子了!我更觉得结果该为:test ok
      

  10.   

    java中的对象是地址传递啊,你只改变了change方法中的str参数的值,并没改变外部的str值,因为他俩是两个地址。
      

  11.   

    数组和其他Object一样(也就这么两种),呵呵,在JVM中被看作是一个对象。
    所以参数引用相当于C里面的指针传递。
    OVER。呵呵,
      

  12.   

    要想动态修改内容还是用StringBuffer吧,多转几步而已。
      

  13.   

    我觉是局部变量的问题    
    public void change(String str,char ch[]){ 
            str="test ok"; 
            ch[0]='g'; 
        }这里的str的范围是在{}里面,而String str = new String("good");  的str应该是this.str
    这是两个不同的变量,如果你改称:this.str="test ok";试试看小弟刚学java不知道我说的对不,请高手指点。
      

  14.   

    你的测试结果没有错。
    String对象与一般的Object对象不同。
    例如:String str = "abc"; 一旦你创建了该对象,你就不能再通过str去改变其值。在String值要经常改变的情况下,我们要用StringBuffer就是这个原因。
    在你的change函数中,str="test ok" 实际上是新创建了一个String对象,说到底就是两个str的内存地址不一样,你可以通过调用hashcode来测试。
    两次输出结果不一样就是由于两个str不一样造成的。
      

  15.   

    ch[]本身也是一个索引,他指向char,当你对他修改的时候,他像c中的指针的作用一样。而char是基本类型,所以让修改了。
    在java中数组就是一个指针。另外对于String 
    String a="aa"和String a=new String("aa")是完全不同的感念。
    你不信试验一下。
    String a="a";
    String b="a";
    if(a==b) out.println("true");

    String a=new String("aa")
    String b=new String("aa")
    if(a==b) out.println("true");
    java这些东西太混浇了。换c++或者.net把
      

  16.   

    http://community.csdn.net/Expert/topic/4007/4007791.xml?temp=.7784235
    其实java中只有by value没有by reference,str="test ok";这是创建了个新的对象,我想你是这点没有理解到!这也是String特别的地方!
    其结果是将str指向了新的对象,这个对象和"good"这个对象是两个不同的对象。
    chr[0]='g';其实是改的外面的数组对象本身,所以结果为g
      

  17.   

    楼主这样写不太规范,你的两个变量应该封装的。而且有个地方你没有理解到:对数组的传值是传的地址。再说你这段代码还没法编译,单词都写错了
    class Example{
    private String str=new String("good"); 
    private char[]ch={'a','b','c'}; 
    public static void main(String args[]){ 
    Example ex=new Example(); 
    ex.change(ex.getStr(),ex.getCh());
    System.out.print(ex.getStr()+" and "); 
    System.out.print(ex.getCh()); 
    }

    public void change(String str,char ch[]){ 
    str="test ok"; 
    ch[0]='g'; 


    /**
     * @return Returns the ch.
     */
    public char[] getCh() {
    return ch;
    }
    /**
     * @param ch The ch to set.
     */
    public void setCh(char[] ch) {
    this.ch = ch;
    }
    /**
     * @return Returns the str.
     */
    public String getStr() {
    return str;
    }
    /**
     * @param str The str to set.
     */
    public void setStr(String str) {
    this.str = str;
    }
    }
    运行结果:good and gbc
      

  18.   

    楼上说 java 两个内存操作的 还逻辑上的那位到底懂不懂啊,还把final拿出来,你知道final修饰的是什么就说能变不能变,自己理解的浅就不要埋怨语言本身,java如果都和C++一样那还是java么,
    如果你c好,你把c的内存处理机制给大伙讲讲
      

  19.   

    java参数传递的是引用的拷贝
    下面的例子你运行一下自己思考一下/* */
    package _test;
    public class Example
    {
        String str = new String("good");    static char[] ch = { 'a', 'b', 'c' };    public static void main(String args[])
        {
            Example ex = new Example();
            ex.change(ex.str, ex.ch);
            System.out.print(ex.str + " and ");
            System.out.println(ex.ch);
            
            ex.change2(ex.str, ex.ch);
            System.out.print(ex.str + " and ");
            System.out.println(ex.ch);
            
            char[] ch2 = { '1', '2', '3' };
            ch=ch2;
            System.out.println(ex.ch);
            
        }    public void change(String str, char ch[])
        {
            str = "test ok";
            ch[0] = 'g';//参数为数组的可以被改变
        }
        
        public void change2(String str, char ch[])
        {
            str = "test ok";
            
            char[] ch2 = { '1', '2', '3' };
            ch =ch2;
        }
    }
      

  20.   

    回复人: yangbc(土豆块) ( ) 信誉:100  2005-6-29 5:41:48  得分: 0  
       
    楼上说 java 两个内存操作的 还逻辑上的那位到底懂不懂啊,还把final拿出来,你知道final修饰的是什么就说能变不能变,自己理解的浅就不要埋怨语言本身,java如果都和C++一样那还是java么,
    如果你c好,你把c的内存处理机制给大伙讲讲嘿嘿,我当然知道final,书上讲的不全面。
    考你一下,知道final,finally,finalize的区别吗?或许我没有说清楚,实质上ch[]指向的内容改变了。而str没有改变。因为引数特性,main的str和ch的指向始终没有改变。在方法中,ch[]因为操作的是基本内存,所以内容改变了。而str是先在常量池建立一个新的字符串对象。然后让方法中的ch[]指向他。因此内容没有改变。
    如果这样再理解不了,你就看书去吧。慢慢就了解了。
     
      

  21.   

    然后让方法中的ch[]指向他
    打错了。是让str指向他
      

  22.   

    java参数传递的是引用的拷贝!!你的str和this.str已经不一样了
    对String比较要用.equals的
      

  23.   

    回复人: photoshop(developer) ( ) 信誉:99  2005-06-29 15:34:00  得分: 0  
     
     
       java参数传递的是引用的拷贝!!你的str和this.str已经不一样了
    对String比较要用.equals的
      
     
    因为引数都是拷贝的.他不会影响到原引用.所以要看在调用的函数体内,原指向的内存是否被改写.我的意思就是这个.