隨筆 - 37  文章 - 29  trackbacks - 0


          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          最新評論

          閱讀排行榜

          評論排行榜


          先看一個簡單的例子:
          public class Test1 {
              public static void operateString(String s) {
                  s.replace("j", "i");
              }

              public static void operateStringBuffer(StringBuffer sb) {
                  sb.append("C");
              }

              public static void main(String args[]) {
                  String sa = new String("java");
                  StringBuffer sba = new StringBuffer("java");
                  operateString(sa);
                  operateStringBuffer(sba);
                  System.out.println(sa);
                  System.out.println(sba);
              }
          }
          答案很簡單:
          java
          javaC

          原則:
          1.String是不可變對象:public final class String extends Object
          2.java中只有值傳遞

          replace函數源碼中:
          public String replace(char oldChar, char newChar) {
               ...
               return new String(0, len, buf);
          }
          返回的是另一個String對象。
          而在上面的
          operateString方法中,是無返回值的,新產生的String對象被丟棄了,而sa仍然指向最初的那個String對象。


          第二個例子:
          public class Test2 {
              public static void operate(StringBuffer x, StringBuffer y) {
                  x.append(y);
                  y = x;
              }

              public static void main(String args[]) {
                  StringBuffer buffA = new StringBuffer("a");
                  StringBuffer buffB = new StringBuffer("b");
                  operate(buffA, buffB);
                  System.out.println(buffA + "," + buffB); 
              }
          }
          答案是:
          ab,b

          開始時a、x指向同一個StringBuffer對象(這里稱它為對象1),它的值是"a";
                      b、y指向同一個StringBuffer對象,它的值是"b"。
          執行x.append(y)時,對象1的值被改變,變為"ab";
          而執行y=x時,變量y指向被改變,指向了和x同一個StringBuffer對象。但是變量b的指向還是沒有改變,所以仍然為"b"


          posted on 2008-04-08 20:59 EvanLiu 閱讀(1489) 評論(2)  編輯  收藏 所屬分類: Java基礎

          FeedBack:
          # re: String StringBuffer 2008-11-04 15:25 sclsch
          2.java中只有值傳遞

          不是吧,java對于基本類型是傳遞的是值的copy,
          對于對象類型傳遞的是引用的copy.
          public static void operate(StringBuffer x, StringBuffer y) {
          x.append(y);
          y = x;
          }
          雖然y指向對象ab,但buffB 仍然指向了b  回復  更多評論
            
          # re: String StringBuffer 2008-11-27 16:27 EvanLiu
          是的,對象類型傳遞的是引用的copy,但這個copy就是一個value
          a Java application passes object references by value  回復  更多評論
            
          主站蜘蛛池模板: 图木舒克市| 平原县| 江门市| 班戈县| 吉林市| 昭平县| 乌鲁木齐县| 青州市| 凌源市| 通州市| 桐乡市| 花莲县| 建瓯市| 塔河县| 青田县| 乐清市| 原平市| 钦州市| 富锦市| 沙坪坝区| 鸡东县| 岳阳县| 迭部县| 额济纳旗| 漯河市| 北碚区| 富平县| 金昌市| 汉阴县| 寻甸| 冀州市| 塔河县| 巴彦县| 金华市| 高安市| 吉安市| 深州市| 高清| 北流市| 靖安县| 吉林市|