2013-09-23 24 views
-3

java是按值傳遞還是按引用傳遞。我的問題讓我寫這個class,以便我可以自信地回答。當我想知道我注意到可能存在與immutablemutable對象有關的問題。我在問這個簡單的class的輸出之後是什麼正確的答案。Java中的值傳遞或引用傳遞:不可變和可變對象的問題

class

package notsure.tests; 

public class PassingValues { 

static Object[] passingValueMethod(int intValue, StringBuilder strValue){ 
    int recievedIntValue = intValue; 
    StringBuilder recievedStrValue = strValue; 

    System.out.println("------Let's see mutable objects------"); 
    System.out.println("----In the called method-------"); 
    System.out.println("-----New References Without Modification-----"); 
    //No modification 
    System.out.println("Recieved integer: "+recievedIntValue); 
    System.out.println("Received StringBuilder: "+ recievedStrValue); 
    System.out.println(); 

    System.out.println("---- New refernces With Modification-----"); 
    //Modification 
    recievedStrValue.append(", I am modified in a method() through a reference "); 
    System.out.println("Recieved StringBuilder: "+ recievedStrValue); 
    recievedIntValue++; 
    System.out.println("Recieved integer: "+recievedIntValue); 
    System.out.println(); 
    //Evaluate the parameter values 
    System.out.println("----Received parameter variables current values-----"); 
    System.out.println("StringBuilder: "+strValue+" \nInteger: "+intValue); 
    return new Object[]{recievedIntValue, recievedStrValue}; 

} 
static String passingImmutable(String str){ 
    String recievedStr = str; 
    System.out.println("-----In passpassingImmutable() ------"); 
    System.out.println("---------without modification------"); 
    System.out.println("Recieved string with local ref: "+recievedStr); 
    System.out.println(); 
    System.out.println("------With modification-------"); 
    recievedStr = str+" I am modified"; 
    System.out.println("Recieved string with local ref: "+recievedStr); 
    System.out.println(); 
    System.out.println("----Let's see the parameter value content---"); 
    System.out.println("Recieved string with param ref: "+str); 
    return recievedStr; 
} 
public static void main(String[] args) { 
    Object[] object = new Object[2]; 
    int integer = 10; 
    StringBuilder stringBuilder=new StringBuilder("Stringbuilder"); 
    object = passingValueMethod(integer,stringBuilder); 
    System.out.println(); 

    System.out.println("---------Back in Main-------- "); 
    System.out.println("----Values returned----"); 
    for(Object obj:object){ 
     System.out.println(obj); 
    } 
    System.out.println(); 
    System.out.println("----Variables in Main-----"); 
    System.out.println(integer); 
    System.out.println(stringBuilder); 
    System.out.println("NOTE: even local Object(except primitive) reference reflect changes"); 
    System.out.println(); 
    System.out.println("-----Let's use immutable objects-----"); 
    String str = "I am a string"; 
    System.out.println("Value in main before method call: "+str); 
    System.out.println(); 
    passingImmutable(str); 
    System.out.println(); 
    System.out.println("--------------Back in main----------"); 
    System.out.println("String Value retuned: "+str); 
    System.out.println(); 
    System.out.println("String passed(main reference) value: "+str); 

} 

} 

output

------Let's see mutable objects------ 
----In the called method------- 
-----New References Without Modification----- 
Recieved integer: 10 
Received StringBuilder: Stringbuilder 

---- New refernces With Modification----- 
Recieved StringBuilder: Stringbuilder, I am modified in a method() through a reference 
Recieved integer: 11 

----Received parameter variables current values----- 
StringBuilder: Stringbuilder, I am modified in a method() through a reference 
Integer: 10 

---------Back in Main-------- 
----Values returned---- 
11 
Stringbuilder, I am modified in a method() through a reference 

----Variables in Main----- 
10 
Stringbuilder, I am modified in a method() through a reference 
NOTE: even local Object(except primitive) reference reflect changes 

-----Let's use immutable objects----- 
Value in main before method call: I am a string 

-----In passpassingImmutable() ------ 
---------without modification------ 
Recieved string with local ref: I am a string 

------With modification------- 
Recieved string with local ref: I am a string I am modified 

----Let's see the parameter value content--- 
Recieved string with param ref: I am a string 

--------------Back in main---------- 
String Value retuned: I am a string 

String passed(main reference) value: I am a string 
+0

你有沒有搜索這個解釋? –

+0

Java是通過價值傳遞的。對象值是引用。 –

+1

目前還不清楚爲什麼你會「不想問」這個問題 - 只是爲了對答案有信心才能更好? –

回答

1

Java的經過值的參考,這賦予了它以參考文獻的通儘管值實際上是通的感覺。

public class Main{ 

    public static void main(String[] args) { 
     Vector3d vectorTest=new Vector3d(1,2,3); 
     System.out.println(vectorTest.x); //prints 1 
     affectVector(vectorTest); 
     System.out.println(vectorTest.x); //prints 100 
     replaceVector(vectorTest); 
     System.out.println(vectorTest.x); //still prints 100 
    } 

    public static void affectVector(Vector3d vectorIn){ 
     vectorIn.x=100; 
    } 

    public static void replaceVector(Vector3d vectorIn){ 
     //this method has no external effect because the reference vectorIn is immediately overrwritten 
     vectorIn=new Vector3d(0,0,0); //the reference vectorIn is completely changed 
    } 


} 

你可以看到,由於基準是按值傳遞你仍然可以訪問該對象,它指的是,但如果你更換參考,那麼你是「闖民宅」一個不同的對象,並且具有外不起作用方法。

我試圖描述這個時使用的類比是郵政地址。參考是您用來向對象發送字母(指令)的郵政地址。您可以將該地址複製到多張紙上,但它仍然會將信件發送給同一個房屋。這是複製的郵政地址,而不是'房子'