不好意思有一条代码贴错了!//调用函数改变String的值  
     stringTest1.ChangeStr(stringTest1);
应该是:
//调用函数改变String的值  
      stringTest1.ChangeStr(stringTest1.strTemp);
恳请各位不吝赐教!

解决方案 »

  1.   

    你的ChangeStr方法里改变的这个方法里自己定义的一个字符串,返回来后当然不会改变你stringTest1这个对象里strTemp数据成员的值了,除非你将
     str = "help me!";
    改为:
     strTemp = "help me!";
    这样就OK了!!!
      

  2.   

    public void ChangeStr(String str)
        {
            str = "help me!";
        }
    一般的str在此只是个形参,都是用来把本身的值赋给类里面其他的成员的,比如如果你已经事先给str="help me!"了,那么在此:public void ChangeStr(String str)
        {
            strTemp = str;
        }
    就可以了
      

  3.   

    你的:
    stringTest1.ChangeStr(stringTest1.strTemp);
    传递的只不过是一个字符串,并不是什么对象!!!
      

  4.   

    首先要明白对象引用的机制,相当重要的基础知识,下面这个你定义的函数,如果用标准的逻辑来写,你就明白了。
    public void ChangeStr(String str)
    {
        str = "help me!";
    }以下是其逻辑书写(相当于传统的C语言写法,只是在java里定义方法时简化了代码的书写格式):
    public void ChangeStr();
    String str;//你调用这个函数时,会运行隐藏了的一句:str=stringTest1.strTemp
    {
        str="help me!";
    }看明白了吗?这个str就是ChangeStr函数里实际存在的变量,并不等同于函数所引用的对象。    str=stringTest1.strTemp;
        str="help me!";
    上面这两条语句运行后,就会得出下以结果吗?
        stringTest1.strTemp="help me!"
    答案是绝对不会,上面那两条语句只不过是给同一个对象赋了两次值而已。
    另:
        java中除String之外,其它对象在被引用时,如果进行了修改
        比如:xxxx.remove("……");
        这种修改会作用于被引用对象本身,而String被引用时,是在函数里产生一个本地副本,所有对它的修改,都只作用于这个副本,其实String对象也没有修改自身的方法。    与String相比之下,StringBuffer显得很特殊,StringBuffer对象被引用时,象普通对象一样,举例如下:StringBuffer sb=new StringBuffer();
       //假设有一个ChangeStringBuffer(StringBuffer strb)函数
    ChangeStringBuffer(sb);
       //运行这句之时,如果对strb参量被修改(比如:sb.append("help");),会直接作用到sb对象
      

  5.   

    这个就是String和StringBuffer的区别之一
      

  6.   

    String用于不变的字符串,StringBuffer当然于字符串变量
      

  7.   

    strTemp = "help me!";//关键
      

  8.   

    这问题有点简单
    我就说几下吧
    见过贴的人都知道他在到弄string 变量
    他可一新加一个对象。那种编程就是我交作业用的
    但在这不行
    我就想在函数里改
      

  9.   

    public class StringTest {
            
        public void ChangeStr(String str)
        {
            str = "Has changed!:)";
        }    public static void main(String[] args) {
            StringTest stringTest1 = new StringTest();        String str1 = "Befored changed!";
            System.out.println(str1);
            //调用函数改变String的值
            stringTest1.ChangeStr(str1);        System.out.println(str1);
            
        }
    }你的测试方法本身是错的,对于java来说出了6种基础数据类型外,其余的都是对象
    对于对象其实也可以传值的,在c++中就可以,不过c++提供最终也提供了予以支持的
    引用传递,而改用const &来保证对想在函数中部被改变。java对于本地的方法调用
    对象都是传引用的:),如上例。远程方法例外:)
      

  10.   

    peacock_king(孔雀王) :
    你说得我明白!在C++中是可以那么理解的!但是java中我却理解不了!
    你可以用下面这条语句分别查看一下strTemp,和ChangeStr中的str对象指向的位置:System.out.println(strTemp.CASE_INSENSITIVE_ORDER);public void ChangeStr(String str)
        {
            str = "help me!";        System.out.println(str.CASE_INSENSITIVE_ORDER);
        }打印的结果表明两个变量指向的同一个对象???为什么??
    真是郁闷呀!
    谢谢!
    特此贴出大分贴!希望各位给予充分的解答!
      

  11.   

    iceshape(iceshape) :你举的例子我也试过!但是,两次输出的结果还是一样的!
    不知你是想说明什么?可否在来说说!谢谢!
      

  12.   

    peacock_king(孔雀王) :还有一个问题你们忽略了!我说我试了String和数组!
    数组的问题怎么解释呢!如果把程序中的String都换成数组!
    你也会得到同样的结论!两次输出结果是一样的!
      

  13.   

    java中String是一种比较特殊的对象
    它是不可修改的
    无论你如何修改之
    结果都是生成一个新的String
    如果你需要有一个可以修改的String
    建议采用StringBuffer
      

  14.   

    String是这样处理的,
      首先“Hello world"在JVM中是有固定的地址的,不会变化。所以你用
      String strTemp = "Hello World!"; 是表示strTemp指向”hello World"的地址  其后你调用方法,使方法ChangeStr()中的local 变量str指向了stringTest1.strTemp
        stringTest1.ChangeStr(stringTest1.strTemp);
      这是str = stringTest1.strTemp
      在ChangeStr() 中,调用
        str = "help me!"; 
      是改变str的引用指针位置到“help me”对象,和stringTest.strTemp没有任何关系
      所以你如果输出str 肯定是help me
      但是strTemp还是“Hello World"  我讲的不是很清楚,不过你可以去看看SCJP里面关于Local Variable的教程,就是讨论这个的!!看了以后就会明白了。
      
      

  15.   

    bsd(小红帽菜鸟):String并没有你说得那么恐怖!
    你不妨试试用String定义一个类的成员变量!然后通过实例化类的对象来改变String就能得到理想的效果!
    code:
    public class ReferenceTest {
        private String strTemp = "Hello world!";    public void ChangeStr(ReferenceTest temp)
        {        temp.strTemp = "Help me!";
        }    public ReferenceTest() {
        }
        public static void main(String[] args) {
            ReferenceTest referenceTest1 = new ReferenceTest();        System.out.println(referenceTest1.strTemp);
            referenceTest1.ChangeStr(referenceTest1);
            System.out.println(referenceTest1.strTemp);
        }
    }
    输出结果:
    Hello world!
    Help me!改变了!你能否解释解释这是为什么?
      

  16.   

    mem_fox(JAVA狐狸):你可以看看你楼上的几个贴子!
    他和你的观点是相悖的!你能不能给我解开呀!
    还有你说的《SCJP里面关于Local Variable的教程》在哪里?
    谢谢你!
      

  17.   

    同意 mem_fox(JAVA狐狸) 的说法
    java核心技术 卷一 原理 上也就是这么说的。
    比如字符串“hello”永远是字符序列“h”“e”“l”“l”“o”。这些值不能改变的。
      

  18.   

    volley(体力劳动的程序员) 
      你的程序中修改字符串用的是temp.strTemp = "Help me!"; 明确了是把temp.strTemp的指向改变了
      而你原来是用的 str = "help me!"; 修改的是方法内变量str 
        所以这时你要是修改strTemp 那么
      《SCJP里面关于Local Variable的教程》是不存在的,是《SCJP认证指南》的一章
      

  19.   

    mem_fox(JAVA狐狸):谢谢你!我现在好像明白了一点!
    不过!我不明白的是:peacock_king(孔雀王) :
    你说得我明白!在C++中是可以那么理解的!但是java中我却理解不了!
    你可以用下面这条语句分别查看一下strTemp,和ChangeStr中的str对象指向的位置:System.out.println(strTemp.CASE_INSENSITIVE_ORDER);public void ChangeStr(String str)
        {
            str = "help me!";        System.out.println(str.CASE_INSENSITIVE_ORDER);
        }打印的结果表明两个变量指向的同一个对象???为什么??
    真是郁闷呀!
    谢谢!
    特此贴出大分贴!希望各位给予充分的解答!
      

  20.   

    http://www.javaresearch.org/article/showarticle.jsp?column=1&thread=706
    http://www.javaresearch.org/article/showarticle.jsp?column=1&thread=3156&message=7486&redirect=true&hilite=true&q=%B4%AB%B5%DD
    但愿你看完不会晕..反正我是晕了..
      

  21.   

    我的理解:
    String strTemp = "Hello World!";
    这时JVM申请内存空间,不妨认为地址是0x1000,从这个地址开始存放"Hello World!",然后strTemp中存放0x1000这个地址。
    传参时public void ChangeStr(String str)
    这时隐式执行str=strTemp;只会使str中也存放0x1000
    当你执行str = "help me!";时
    JVM申请内存空间,不妨认为地址是0x2000,从这个地址开始存放"help me!",然后str中存0x2000这个地址。显然strTemp没有受到影响。
      

  22.   

    谢谢rumus(十年)
    总算弄明白了一点
    在java的函数调用中队说有的对象实际上是传递句柄的一个副本
    public void ChangeStr(String str)
        {
            str = "help me!";
        }
    这个函数调用实际上等于这样的一段代码:
    tempStr = str;
    tempStr = "Help me!";
    然而如果是数组的话就不会有这个问题了:
    class ChangeClass{

    int t=0;

    public void change(int c){
    t = c;
    }

    public int getT(){return t;};

    }public class StringText {
            
        public void ChangeStr(String[] str)
        {
        
            str[0] = "Has changed!:)";
            
        }
        
        public void changeClass(ChangeClass cs){
        
         cs.change(1234);
        
        }    public static void main(String[] args) {
            StringText stringText1 = new StringText();        String str1[] = new String[]{"Befored changed!"};
            String str2 = str1;
            System.out.println(str1[0]);
            //调用函数改变String的值
            stringText1.ChangeStr(str1);
    System.out.println(str1[0]);
            
            ChangeClass cs = new ChangeClass();
            
            System.out.println(cs.getT());
            
            stringText1.changeClass(cs);       
            
            System.out.println(cs.getT());
            
        }
    }
    这次测试过了,数组的第一个元素确实被改变了,对象同样也跟着改变了
    而String类的对象是“不可改变”对象,没有办法改变其值
    因为它没有自改变的方法如ChangeClass的change方法http://www.javaresearch.org/article/showarticle.jsp?column=1&thread=706
    http://www.javaresearch.org/article/showarticle.jsp?column=1&thread=3156&message=7486&redirect=true&hilite=true&q=%B4%AB%B5%DD
    中有下面一段:
    当执行返回到 main 时,再次打印出这三个参数的值。正如预期的那样,整型的 val 没有改变。对象引用 sb1 也没有改变。如果 sb1 是按引用传递的,正如许多人声称的那样,它将为 null。但是,因为 Java 编程语言按值传递所有参数,所以是将 sb1 的引用的一个副本传递给了 modify 方法。当 modify 方法在 //1 位置将 r1 设置为 null 时,它只是对 sb1 的引用的一个副本进行了该操作,而不是像 C++ 中那样对原始值进行操作。就是说java中所有的对象实际上不是按引用传递的!而是传递的一个引用的副本!