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.   

    java是按值传递的,它不会改变实参的值。java也有人说有传递引用的概念.但和传统的引用传递不一样。 你可以通过方法来改变被引用的对象中的属性值,却无法改变这个对象引用(Object reference)本身.也就是当一个对象的实例被创建的时候,比如说: Apple a = new Apple(); a 存的就是这个对象实例的地址。而这个地址,也就是a的值作为参数传到某个函数中的时候,a本身是不会改变的。所以说java中的都是按值传递.
      

  2.   

    str的值没有被改变。ch的值被改变。因为change没有改变全局变量str的值,而是改变的形参的值,并且这个值没有返回给str。所以是good and gbc
      

  3.   

    结果是good gbc,数组传的是地址!
      

  4.   

    你的程序我编译的时候报些奇怪的错误,我改了下,又加了个整型:class Change{
    public void change(String str,char ch[],int i){
         str="test ok";
         ch[0]='g';
         i++;
        }
    }public class Test8 {
        public static void main(String args[]){
         String str="good";
            char ch[]={'a','b','c'};
            int i=3;
         Change cha=new Change();
         cha.change(str,ch,i);
         System.out.println(str);
         System.out.println(ch);
         System.out.println(i);
        }
    }结果为:
    good
    gbc
    3
    可见数组和其它类型不一样,传的是地址,结果改变
      

  5.   

    这里需要解释一下,java基本类型(byte、int、char、long、float、double、boolean和short)是传值,也就是传的是副本,而其余传的是引用(所谓引用传递就是把对象的引用地址传进函数,而不是像值传递那样产生一个副本),对于字符串对象来说,虽然在参数传递的时候也是引用传递,但是java虚拟机在函数内部对字符串对象进行了特殊处理--视String对象为常量(final) 所以对传进来的引用地址所引用的string对象比能直接进行修改,而是产生一个副本对其进行操作,对其进行的操作不会影响原来的值。这就是为什么字符串和数组都是引用传递,字符串没变而数组变了的原因
      

  6.   

    结果:good and gbc局部变量str变成了"test ok"
    全局变量仍然还是"good"LZ最后打印的是全局变量str
    所以是"good and gbc"
      

  7.   

    我加入了一个自定义对象:
    /**
     * @author nuskwill  
     * @date 2008-9-19 
     */
    public class Example{ 
    String str=new String("good"); 
    char[]ch={'a','b','c'}; 
    int i=1;
    String tem[]={"11","22","33"};
     F f = new F(10,"test");
    public static void main(String args[]){ 
    Example ex=new Example(); 
    ex.change(ex.str,ex.ch,ex.i,ex.tem,ex.f); 
    System.out.println(ex.str); 
    System.out.println(ex.ch);
    System.out.println(ex.i);
    System.out.println(ex.tem[0]+" "+ex.tem[1]);
    System.out.println(ex.f.kk+" "+ex.f.ss);

    public void change(String str,char ch[],int i,String tem[],F f){ 
    str="test ok"; 
    ch[0]='g';
    i++;
    tem[0]="111";
    f.kk=100;

    } class F{
    int kk;
    String ss;
       F(int k,String s){
    kk=k;
    ss=s;
    }
    }
    结果为:
    good
    gbc
    1
    111 22
    100 test说明非基础数据类型(也非string)传递的是 地址.
      

  8.   

    值传递和地址传递的问题:
    good and gbc
      

  9.   

    test ok and gbc 做了好多遍了
      

  10.   

    结果是:good and gbc
    去我博客看下,对这类的介绍很详细。
      

  11.   

    没错!  以上的成员变量要是static 才行public class Variable2 {
       
    static String str="ggggggg";
    static int i = 1;
        static char ch[]={'a','b','c'};
        
    public static void main(String[] args) {
           
            Variable2 cha=new Variable2();
            cha.change(str,ch,i);
            System.out.println(str);
            System.out.println(ch);
            System.out.println(i);
    }   
     void change(String str,char ch[],int i){
     str = "hello  ok";
     ch[0] = 'k';
     i = 100;
     }
    }
      

  12.   

    good gbc 正解`````唉 基础东西 又忘了  我以为是String变量的值会覆盖呢 唉  基础得看看了
      

  13.   

     good and gbc 上面的错了```
      

  14.   

    String类型比较特出,具有长度不可变特性, 只要你对String进行操作,就会在数据段中产生一个新的字符串,不要说赋值,就算是删除或添加其中的字符,同样会产生新的字符串,所以结果肯定还是以前的结果,对它一点也没有影响。
      

  15.   

    String传的是值,改变的是局部变量的值,对其他范围没有影响。
    Char[] 传的是地址,改变值就等于改变了内存中原先的数组的值。
    故答案为: good and gbc
      

  16.   

    String 是特殊引用类型,在进行引用传值时,是又复制一个引用变量给了change中的str局部变量,此时给str赋一字符串,由于String是一个immutable类,它会去内存的字符串池中找有没有test ok字符串数组,没有就会重新生成一个字符串放到字符串池中进行共享,返回此对象的引用赋给了str这个局部变量,可些时全部str变量并没有得到改变,而对于char[]改变了,帮应该good and gbc 
    每次重新赋值引用地址都会改变,原来的地址就放入垃圾回收....
      

  17.   

     可能你的代码是从某个地方复制来的,程序没有错误,可是当我把你的代码复制道的eclipse的时候,好多红色的波浪线错误,编译不能运行,将波浪去掉,就可以了。
      我想这个原因,估计是编码问题。