public class Test{
    public static void mian(String args[]){
        String str="";
        test(i);
        System.out.println(i);//输出结果是空值。
    }
    public static void test(String str){
       str = "string";
    }
}我的理解是应该输出“string”。求这位大侠解释。越详细越好。

解决方案 »

  1.   

    不好意思写错了。是这样的:public class Test{
        public static void mian(String args[]){
            String str="";
            test(str);
            System.out.println(str);//输出结果是空值。
        }
        public static void test(String str){
           str = "string";
        }
    }
      

  2.   

    代码写错了吧,我想你应该是写下面这种的:public class Test{
        public static void mian(String args[]){
            String str="";
            test(str);
            System.out.println(str);//输出结果是空值。
        }
        public static void test(String str){
           str = "string";
        }
    }执行的结果仍然是打印了一个空,这和变量的生命周期无关,是java中方法参数传递的问题,你把str传递给test(),实际上是把str先拷贝一份,再传递给形参去执行方法,原来的str没有发生任何改变...
      

  3.   

    public static void test(String str){//传递的是实参的拷贝
           str = "string";//改变的是局部变量的值
        }
      

  4.   

    String 对象时值类型,而不是引用类型。值怎么会改变了。结果任然为空。
    你可以吧String 换成数组类型。保证就改变了。
      

  5.   

    http://blog.csdn.net/zwnylsf/article/details/7385348,我也在学习java,自己总结的,关于参数传递
      

  6.   

    举个例子给你看看吧String str="ddd";
    String a=str;a="yyy";你输出str的时候,并不是yyy
    再来一个
    ArrayList d=new ArrayList();
    ArrayList c = d;c.add("dd");
    这时候d.size()是1,通过c改变了d.
    而String是一个不可变的对象,改了a的引用而已.
    再一个
    再来一个
    ArrayList d=new ArrayList();-->这里有一个ArrayList对象
    ArrayList c = d;-->这里c和d都是引用同一个对象
    c=new ArrayList();-->这里c引用了新的对象.
    c.add("dd");
    这时候d.size()是0,c引用了新的对象,与d无关了.
      

  7.   

    public class Test{
        public static void mian(String args[]){
            String str="";
            test(i);
            System.out.println(i);//输出结果是空值。
        }
        public static void test(String str){
           str = "string";
        }
    }
    你这个代码的效果和下面代码的效果是一样的
    public class Test{
        public static void mian(String args[]){
            String str="";
            test(i);
            System.out.println(i);//输出结果是空值。
        }
        public static void test(String s){ //该s只是一个局部变量而已
           s= "string";
        }
    }
      

  8.   

    我也是新手,我是这么理解的 :
    你在main中定义了一个String str 是吧?
    然后在test方法中又定义了一个String str对吧? 
    我个人认为只要一带数据类型 就相当于这个新的和原来的根本不是一个东西,这压根就是俩个str 只不过是变量作用域不同。不知道理解的有没有错?欢迎高手拍砖~
      

  9.   

    这样理解好理解:
    比如你的方法test(String str1),事实上它是直接在这方法域里面new的一个String。然后通过克隆的方式把test(str2)里str2的值克隆到str1中。
    无论你怎么改变str1的值,它始终在此方法域中。并不是改变了str2的值。
    但如果你test(String str1)要返回ste1,然后赋值给str2,那str2就会变了,因为str2又指向被把别的str1的值了。如:public class Test{
        public static void mian(String args[]){
            String str="";
            str = test(str);
            System.out.println(str);//输出结果是string。
        }
        public static String test(String str){
           str = "string";
           return str;
        }
    }
      

  10.   

    我来回答吧,首先,String是引用类型的,但因为String是final(即不可变的),所以,在方法中的str=“string”的结果是把str指向了新的对象,而main方法中的str并没有变,仍指向“”;另外,传递的时候的确是把str的引用copy给了新的str;不知道解释的明白不???
      

  11.   

    这就涉及到值参数还是引用参数了,
    String是值参数,所以生命周期只在方法体内。
    而比如数组,集合类的是引用参数就不一样了。
    public static void main(String args[]) {
    String[] str = new String[1];
    test(str);
    System.out.println(str[0]);//输出结果是string。
    } public static void test(String[] str) {
    str[0] = "string";
    }
      

  12.   

    主方法 main()都拼错了 请问你的编译能通过?还有这个事作用域的问题,str只是作为test()的参数,不管在test()方法里你做了什么是不会影响到main()方法里str的值。
    你可以这样理解,参数只是被利用的