Java, is this a Deep copy?
deep-copy, java
Solution
First, lets review the differences between a deep and a shallow copy.
A shallow copy points to the same references as the source. So if make a copy of instance `A` named `B` any changes to fields containing objects in `B` will modify these fields in `A` since they are pointing to the same reference.
A deep copy has independent fields/references, it does not point to the source's references. A change to a field/property on the copy will not impact the source's fields/properties.
In your case, I believe you have made a shallow copy since your assigning the reference of sprite field from the source to the copy's sprite field.
To illustrate this, I have modified the `Tile` classes source to expose the `Image` and have mocked an `Image` class.
Modifications for Proof of Concept
class Tile{
/* Rest of Class*/
//Additions
public Image getSprite() {
return sprite;
}
public void setSprite(Image sprite) {
this.sprite = sprite;
}
}
//Mock
class Image{
public String name;
public Image(String name){
this.name = name;
}
}
Proof of Concept
public static void main(String[] args) {
List<Tile> tileList = new ArrayList<Tile>();
Tile masterGrassTile = new Tile(new Image("grass.png"), 0,0);
Tile copyTile = new Tile(masterGrassTile);
copyTile.getSprite().name = "water.png";
System.out.println(masterGrassTile.getSprite().name); //Prints water.png
}
Notice how changing the copied instance's sprite property affects the original instances sprite property.
Problem
I cant seem to get a clear precise answer by reading any of the similar questions, I'm trying to deep Clone an object in Java using a copy constructor is this a deep copy: ``` public class Tile{ Image sprite = null; int x = 0; int y = 0; public Tile(Image setImage, int sX, int sY){ this.sprite = setImage; this.x = sX; this.y = sY; } public Tile(Tile copyTile){ this.sprite = copyTile.sprite; this.x = copyTile.x; this.y = copyTile.y; } public void setNewLocation(int sX, int sY){ this.x = sX; this.y = sY; } } ``` Then when I create my tile map I could do something like this ``` List<Tile> tileList = new List<Tile>(); Tile masterGrassTile = new Tile(grassImage, 0,0); tileList.set(0,new Tile(masterGrassTile)); tileList.set(1,new Tile(masterGrassTile)); tileList.get(0).setNewLocation(0,32); tileList.get(1).setNewLocation(0,64); ``` If i were to render both tiles at their respective locations would that work? or was the assignment tileList.get(1).setNewLocation(0,64); effecting like a reference and all of them have the same location as the last assignment.