In the below code, I have created 3 instances of the Movie class. I have assigned some data to the three objects. Secondly, I have created a second reference to the object movie1(movie4). I have also assigned values to attributes of movie4.
I printed the new attributes of movie 1 but the contents have not been altered. Why does this happen? What is the exact reason? I know other ways of updating content but I want to know why the second referencing does'nt work.
The content is movie1 is still the same. Why ?
class Driver{
public static void main(String[] args){
Movie movie1 = new Movie("The Shawshank Redemption", 1994, 9.3);
Movie movie2 = new Movie("The Godfather", 1972, 9.2);
Movie movie3 = new Movie("The Dark Knight", 2008, 9.0);
**Movie movie4 = movie1;
movie4 = new Movie("The Return of the King", 2003, 8.9);**
movie4.name = "The Return of the King";
movie4.year_of_release = 2003;
movie4.rating = 8.9;
System.out.println("\n*********New Movie 1 Details*************\n");
movie1.printDetails();
}
}
This made movie4
point to movie1
:
Movie movie4 = movie1;
but, then you immediately updated movie4
to point to a different object:
movie4 = new Movie("The Return of the King", 2003, 8.9);
So at that point, movie1
and movie4
are no longer pointing to the same Movie
, so changes you make via movie4
don't affect the object movie1
points to.
If you had changed the object without replacing movie4
:
Movie movie4 = movie1;
movie4.name = "The Return of the King";
...then you would have seen that change to the object whether you looked at movie1.name
or movie4.name
.
A bit more detail:
After you did this:
Movie movie1 = new Movie("The Shawshank Redemption", 1994, 9.3);
Movie movie2 = new Movie("The Godfather", 1972, 9.2);
Movie movie3 = new Movie("The Dark Knight", 2008, 9.0);
...you had something like this in memory (omitting a lot of details):
+−−−−−−−−−−−−−−−−−−−−−−−−−−+ movie1:Ref4516−−−−−−−>| (Movie) | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ | name: "The Shawshank..." | | ... | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−+ movie2:Ref8469−−−−−−−>| (Movie) | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ | name: "The Godfather" | | ... | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−+ movie3:Ref4789−−−−−−−>| (Movie) | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ | name: "The Dark Knight" | | ... | +−−−−−−−−−−−−−−−−−−−−−−−−−−+
Then you did this:
Movie movie4 = movie1;
...making movie4
and movie1
point to the same movie:
movie1:Ref4516−−−+ | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ +−−−>| (Movie) | | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ movie4:Ref4516−−−+ | name: "The Shawshank..." | | ... | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−+ movie2:Ref8469−−−−−−−>| (Movie) | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ | name: "The Godfather" | | ... | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−+ movie3:Ref4789−−−−−−−>| (Movie) | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ | name: "The Dark Knight" | | ... | +−−−−−−−−−−−−−−−−−−−−−−−−−−+
So far, so good, but then you did:
movie4 = new Movie("The Return of the King", /*...*/);
...which made movie4
point to a new object:
+−−−−−−−−−−−−−−−−−−−−−−−−−−+ movie1:Ref4516−−−−−−−>| (Movie) | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ | name: "The Shawshank..." | | ... | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−+ movie2:Ref8469−−−−−−−>| (Movie) | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ | name: "The Godfather" | | ... | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−+ movie3:Ref4789−−−−−−−>| (Movie) | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ | name: "The Dark Knight" | | ... | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−+ movie4:Ref9546−−−−−−−>| (Movie) | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ | name: "The Return of..." | | ... | +−−−−−−−−−−−−−−−−−−−−−−−−−−+
So assigning to movie4.name
just changes that new object, not the one that movie1
points to.
If you didn't do that movie4 = new Movie(/*...*/)
bit, so movie1
and movie4
still pointed at the same object
movie1:Ref4516−−−+ | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ +−−−>| (Movie) | | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ movie4:Ref4516−−−+ | name: "The Shawshank..." | | ... | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−+ movie2:Ref8469−−−−−−−>| (Movie) | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ | name: "The Godfather" | | ... | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−+ movie3:Ref4789−−−−−−−>| (Movie) | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ | name: "The Dark Knight" | | ... | +−−−−−−−−−−−−−−−−−−−−−−−−−−+
...then assigning to movie4.name
would change the object that both movie4
and movie1
are pointing at:
movie4.name = "The Return of the King";
movie1:Ref4516−−−+ | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ +−−−>| (Movie) | | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ movie4:Ref4516−−−+ | name: "The Return of..." | | ... | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−+ movie2:Ref8469−−−−−−−>| (Movie) | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ | name: "The Godfather" | | ... | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−+ movie3:Ref4789−−−−−−−>| (Movie) | +−−−−−−−−−−−−−−−−−−−−−−−−−−+ | name: "The Dark Knight" | | ... | +−−−−−−−−−−−−−−−−−−−−−−−−−−+