2013-09-23 1 views
-3

Является ли java для передачи по значению или передается по ссылке. Мой вопрос заставил меня написать это class, чтобы я мог с уверенностью ответить. Как мне было интересно, я заметил, что может возникнуть проблема с объектами immutable и mutable. то, что я спрашиваю, является правильным ответом после просмотра этого простого 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

у вас есть googled вокруг для объяснений на этом? –

+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 
    } 


} 

Вы можете видеть, что так как ссылка передается по значению вы можете получить доступ к объекту, что он относится к, но если заменить ссылки, то вы «Отсносящийся» на другой объект, и что не имеет никакого влияния за пределами метод.

Аналогия, которую я использую при попытке описать это, - это почтовые адреса. Ссылка - это почтовый адрес, который вы используете для отправки писем (инструкций) на объекты. Вы можете скопировать этот адрес на многие листы бумаги, но он все равно отправляет письма в тот же дом. Это почтовый адрес, который скопирован, а не «дом»

 Смежные вопросы

  • Нет связанных вопросов^_^