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

}
String传参传的是地址,为什么输出地不是test Ok 呢?费解中....

解决方案 »

  1.   

    static 静态变量,.............
      

  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.print(ex.str+" and "); 
        Sytem.out.print(ex.ch); 
      } 
      public void change(String str,char ch[]){ 
        str="test ok"; 
        ch[0]='g'; 
      } 

      

  3.   

    请去看String的源码。
    java中的String狠特别,方法内部改变不了它的引用
      

  4.   

    你的这个赋值是给本方法的参数str赋值,并不是给全局变量str赋值
    str="test Ok";
    应改为:this.str = "test Ok";
      

  5.   

    str="test ok"这句是改变引用的指向而已,并不是改变str之前所指向的对象的值。str是一个局部变量,它的指向改变了影响不到ex.str的值,str还是指向new String("good"),这个画个图很容易理解。
      

  6.   

    String应该是引用类型吧...
    迷茫了..
      

  7.   

    java 方法参数传递不是地址传递,是值传递。
      

  8.   

    change方法里面的str不是类的字段str~而是传进来的参数str,如果你加个this.就可以了
      

  9.   

    public void change(String str,char ch[]){  
        str="test ok";  
        ch[0]='g';  
      }  
    明白了,问题出在了参数名与类的属性名相同上了.不过,String是引用类型吧??,传的应该是地址吧??
      

  10.   

    很明显,在此处String传进去的是Str的一个副本,穿进去的是值。儿Char数组ch本身存放的就是char数组的首地址,所以传进去的是ch的首地址,必然会导致String结果不变,而Char数组的值发生改变。
      

  11.   

    不是同名的问题,如果你非要用方法参数对象改变传入数据的局部变量或全局变量在java中是行不通的,java方法参数传递的是对象的值,不是地址,这个是个特殊的地方。
      

  12.   

    谢谢大家,受益匪浅,我刚刚注册CSDN号,不知道如何给大家分啊?请教如何给分??
      

  13.   

    很常见的问题,我来解释:
    此问题设计Java的内存分配机制:
    对于string类型:当调用change方法时,方法的参数会被当做方法的私有变量进行创建,这时内存机制是这样的,就是在栈中有两个不同的引用(全局变量str和方法内部的变量str)同时指向了堆中的一个对象,但是你在方法内部对对方法内部的私有变量进行重新赋值后,只是改变了方法内部变量的指向,对全局的str指向并没有影响。而方法结束后局部的str生命周期就会结束,而之后被垃圾回收。而你输出的是全局的str所以输出的不是“test Ok ”!不知道讲的清楚不?
      

  14.   

    点击上边的结贴
    在结贴页面里选择 4 楼 (千万要选对哦)
    在后边Text 里填 40 分就OK 了
      

  15.   

    Java中参数传递的确用的是地址传递;
    但是String比较特殊,一旦赋值内存里面的内容就不能改变了,
    而且String是引用类型的;重新赋值后它指向的地址就改变了,
    public void change(String str,char ch[]){  
        str="test ok";  
        ch[0]='g';  

    ex.change(ex.str,ex.ch);
    调用这个方法时,会将ex.str和ex.ch在内存中的地址传递给Str和ch[];他们本身指向的地址没变
    执行 str="test ok";  时,change中str指向的地址改变了,但ex.str指向的地址没变;
    所以ex.str的值还是String str=new String("good");
      ch[0]='g';会将ch[0]指向的地址的值改变,所以最终ex.change(ex.str,ex.ch);
    改变了ch[]的值,但str的值仍然不变
      

  16.   

    java 中 String 很特别很特别月经帖中说道:
    String str = "test OK";创建一个对象,常量池中
    String str = new String("test OK");创建两个对象 常量池,堆当把引用传进方法中 这句:String str = "test OK";
    String 引用了一个新的对象 这个对象在常量池中
      

  17.   

    只是改变了局部变量str 不信你用Eclipse debug一下,看看各个变量的值,绝对正确
      

  18.   

    String是final型,不能被改变值。
      

  19.   

    java和C,C++还是有点区别的。
      

  20.   

    这是讲解得最好的。Java里:String s = "abc";
    s = "111";你以为s变成了“abc”?错!是s重新指向了“111”,“abc”和“111”都是在常量数据里的。假如你还定义了一个String b = “111”,那么现在s和b都是指向的常量数据里的同一个地址