Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is Java really passing objects by value? [duplicate]

Possible Duplicate: Is Java pass by reference?

public class myClass{     public static void main(String[] args){         myObject obj = new myObject("myName");         changeName(obj);         System.out.print(obj.getName()); // This prints "anotherName"     }     public static void changeName(myObject obj){         obj.setName("anotherName");     } } 

I know that Java pass by value, but why does it pass obj by reference in previous example and change it?

like image 642
MBZ Avatar asked Oct 25 '11 17:10

MBZ


People also ask

Does Java pass objects by value?

Java always passes parameter variables by value. Object variables in Java always point to the real object in the memory heap. A mutable object's value can be changed when it is passed to a method. An immutable object's value cannot be changed, even if it is passed a new value.

Does pass by value make a copy?

pass-by-value makes a shallow-copy of the object. On the other side, pass-by-reference does not make any copy, it gets the reference of the object itself by just renaming it, so no any copying operation.

Are objects always passed by reference Java?

Java is always Pass by Value and not pass by reference, we can prove it with a simple example.

Does Java uses call by value or reference?

Java uses only call by value while passing reference variables as well. It creates a copy of references and passes them as valuable to the methods. As reference points to same address of object, creating a copy of reference is of no harm. But if new object is assigned to reference it will not be reflected.


2 Answers

Java always passes arguments by value, NOT by reference. In your example, you are still passing obj by its value, not the reference itself. Inside your method changeName, you are assigning another (local) reference, obj, to the same object you passed it as an argument. Once you modify that reference, you are modifying the original reference, obj, which is passed as an argument.


EDIT:

Let me explain this through an example:

public class Main {      public static void main(String[] args)      {           Foo f = new Foo("f");           changeReference(f); // It won't change the reference!           modifyReference(f); // It will change the object that the reference refers to!      }      public static void changeReference(Foo a)      {           Foo b = new Foo("b");           a = b;      }      public static void modifyReference(Foo c)      {           c.setAttribute("c");      } } 

I will explain this in steps:

1- Declaring a reference named f of type Foo and assign it to a new object of type Foo with an attribute "f".

Foo f = new Foo("f"); 

Enter image description here

2- From the method side, a reference of type Foo with a name a is declared and it's initially assigned to null.

public static void changeReference(Foo a) 

Enter image description here

3- As you call the method changeReference, the reference a will be assigned to the object which is passed as an argument.

changeReference(f); 

Enter image description here

4- Declaring a reference named b of type Foo and assign it to a new object of type Foo with an attribute "b".

Foo b = new Foo("b"); 

Enter image description here

5- a = b is re-assigning the reference a NOT f to the object whose its attribute is "b".

Enter image description here


6- As you call modifyReference(Foo c) method, a reference c is created and assigned to the object with attribute "f".

Enter image description here

7- c.setAttribute("c"); will change the attribute of the object that reference c points to it, and it's same object that reference f points to it.

Enter image description here

I hope you understand now how passing objects as arguments works in Java :)

like image 156
Eng.Fouad Avatar answered Sep 20 '22 06:09

Eng.Fouad


In Java, an object handle, or the identity of an object is considered a value. Passing by value means passing this handle, not a full copy of the object.

A "reference" in the term "pass by reference" also doesn't mean "reference to an object". It means "reference to a variable" – a named "bucket" in a function definition (or, rather, a call frame) that can store a value.

Passing by reference would mean the called method could change variable values in the calling method. (For example, in the C standard library, the function scanf works this way.) This isn't possible in Java. You can always change the properties of an object – they aren't considered a part of its "value". They're completely different independent objects.

like image 34
millimoose Avatar answered Sep 20 '22 06:09

millimoose