本帖最后由 lv_pi258 于 2011-09-07 10:09:46 编辑

解决方案 »

  1.   

    因為a和b是對象類型,所以null是很正常
      

  2.   

    a和b是什么变量? 你把a和b传进去了,但是没有传出来?
      

  3.   


    不都是对象嘛,问题是我要怎么改进以上代码,才能使我在打印语句的那边拿到重新赋值的a和b?而不是null
      

  4.   

    getValue(a, b, ...);这个方法定义了吗?你好像没有给a,b赋值哦。没有给值,当然是null了。
      

  5.   


    a和b就是普通的两个空的string,这两个值我要在第一次的遍历中赋值,然后第二次遍历时传入到getValue的方法里面去之后,这一次会用的到第一次的赋值
      

  6.   


    方法如下private static void getValue (a, b, ...) {
    a = "***";
    b = "&&&";
    }肯定是赋值了
      

  7.   

    你初始化没赋值 而是直接给的null ,在stringbuild中null会自动转化为”null“,所以你输出肯定是null,这个有人讨论过的,所以初始化最好是用String a=""
      

  8.   

    值传递的问题,欢迎访问我博客看下http://blog.csdn.net/niuniu20008/article/details/2953785public class Test { private String a = null;
    private String b = null;

    public void method(String a,String b){
    a = a;
    b = b;
    }
    }
    上面的代码和下面的代码public class Test { private String a = null;
    private String b = null;

    public void method(String aaa,String bbb){
    a = aaa;
    b = bbb;
    }
    }和下面的public class Test { private String a = null;
    private String b = null;

    public void method(String a,String b){
    this.a = a;
    this.b = b;
    }
    }
    是不同的,楼主别晕啊,呵呵
      

  9.   

    你传a,b的引用  引用传过去了但是a,b还是指向空的函数里的a,b指向的是字符串main函数a,b指向还是空的
    先了解一下java的传值吧   java只传两种  一是int (类似这种)类型的  他传的是原来值的拷贝
    一个是String(类似这种)类型的 他传的是引用  不是地址
      

  10.   


    你说的很有道理,我也想到是这个问题,可是我将变量初始值赋值为空字符串,也不行难道只能用StringBuilder了?
      

  11.   

    这是因为你并没有修改a的值,你修改的是a的指向。或者直接的说a指向了新的地址,原来地址的对象的值并没有发生改变
    所以Java里面这样的修改不会有效果
      

  12.   

    其实无论是什么对象都好,你调用
    a = 这样的修改都不会使得外部a的值发生任何改变只有调用a.xxx()这样才可能导致a的值发生变化
      

  13.   

    你这个问题是String 是不可改变的~不能像其他对象一样引用操作~
      

  14.   

    你用传值函数对String进行操作是怎么都没效果的~你函数中的a,b是对上面a,b的引用,你这样做只能修改参数a,b的引用,改变不了说引用的a,b的值
      

  15.   


    static String a = null; public static void getValue(){
    a="%%%";
    }
    这样写就能改了 ,不知道你要怎么改
      

  16.   

    不可能改进,Java中String的值是不允许修改的,所以无论你怎么写都不可能做得到。除非就是a、b是类的成员变量、使用数组等方式传递。反正直接影响外面局部变量的a、b是不可能的
      

  17.   


    即使for循环外面的变量改为StringBuilder也不行?
      

  18.   

    可以 那你就是对StringBuilder对象进行操作了~
      

  19.   


    package tes;import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;public class TestReplace {
    static String  s=null;
    public static void getS(String s){
    s="aa";
    System.out.println("s1"+s);
    }
    public static void main(String[] args) {
    getS(s);
    System.out.println("s2"+s);s1aa s2null 看这个就明白了吧
      

  20.   

    已经这么多个人说了,单纯使用String是无法办到的。必须靠数组、List、StringBuilder、成员变量之类的东西作为中转
      

  21.   

    你传的String 类型的是不可变类型 所以不会改变的
      

  22.   

    传引用调用是把引用指向的对象传过去,而不是把句柄(引用本身)传过去.具体到你的代码,getValue方法外面的句柄a和方法参数的句柄a是2个不同的引用.
    调用该方法的时候,这2个引用指向同一个对象.你在方法中赋值,只是把方法参数的句柄a的指向改变了,并没有改变getValue方法外面的句柄a的指向,所以结果当然是null.
      

  23.   

    楼主你的想法应该是getValue()这个方法的参数是两个对象,如果对这个两个对象进行修改,那么进行getValue()之前的两个对象应该修改,例如:
    public class TestMian {
    public static void main(String[] args){
    StringBuffer a = new StringBuffer();
    StringBuffer b = new StringBuffer();
    for (int i =1; i<10;i++){
    getValue(a, b);
    System.out.println(a+","+b);
    } }
    private static void getValue (StringBuffer a, StringBuffer b) {
    a.append("***");
    b.append("&&&");
    }
    }
    输出结果为:
    ***,&&&
    ******,&&&&&&
    *********,&&&&&&&&&
    ************,&&&&&&&&&&&&
    ***************,&&&&&&&&&&&&&&&
    ******************,&&&&&&&&&&&&&&&&&&
    *********************,&&&&&&&&&&&&&&&&&&&&&
    ************************,&&&&&&&&&&&&&&&&&&&&&&&&
    ***************************,&&&&&&&&&&&&&&&&&&&&&&&&&&&
    为什么getValue(a, b)方法之后,a,b的值进行了修改,是因为该方法传递的参数其实是把对象在内存中的地址拷贝了一份给参数,对a,b进行修改,其实也就修改了原来的值。
    但是为什么String不行呢,是因为String是一个final型的,像楼主那样a="**",其实是将这个参数a指向了另一个对象“**”,而原始的a还是指向null。这种传递对象的的方法间接的也存在一个问题:当创建了一个对象,如果将这个对象作为一个方法的参数,而该方法有对这个对象引用进行了修改,那么该对象也就变了,所以在程序设计中要注意这个问题,很可能就给自己带来了麻烦。
    不知道分析的对不对,请多提意见
      

  24.   

    我觉得String类型是不可变长的字符串,如果是需要对其进行操作运算之类的,最好还是用StringBuffer或者StringBuilder,在最后可以用toString方法进行输出。如果用String类型的话,到最后要进行输出必须对其创建对象。
      

  25.   


    多谢分析外加实践操作,我已经改用StringBuilder了!