Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java pass by reference

What is the difference between this 2 codes:

Code A:

Foo myFoo;
myFoo = createfoo();

where

public Foo createFoo()
{
   Foo foo = new Foo();
   return foo;
}

Vs. Code B:

Foo myFoo;
createFoo(myFoo);

public void createFoo(Foo foo)
{
   Foo f = new Foo();
   foo = f;
}

Are there any differences between these 2 pieces of codes?

like image 790
delita Avatar asked Feb 22 '12 23:02

delita


People also ask

Can you pass by reference in Java?

Java is always Pass by Value and not pass by reference, we can prove it with a simple example. Let's say we have a class Balloon like below.

What does pass by reference mean Java?

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. “Passing by value” refers to passing a copy of the value. “Passing by reference” refers to passing the real reference of the variable in memory.

Is Java a pass by value or reference?

Java is officially always pass-by-value. The question is, then, “what is passed by value?” As we have said in class, the actual “value” of any variable on the stack is the actual value for primitive types (int, float, double, etc) or the reference for reference types.

How do you pass by reference method in Java?

In order to pass the reference, we pass the object of the class in the place of the actual parameter and the formal parameter of a class object type has the same reference to each other that's why with the help of the formal parameter object of class any changes will be reflected in both objects formal and actual ...


4 Answers

Java always passes arguments by value NOT by reference.


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 modify the object that the reference variable "f" 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 182
Eng.Fouad Avatar answered Sep 24 '22 06:09

Eng.Fouad


Since Java is strictly "pass by value" and even references to objects are passed by value the second code will not work as expected. See the "Related" section to the right for numerous discussions on this.

like image 42
A.H. Avatar answered Sep 22 '22 06:09

A.H.


Think of method parameters as their own variable declarations. If you were to substitute the method call with a single block of code, it looks like this:

Foo myFoo;
{                      //Method call starts here
    Foo foo;
    foo = myFoo;
    Foo f = new Foo();
    foo = f;
}                      //Method call ends here

Even if the method parameter has the same name as another variable, the method parameter is still it's own, unique reference that only the method knows about. That's the same thing that Eng.Fouad says above.

like image 21
Mutant Platypus Avatar answered Sep 25 '22 06:09

Mutant Platypus


Another important point which you should know is the object type which you pass into the method. whether it is a mutable object or a immutable object. If you pass a immutable object such as String it will create a another copy and do the modification. Changes are not reflected to your original copy.

like image 29
Eshan Sudharaka Avatar answered Sep 21 '22 06:09

Eshan Sudharaka