2014-01-09 45 views
0

考慮線2和在下面的代碼線3 .....修改對象或原始使用的空隙方法

class ModifyObjects { 
    static void modifyString1(String s){ 
     s = "xyz"; 
    //Or any other operations 
    } 

    static String modifyString2(String s){ 
     s = "xyz"; 
     return s; 
    //Or any other operations 
    } 

    static void modifyPrimitive1(int i){ 
     i=9; 
    } 

    static int modifyPrimitive2(int i){ 
     i=9; 
     return i; 
    } 
} 

public class Operations { 

    public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    String st1 = "abcd"; 
    String st2 = "qwerty"; 
    String st3; 

    int i1=0, i2; 

    st1 = "xyz";       //line 1 
    System.out.println("st1: " + st1);  

    ModifyObjects.modifyString1(st2); 
    System.out.println("st2: " + st2);  //line 2 

    st3 = ModifyObjects.modifyString2(st2); 
    System.out.println("st3: " + st3); 

    System.out.println("st2: " + st2); 

    ModifyObjects.modifyPrimitive1(i1); 
    System.out.println("i1: " + i1);   //line 3 

    i2 = ModifyObjects.modifyPrimitive2(i1); 
    System.out.println("i2: " + i2);  
    } 
} 

線2給出ST2如QWERTY(不修改。應該是XYZ)。 線3給出I1 = 0(不修改。應該是9)

這看起來有點奇怪。這裏是輸出中:

st1: xyz 
st2: qwerty 
st3: xyz 
st2: qwerty 
i1: 0 
i2: 9 
第1行一個新的字符串對象「XYZ」

也創造了吧?我認爲「abcd」只是沒有從這裏引用。

在由值傳遞的對象的Java引用
+4

我強烈建議先從一個初學者的關於Java的書或Oracle的教程。的 –

+0

可能重複的[是Java「的傳遞按引用」?](http://stackoverflow.com/questions/40480/is-java-pass-by-reference) – Radiodef

+0

線1和線2不很大的不同。我們如何解釋? – user3176541

回答

3

...

1. st1: xyz 

    Reason : you are not returning anything... 

    2. st2: qwerty 

    Reason :You are not storing the returned value in st2. you should do, 

     st2=ModifyObjects.modifyString1(st2); 

    3. st3: xyz 

    reason : You are returning a String value and storing it in st3 

    4. st2: qwerty 

    Reason : st2 is qwerty... 

    5. i1: 0 // Not reassigning value to anything 

    6. i2: 9 // returned value reassigned to i2. 
1

我覺得你有一些混亂字符串和參數傳遞工作在java中如何。

1)字符串是由設計不可變對象,因此不能改變一旦建成。只是爲了清楚起見,這樣的事情:

String s = "a"; 
s += "bc"; 
System.out.println(s); 

是不是修改的字符串s的價值,但創建一個新的對象。在這段代碼的最後,你已經創建了2個String對象:一個在第一行中有值「a」,另一個在第二行中有值「abc」。 (這是一個自願的簡化,因爲Java的編譯器可以決定優化的代碼,但它是正確的呢)

2)如果你需要一個可變的String對象,JAVA給你StringBuilder對象(或StringBuffer,如果你有需要同步版本)。它實際上是推薦的習慣用法,如果你需要把東西附加到字符串。

3)參數傳遞是總是由在Java值;這意味着使用賦值左側的參數將永遠不會在方法調用之外產生效果;相反,您只需踩上您收到的參數值即可。如果參數是基本類型或對象類型,則這並不重要。如果參數是一個對象類型,參數傳遞也是通過值傳遞的,但是您複製到方法調用堆棧的是對該對象的引用的副本。所以,在你modifyStringXX方法,你獲得的唯一的事情就是踩參考參數,但你永遠不會看到外面的方法的效果。

相關問題