Wednesday 7 November 2018

java - Immutable and pass by value




I have the following code which has
a mutable Person class, String and a method to modify the instances of String and Person



    class Person{

int a = 8;

public int getA() {
return a;
}


public void setA(int a) {
this.a = a;
}

@Override
public String toString() {
return "Person [a=" + a + "]";
}

}



--



public class TestMutable {
public static void main(String[] args)
{
Person p = new Person();
p.setA(34);



String s = "bar";

modifyObject(s, p); //Call to modify objects

System.out.println(s);
System.out.println(p);

}




private static void modifyObject(String str, Person p)
{

str = "foo";
p.setA(45);

}


}


The output is as expected. It prints



           bar
Person [a=45]


Now, my question is




What is happening at the place you say str="foo" ?



Initially let's assume that s='bar' and the data resides in 0x100 memory



Now the reference of string is passed to another method, the other method tries to change the contents of the memory location(0x100) to 'foo' using s="foo". Is this what is happening, or is 'foo' is created in differennt memory location ?



Does java pass references by value ?


Answer



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 change 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 :)



No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...